Глобальные данные $.ajaxSetup не объединяются в функции загрузки

#javascript #ajax #jquery

#javascript #ajax #jquery

Вопрос:

Я хотел бы установить глобальный параметр данных для всех моих запросов ajax

 $.ajaxSetup({
   data: {hash : "12345"}
});
  

после установки этого я вызываю:

 var myData = {
    name : "John",
    age : "28"
}

$.get(url, myData, function(data){
    ...
});
  

это работает нормально и добавляет все 3 параметра (хэш, имя, возраст) для запроса данных
, но когда я вызываю функцию загрузки вместо get, она не работает, и я получаю только 2 параметра (имя, возраст):

 $("#my_div").load(url, myData, function(data){
    ...
});
  

пожалуйста, кто-нибудь может сказать мне, почему это не работает для функции загрузки? У меня много вариантов использования функции загрузки в моем приложении, и я не хочу менять load на get

спасибо за каждый совет!

Ответ №1:

Это можно считать ошибкой в jQuery; или, по крайней мере, они должны признать, что интерфейс между их методами AJAX несовместим.

Единственный способ исправить это — использовать jQuery.extend для объединения значения по умолчанию data с data предоставленным вами:

 jQuery.extend(myData, jQuery.ajaxSettings);
  

Перед выполнением запроса.

Как это ошибка:

load преобразует data объект в строку перед передачей в базовый jQuery.ajax метод, где as get этого не делает.

Из-за этого при ajaxExtend сборке data объекта в load сценарии data параметру присваивается значение string , тогда как with get data объект объединяется с jQuery.ajaxSettings .

Ответ №2:

Если вы посмотрите .load , вы увидите, что он не передает объект .ajax , даже если вы передаете его в .load :

     if ( params ) {

        ...

        } else if ( typeof params === "object" ) {

            // it will execute this

            params = jQuery.param( params, jQuery.ajaxSettings.traditional );
  

Он вызовет jQuery.params , который возвращает строку, и объект не может быть объединен со строкой. Поэтому он будет отправлен "name=Johnamp;age=28" без объединения объекта hash.

Это не так $.get , потому что эта функция напрямую передает объект:

 jQuery.each( [ "get", "post" ], function( i, method ) {
    jQuery[ method ] = function( url, data, callback, type ) {

        ...

        return jQuery.ajax({
            type: method,
            url: url,
            data: data,         // passed directly to $.ajax which takes care of merging $.ajaxSetup stuff
            success: callback,
            dataType: type
        });
    };
});