今天试了一下jquery1.4,我用的版本是jquery-1.4.2.js,在进行ajax传输时发现老是出现乱码,郁闷了好久,网上搜了一下,才知道原来是jquery-1.4中jQuery.param() 方法有一些变化:
参考 http://www.hackhome.com/InfoView/Article_208618_2.html
之前对于{foo: ["bar", "baz"]}序列化后的结果是“foo=bar&foo=baz”,而现在是“foo[]=bar&foo[]=baz”。
见源码5405行-5433行
function buildParams( prefix, obj ) {
if ( jQuery.isArray(obj) ) {
// Serialize array item.
jQuery.each( obj, function( i, v ) {
if ( traditional || /\[\]$/.test( prefix ) ) {
// Treat each array item as a scalar.
add( prefix, v );
} else {
// If array item is non-scalar (array or object), encode its
// numeric index to resolve deserialization ambiguity issues.
// Note that rack (as of 1.0.0) can't currently deserialize
// nested arrays properly, and attempting to do so may cause
// a server error. Possible fixes are to modify rack's
// deserialization algorithm or to provide an option or flag
// to force array serialization to be shallow.
buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v );
}
});
} else if ( !traditional && obj != null && typeof obj === "object" ) {
// Serialize object item.
jQuery.each( obj, function( k, v ) {
buildParams( prefix + "[" + k + "]", v );
});
} else {
// Serialize scalar item.
add( prefix, obj );
}
}
这下就知道为什么出现乱码了,因为在jquery源码中jQuery.param()方法是会进行字符编码的,在源码5436行:
function add( key, value ) {
// If value is a function, invoke it and return its value
value = jQuery.isFunction(value) ? value() : value;
s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
}
这里的中括号“[”,“]”就变成了“%5B”,“%5D”。
解决的方法有两个
一、既然是编码不对,那就干脆不让他编码,索性把源码中的5439行
s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
改为
s[ s.length ] = key + "=" + encodeURIComponent(value);
二、前面方法能解决这个问题,不过修改了jquery源码,可能会有不良影响,那我们还可以在后台使用过滤器进行字符编码处理,这样就ok了。
一点拙见,高手见笑了
分享到:
相关推荐
3. **AJAX 参数序列化**:在 jQuery 1.4 中,`jQuery.param()` 方法现在支持嵌套参数的序列化,采用了类似于 PHP 和 Ruby on Rails 的方式。例如 `{foo: ["bar", "baz"]}` 会被序列化为 `"foo[]=bar&foo[]=baz"`,而...
如果出于某种原因需要使用旧的序列化方式,则可以通过设置jQuery.ajaxSettings.traditional为true,或者在调用$.ajax时,将traditional参数设置为true,或者使用jQuery.param函数并传递true作为第二个参数。...
创建适用于URL查询字符串或Ajax请求的数组,普通对象或jQuery对象的序列化表示形式。 如果jQuery对象被传递,它应该包含具有name / value属性的输入元素。 jQuery.param( obj ): obj: 类型:Array或PlainObject或...
`getJSON()`用于获取JSON格式的数据,`$.param()`用于序列化表单数据。 四、插件生态 jQuery拥有丰富的插件生态系统,如用于轮播图的jCarousel, 图表绘制的Flot, 表格分页的Datatables等。这些插件大大扩展了...
其次,`jquery.param.js`是jQuery的一个扩展,用于序列化和反序列化对象为URL查询字符串。在跨域请求中,特别是GET请求,我们需要将数据附加到URL上,这时`jquery.param()`方法就非常有用。它可以将JavaScript对象...
我们可以使用`jQuery.param()`将其序列化: ```javascript var serializedData = jQuery.param(data); ``` 这将生成以下字符串: ```text name=John%20Doe&age=30&hobbies[0]=阅读&hobbies[1]=编程&details...
`jquery-param-fn.zip`这个压缩包可能包含了一个与jQuery相关的函数,用于处理参数序列化,这在进行Ajax请求时特别有用。在前端与服务器进行异步数据交换时,通常需要将对象或数组转换为URL查询字符串格式,`jQuery....
jQuery1.5之后,$.param()函数改进了数据序列化,能更有效地处理复杂的数据结构,如对象和数组。同时,$.parseJSON()用于将JSON字符串转换为JavaScript对象,这在处理服务器返回的数据时非常有用。 ```javascript ...
`jquery.params.js` 文件是 jQuery 库的一个组成部分,主要用于处理参数序列化,特别是在 AJAX 请求中。...通过理解和使用 `jQuery.param()` 函数,开发者可以更加高效地处理AJAX请求中的数据序列化问题。
// 序列化表单数据 $.ajax({ url: this.action, type: this.method, data: formData, success: function(response) { // 处理服务器响应 }, error: function(xhr, status, error) { // 处理错误 } }); }...
8. **数据序列化**: jQuery也提供了`$.param()`函数,用于将JavaScript对象序列化为URL查询字符串,这对于发送复杂的数据结构非常有用。 9. **Promise兼容性**: jQuery AJAX方法返回Promise对象,这意味着你可以...
- 如果返回的数据是JSON格式,使用`@ResponseBody`时,Spring MVC默认使用`MappingJackson2HttpMessageConverter`进行序列化。如果需要其他格式,如XML,可能需要添加对应的转换器。 - 防止XSS和CSRF攻击,对敏感...
这里,`$.param(data)` 将根据`jquery-param-fn`的规则来序列化`data`对象,而非使用jQuery默认的方法。如果需要自定义序列化行为,你可以传递一个额外的函数作为参数: ```javascript $.param.fn = function(value...
在服务器端,你可以使用JavaScriptSerializer或DataContractJsonSerializer进行序列化,而在客户端,jQuery会自动处理JSON响应。 ```csharp // 服务器端序列化对象集合 var serializedObjects = JsonConvert....
jQuery提供$.param()方法将JavaScript对象序列化为URL查询字符串,以及$.parseJSON()(现在已废弃,推荐使用JSON.parse())将JSON字符串解析为JavaScript对象。 **6. 响应状态和回调函数** 在$.ajax()中,可以定义...
- **$.param()**:序列化表单数据为URL查询字符串。 - **$.proxy()**:创建一个函数,其上下文(this)被设置为指定的对象。 **3. jQuery 1.8.2 的改进与变化:** - **$.support**:添加了一些新的浏览器特性检测。...
10. **数据序列化**:jQuery能自动处理表单数据的序列化,方便传递到服务器。例如,`$(form).serialize()`可以获取表单数据的URL编码字符串。 11. **$.param()**:用于将JavaScript对象转换为URL查询字符串,适用于...