最近做了一个暂存功能,需要无刷新的表单提交,然后我用ajax的表单提交。在使用ajax提交form值的时候,需要使用serialize()去获取form的值。但是在这样获取过程中,中文就会产生乱码。serialize() 方法通过序列化表单值,创建 URL 编码文本字符串。可以选择一个或多个表单元素(比如 input 及/或 文本框),或者 form 元素本身。序列化的值可在生成 AJAX 请求时用于 URL 查询字符串中。由于做的这个form表单要提交的内容比较多,所以用前段编码,后台解码的方式。
前段代码
encodeURI(encodeURI(data)) ///注意两次编码!!
后台代码
response.setCharacterEncoding("UTF-8"); //response.setContentType("text/html;charset=UTF-8"); //用于向页面输送中文字符串 java.net.URLDecoder.decode((String)request.getParameter("username"),"UTF-8");
不适用这么做要累死人。
那么就从重写jquery编码的方式考虑。
function doSubmit(){
$.ajax({
type: "POST",
url:"XXX.do",
data:$('#form').serialize(),
error: function(request) {
alert("发送请求失败!");
},
success: function(data) {
}
});
}
重写jquery编码的方法
jQuery.param=function( a ) {
var s = [ ];
var encode=function(str){
str=escape(str);
str=str.replace(/%20/g,"%u002B");
return str;
};
function add( key, value ){
s[ s.length ] = encode(key) + '=' + encode(value);
};
// If an array was passed in, assume that it is an array
// of form elements
if ( jQuery.isArray(a) || a.jquery )
// Serialize the form elements
jQuery.each( a, function(){
add( this.name, this.value );
});
// Otherwise, assume that it's an object of key/value pairs
else
// Serialize the key/values
for ( var j in a )
// If the value is an array then the key names need to be repeated
if ( jQuery.isArray(a[j]) )
jQuery.each( a[j], function(){
add( j, this );
});
else
add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
// Return the resulting serialization
return s.join("&").replace(/%20/g, "+");
}
也可以把上段代码封装个js方便调用