jQuery ajaxComplete:有没有办法告诉哪个Javascript函数执行了ajax调用?

我有.ajaxComplete事件连接到这样的几个元素:

$("#ElementId").ajaxComplete(function (a, b, c) { });

问题是我的脚本中有多个$.ajax调用,这些调用由各种函数调用。 我不想为每个ajax调用的每个控件触发.ajaxComplete事件。 从概念上讲,我正在寻找这样的事情:

if (a.function == SearchCustomers) { do this }

有没有办法实现我想要的东西?

编辑:我意识到我可以检查我正在调用的服务的URL,但我不想在我的脚本中多次硬编码URL字符串。

你必须这样做:

 $.ajax({ url: "servicecall.html", success: function(html){ //if success }; }); 

更新

查看此演示: http : //jsfiddle.net/Z6Z5e/4/


您可以在.ajax()调用中的自定义属性中指定函数标识符,并在ajaxComplete()回调中使用该值。

例如,在进行.ajax()调用时添加'func'属性:

 function foo() { $.ajax({ url: '/someurl', ... func: 'foo', ... }); } 

然后,使用ajaxComplete()

 $('#someElement').ajaxComplete(function(e, xhr, settings) { if (settings.func == 'foo') { // ... } else if (settings.func == 'bar') { // ... } }); 

就个人而言,我喜欢将我的模块组织在JS对象中,而不是将我的Ajax调用抽象为函数,原因有多种:

 ​var YourModule = { Ajax: { AjaxCallOne: function() { return $.ajax({ // your options for the call }).promise(); }, AjaxCallTwo: function() { return $.ajax({ // your options for the call }).promise(); } }, Events: { OnButtonOneClick: function() { YourModule.Ajax.AjaxCallOne().then(YourModule.Events.OnAjaxCallOneReceived); }, OnButtonOneClick: function() { YourModule.Ajax.AjaxCallTwo().then(YourModule.Events.OnAjaxCallTwoReceived); }, OnAjaxCallOneReceived:function(data) { // your code }, OnAjaxCallTwoReceived: function(data) { // your code } } };​​​ 

.then()正在工作,因为$ .ajax实现了Deferred“接口”。 请参阅此参考: http : //api.jquery.com/category/deferred-object/

另外,考虑让代码用户能够改变传递给$ .ajax调用的选项。 为此,我使用$ .extend。 请参阅此参考: http : //api.jquery.com/jQuery.extend/

Ajax调用一个:

 $.ajax({ // set all your properties as needed url: myUrl, success: function(data) { // handle the result from THIS .ajax call } }); 

Ajax调用两个:

 $.ajax({ // set all your properties as needed url: myotherURL, success: function(data) { // handle the result from THIS .ajax call } }); 

如果你有很多需要做同样事情的.ajax调用,那么你可以使用$ .ajaxSetup设置一个默认的成功函数