$ .ajaxSetup全局数据不会在加载函数中合并

时间:2011-10-18 10:32:16

标签: javascript ajax jquery

我想为我的所有ajax请求设置一个全局数据参数

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

设置完之后我打电话:

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

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

这很好用,并添加所有3个参数(哈希,名称,年龄)来请求数据 但是当我调用load函数而不是get时,它不起作用,我只得到2个参数(名称,年龄):

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

请有人告诉我为什么它对加载功能不起作用?我在我的应用程序中有很多用于加载功能的用法,我不想在get

上更改负载

谢谢你的每一个提示!

2 个答案:

答案 0 :(得分:4)

这可能被认为是jQuery中的一个错误;或者至少,他们应该接受他们的AJAX方法之间的接口是不一致的。

解决此问题的唯一方法是使用jQuery.extend将默认data与您提供的data合并:

jQuery.extend(myData, jQuery.ajaxSettings);

在提出请求之前。

它的错误:

load convertsdata对象转换为字符串,然后传入基础jQuery.ajax方法,其中为get doesn't

因此,当ajaxExtend构建data对象时,load方案中data参数设置为字符串,而get data对象合并jQuery.ajaxSettings

答案 1 :(得分:0)

如果您查看.load,即使您将对象传递给.ajax,也会看到它没有将对象传递给.load

    if ( params ) {

        ...

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

            // it will execute this

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

它将调用jQuery.params,它返回字符串,并且该对象无法与字符串合并。因此,它将发送"name=John&age=28"而不组合散列对象。

$.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
        });
    };
});