jqGrid的autoencode参数设置为true在客户端可能引发的编码问题
不久前使用jqGrid+MVC做过一段时间开发。
一开始,分页参数几乎都是默认值,jqGrid的分页功能很好用。
考虑到each input is evil,我们的系统对安全性又有较高要求,所以,为了保证输入和输出都比较可靠,找了一下网上的资料,发现autoencode参数能满足需求。
By the way,参考了很多关于jqGrid使用的中文参考文章,大部分都只说是对url进行编码,讲的很不明确,后面还会对我排查问题造成不小的干扰。
除了分页之外,我们还需要在列表的最后一列加上操作列,实现诸如常见的更新、删除等操作。然后就发现了问题:在操作列发现了乱码。
比如有一个分页列表,最后一个操作列加上“编辑”和“删除”链接,按照jqGrid的常用做法,我们是在gridComplete回调函数中通过简单拼接字符串实现编辑和删除效果的,示例代码大致如下:
gridComplete: function () {
var ids = jQuery("#yourGridtable").jqGrid('getDataIDs');
for (var i = 0; i < ids.length; i++) {
var itemID = ids[i];
var strUpdate = "<a href='javascript:;' class='update' name='btnEdit' id='btnEdit_" + itemID + "'>修改</a> | ";
var strDel = "<a href='javascript:;' class='del' name='btnDelete' id='btnDelete_" + itemID + "'>删除</a>";
$("#yourGridtable").jqGrid('setRowData', ids[i], { UserAction: strUpdate + strDel });
}
setTimeout(function () {
//todo 设置编辑效果
//todo 设置删除效果
}, 200);
}
gridComplete
可是,拼接后的字符串在页面中显示是html编码后的效果,根本没有出现“修改”和“删除”链接。
出现该问题的第一反应是字符串没拼接正确,检查后发现不是这个原因。
然后,我在参考了一堆资料排查了n个参数未果之后,最后跟进jqGrid的源代码里才发现是autoencode这个参数设置为true造成的。
参考官方wiki,发现autoencode这个参数的说明如下:
When set to true encodes (html encode) the incoming (from server) and posted data (from editing modules). For example < will be converted to <.
翻译过来,就是:当该参数设置为true,对客户端请求和服务端返回数据都进行html编码,比如<被编码成<
html编码的原理也很简单,也就是几个特殊符号的转义而已,贴一下jqGrid的html编码实现源代码:
htmlEncode : function (value){
return !value ? value : String(value).replace(/&/g, "&").replace(/\"/g, """).replace(/</g, "<").replace(/>/g, ">");
}
所以我怀疑出现乱码的原因就是,gridComplete回调函数触发执行的时候,内部逻辑间接调用了jqGrid的html编码函数htmlEncode(动态添加行数据addRowData函数内部可能调用了html编码逻辑)。
把autoencode参数设置为false,果然正常。
本来懒得再码关于前端的文字的,可是在这个小问题上花了较长时间感觉很不值得,只能自我安慰贴一下算是经验值的提升吧。
参考:
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:change#jqgrid_3.5.2_changes_and_fixes
jqGrid的autoencode参数设置为true在客户端可能引发的编码问题的更多相关文章
- 连接数据库超时设置autoReconnect=true
1,问题现象: com.mysql.jdbc.CommunicationsException: The last packet successfully received from the serve ...
- 线程池ThreadPoolExecutor参数设置
线程池ThreadPoolExecutor参数设置 JDK1.5中引入了强大的concurrent包,其中最常用的莫过了线程池的实现ThreadPoolExecutor,它给我们带来了极大的方便,但同 ...
- in_array 的第三个参数strict设置为 true
var_dump(in_array(0, array('s' )); 这句话的结果是bool(true). 因为in_array会将0 和's' 进行比较,0是number类型,'s'是string类 ...
- 如何把in_array 的第三个参数strict设置为 true
var_dump(in_array(0, array('s' )); 这句话的结果是bool(true). 因为in_array会将0 和's' 进行比较,0是number类型,'s'是string类 ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置
前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...
- Hibernate 参数设置一览表
Hibernate 参数设置一览表 属性名 用途 hibernate.dialect 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 fu ...
- 使用MEF实现通用参数设置
通用后台管理系统必备功能模块包含日志管理,权限管理,数据字典,参数配置等功能.参数设置主要用于设置系统运行所需的一些基础性配置项,比如redis缓存,mq消息队列,系统版本等信息.好的参数设置需要达到 ...
- tomcat安装服务和内存参数设置
第一:安装服务 在dos窗口进入到tomcat的bin目录下,通过如下命令即可将tomcat安装成服务 service.bat install Tomcat2 其中Tomcat2是服务的名称 如果启动 ...
- HttpClient_使用httpclient必须知道的参数设置及代码写法、存在的风险
结论: 如果使用httpclient 3.1并发量比较大的项目,最好升级到httpclient4.2.3上,保证并发量大时能抗住.httpclient 4.3.3,目前还有一些bug:还是用4.2.x ...
随机推荐
- react native AsyncStorage的使用
如果现在有一个需求,是要把用户的账号密码保存到本地,大家会怎么做的呢?如果在android中,我相信一大部分人会想到SharedPreferences,这是一个以键值对的形式进行存储的.那如果在rea ...
- Map排序
HashMap: 最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度.HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 ...
- Backbone,Marionette,Talent学习笔记
具体以源码为准 Talent继承自Marionette继承自BackBone Region: 继承自Backbone.Event,show(view)会调用view.render(),然后$el.ap ...
- linux I/O stack cache 强制刷新
linux 存储子系统作为最为复杂的子系统之一,拥有很深的模块栈(如图),其中很多模块又有自己的缓存功能(如下图).实际应用中,用户下发的数据停留在哪个缓存中,是否已经写入磁盘,这些操作对用户来说是个 ...
- TDD测试驱动开发
TDD测试驱动开发 一.概念 TDD故名思意就是用测试的方法驱动开发,简单说就是先写测试代码,再写开发代码.传统的方式是先写代码,再测试,它的开发方式与之正好相反. TDD是极限编程的一个最重要的设计 ...
- [Protobuf] Mac系统下安装配置及简单使用
Mac下Protobuf安装 Protobuf源码Github地址: https://github.com/google/protobuf 配置环境教程: https://github.com/goo ...
- jmobile学习之路 ----设备检测
用一个库,device.js.这是一种最简单的方法.device.js库,不依赖jQuery框架. <!doctype html> <html lang="en" ...
- AppDomain 详解(转)
AppDomain是CLR的运行单元,它可以加载Assembly.创建对象以及执行程序. AppDomain是CLR实现代码隔离的基本机制. 每一个AppDomain可以单独运行.停止:每个AppDo ...
- Django动态渲染多层菜单
为后续给菜单设置权限管理方便,通过给页面模版菜单动态渲染,通过数据菜单表进行匹配需要渲染的菜单 #Django表结构 class Menus(models.Model): name = models. ...
- Linux下Nano命令使用指南
1.什么时候用nano? 一般网络很卡,ssh时一用vim/vi 就死窗口,或者死机的情况 2.如何使用? 打开或新建文件 #nano 文件名 禁用自动换行 #nano -w /etc/fs ...