在ajaxSend或ajaxSuccess期间获取调用者名称

时间:2013-04-29 21:04:08

标签: javascript jquery ajax

我希望使用一些特殊的案例处理程序扩展我的所有应用程序的ajax调用,并且如果需要,可以重新启动启动ajax调用的方法。我遇到的问题是我无法获取从我的匿名函数事件处理程序(ajaxSend或ajaxSuccess)触发ajax调用的调用函数的名称。我已经尝试了下面评论的调用者/被调用者的所有变体以及许多其他变体。以下是一些示例代码:

  var ajaxcaller;
  $(document).ajaxSend(function(event,xhr,settings){
       // Before we fire off our call lets store the caller.
       // ajaxcaller = arguments.callee.caller.name;          
       //alert("get caller:"+arguments.callee.caller.name);
       //alert("get caller:"+caller.name);
       //alert("get caller:"+this.caller.toString());
       //alert("get caller:"+event.caller.toString());
  });
  $(document).ajaxSuccess(function(event,xhr,settings){
       var xobj = $.parseJSON(request.responseText);
       if(xobj.ReFire === 1){
           //Successful ajax call but not results we expected, let's refire
           //Fix some params automagically here then
           //SOME CODE HERE THAT Refires my caller
        }
  });
  $(document).ajaxError(function(event,xhr,settings){
       var xobj = $.parseJSON(request.responseText);
       if(xobj.ReFire === 1){
           //Fix some params automagically here then
           //SOME CODE HERE THAT Refires my caller
        }
  });

1 个答案:

答案 0 :(得分:0)

这是一个想法,但是我不确定它有多可靠,但你可以拦截jQuery.ajax个调用并将caller属性附加到options来引用调用函数以及一个args属性,它将引用传递给该函数的参数。

我相信,如果你玩弄这个想法,你会找到解决问题的方法。如果你不喜欢覆盖jQuery.ajax的想法,你可以简单地确保在所有ajax调用中将这些引用作为选项传递。

DEMO:http://jsfiddle.net/zVsk2/

jQuery.ajax = (function (fn) {
    return function (options) {
        var caller = arguments.callee.caller;
        options.caller = caller;
        options.args = caller.arguments;
        return fn.apply(this, arguments);
    };
})(jQuery.ajax);

$(document).ajaxSend(function (e, xhr, options) {
    console.log('caller', options.caller);
    console.log('args', options.args);
});

function getRecords(someArgument) {
    return $.ajax({
        url: '/echo/json/',
        dataType: 'json',
        data: {
            json: JSON.stringify({ test: someArgument})
        }
    });
}

getRecords(1);
getRecords(2);