论坛首页 Web前端技术论坛

jquery1.4使用ajax方法时需要注意:序列化方法jQuery.param() 的变化

浏览 5406 次
精华帖 (0) :: 良好帖 (8) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-25   最后修改:2010-05-25

今天试了一下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了。

 

一点拙见,高手见笑了

 

 

   发表时间:2010-05-29  
晕,这么点小问题也值得改源代码!!!
0 请登录后投票
   发表时间:2011-03-27  
改后台实际点吧……以你的例子来说,既然foo传的是数组
那么后台就获取foo[](以前是获取foo)

个人感觉1.4对这一点的改动是蛮有意义的,虽然刚开始有点不习惯
0 请登录后投票
   发表时间:2011-03-27  
foo是个数组时,建议前台转换成一个字符串,用分割符隔开,服务端,获得参数后再拆成数组。这样一是避免了数组式的传参,降低url复杂度,二是减少了url的长度,foo=1|2|3总比foo[]=1&foo[]=2&foo[]=3短的多。
0 请登录后投票
   发表时间:2011-03-27  
使用这个就可以

$.ajaxSetup({
    traditional: true
});
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics