#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
});
};
});