我希望使用一些特殊的案例处理程序扩展我的所有应用程序的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
}
});
答案 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);