我的jQuery.param函数有问题。 jQuery使用+而不是%20来对空格进行URL编码
var obje = {
'test': 'tester 2'
}
console.log($.param(obje));
返回“test = tester + 2”
所以我考虑重写这个核心功能:
(function($){
$.fn.param = function( a, traditional ) {
console.log('custom $.param');
var s = [],
add = function( 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 );
};
// Set traditional to true for jQuery <= 1.3.2 behavior.
if ( traditional === undefined ) {
traditional = jQuery.ajaxSettings.traditional;
}
// If an array was passed in, assume that it is an array of form elements.
if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
// Serialize the form elements
jQuery.each( a, function() {
add( this.name, this.value );
} );
} else {
// If traditional, encode the "old" way (the way 1.3.2 or older
// did it), otherwise encode params recursively.
for ( var prefix in a ) {
buildParams( prefix, a[ prefix ], traditional, add );
}
}
return s.join("&");
// Return the resulting serialization
//return s.join( "&" ).replace( r20, "+" );
};
})(jQuery);
var obje = {
'test': 'tester 2'
}
console.log($.param(obje));
但是失败了.. $ .param没有被覆盖。
知道什么是错的吗?
谢谢!
编辑:我的解决方案(因为我是新用户,我显然可能无法在8小时内回答我自己的问题(为什么会这样?)
使用ThiefMaster的解决方案,我仍然遇到buildParams未定义的问题。 我通过调用旧函数然后将+替换回%20
来解决这个问题// modification of the jQuery.param function: spaces are encoded by jQuery.param with + instead of %20. replace these back to %20
(function($, oldFunction){
$.param = function( a, traditional ) {
var s = oldFunction.apply(oldFunction,[a,traditional]);
// Return the resulting serialization
return s.replace( '+', '%20' );
};
})(jQuery,jQuery.param);
答案 0 :(得分:3)
您需要使用$.param
而不是$.fn.param
(这是调用jQuery对象的函数,例如$(...).param()
)。
答案 1 :(得分:2)
老帖我知道,但为了记录知识。要在使用$ .param()时替换留下的“+”,请考虑执行以下操作:
(使用您提供的代码)
var obje = {
'test': 'tester 2'
}
console.log($.param(obje).replace(/\+/g, "%20"));
这将导致: test = tester 2
希望这有助于某人。
答案 2 :(得分:0)
“重新替换”修复也可以通过在ajax设置对象中使用“beforeSend”来实现:
{ beforeSend: function (request, settings) { settings.data = settings.data.replace(/\+/g, "%20"); } }
这种方法适用于您实际上并不想改变$ .param()的原始行为的情况(例如,如果您想要URL中的“+”但POST数据需要“%20”)。< / p>
[编辑,因为我记得string.replace()只会匹配一次,除非它是带有g标志的正则表达式对象。]