переопределение функции jquery.param

#javascript #jquery

#javascript #jquery

Вопрос:

У меня проблема с функцией jQuery.param. jQuery использует вместо для кодирования пробелов в 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 amp;amp; !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("amp;");
            // Return the resulting serialization
            //return s.join( "amp;" ).replace( r20, " " );
        };
    })(jQuery);
var obje = {
    'test': 'tester 2'
}
console.log($.param(obje));
  

Однако это не удается.. Значение $.param не переопределяется.

Есть идеи, что может быть не так?

Спасибо!

Редактировать: мое решение (поскольку я новый пользователь, я, по-видимому, могу не ответить на свой собственный вопрос через 8 часов (почему это?))

С решением ThiefMaster у меня все еще была проблема с тем, что buildParams не определен. Я решил это, вызвав старую функцию, а затем заменив обратно на

 // modification of the jQuery.param function: spaces are encoded by jQuery.param with   instead of  . replace these back to  
(function($, oldFunction){
    $.param = function( a, traditional ) {
        var s = oldFunction.apply(oldFunction,[a,traditional]);
        // Return the resulting serialization
        return s.replace( ' ', ' ' );
    };
})(jQuery,jQuery.param);
  

Комментарии:

1. Если вам действительно это нужно, лучше создайте оболочку, которая использует исходную функцию, а затем заменит ‘ ‘ на ‘ ‘ вместо копирования и вставки огромной функции для незначительного изменения.

2. Я использую функцию $.param косвенно, работая с jQuery AJAX. Я не могу снова заменить на перед отправкой XHR. Однако я действительно мог бы переопределить ее, применив старую функцию, а затем заменив на

3. Спасибо за обновление решения, которое сработало для вас. Это работает! Теперь просто надеюсь, что это не будет конфликтовать с чем-то другим.

4. Я не согласен, что вы должны заменить на , потому что там может быть символ , который не предназначен для использования в качестве пробела в значениях. Это небезопасное решение. Перезапись метода намного безопаснее.

Ответ №1:

Вам нужно использовать $.param вместо $.fn.param (которая была бы функцией для вызова объекта jQuery, например $(...).param() ).

Ответ №2:

Старый пост, который я знаю, но ради записанных знаний. Чтобы заменить ‘ ‘, оставленный при использовании $.param(), рассмотрите возможность выполнения следующего:

(Используя предоставленный вами код)

 var obje = {
'test': 'tester 2'
}
console.log($.param(obje).replace(/ /g, " "));
  

Это приведет к:
тест = tester 2

Надеюсь, это кому-то поможет.

Ответ №3:

Исправление «повторной замены» также может быть реализовано с помощью «beforeSend» в объекте настроек ajax:

 { beforeSend: function (request, settings) { settings.data = settings.data.replace(/ /g, " "); } }
  

Этот подход подходит для случаев, когда вы на самом деле не хотите изменять исходное поведение $.param () (например, если вы хотите » » в URL-адресах, но «% 20» для данных POST).

[Отредактировано, потому что я вспомнил, что string.replace() будет соответствовать только один раз, если это не объект регулярного выражения с флагом g.]