为特定请求禁用ajaxStart()和ajaxStop()

我正在使用.ajaxStart()和.ajaxStop()来显示一个模式,而正在做一个Ajax请求。 (在开始和停止之间)

现在我想添加一个longpoll函数,不断的等待通知,类似于这个网站的左上angular。

我现在的问题在于禁止这种模式只适用于长时间的请求。

注册“加载屏幕”开关机:

$(document).ajaxStart(handleAjaxStart); $(document).ajaxStop(handleAjaxStop); 

我的longpollfunction:

 $.ajax({ timeout: 35000, url: longPollUrl, success: function(data){ if(data.queCount) $('#numQueCount').html(data.queCount); if(data.queAccept) $('#numQueAccept').html(data.queAccept); }, dataType: 'json', complete: longpoll }); 

我试过了:

 $().off('ajaxStart'); $().off('ajaxStop'); 

开始投票后重新连接处理程序,但没有快乐。

我也试过在handleAjaxStart()中引入一个全局variables,它会在函数的第一行返回,但这似乎完全消除了加载屏幕。

任何想法如何实现?

我想到了..

选项对象中有一个属性.ajax()称为global

如果设置为false,则不会触发该调用的ajaxStart事件。

 $.ajax({ timeout: 35000, url: longPollUrl, success: function(data){ if(data.queCount) $('#numQueCount').html(data.queCount); if(data.queAccept) $('#numQueAccept').html(data.queAccept); }, global: false, // this makes sure ajaxStart is not triggered dataType: 'json', complete: longpoll }); 

阅读所有可能的解决scheme后,我想结合答案。

解决scheme1:绑定/取消绑定

 //binding $(document).bind("ajaxStart.mine", function() { $('#ajaxProgress').show(); }); $(document).bind("ajaxStop.mine", function() { $('#ajaxProgress').hide(); }); //Unbinding $(document).unbind(".mine"); 

这是一个贬值的解决scheme。 在jQuery 1.9之前,ajax的全局事件如ajaxStart,ajaxStop,ajaxError等可以绑定到任何元素。 jQuery 1.9之后:

从jQuery 1.9开始,jQuery全局Ajax事件的所有处理程序(包括使用.ajaxStart()方法添加的那些)必须附加到文档。

因此我们不能将这些事件绑定/解除绑定到自定义命名空间。

解决scheme2:将global属性设置为false

 $.ajax({ url: "google.com", type: "GET", dataType: "json", global: false, //This is the key property. success: function (data) { console.log(data); }, error: function (data) { console.log(data); } }); 

此解决scheme可用于禁用ajaxStart()/ajaxStop()事件。 但是,这也使得禁用ajaxComplete(), ajaxError(), ajaxSend(), ajaxSuccess() 。 如果您不使用这些全局事件,那么看起来没问题,但在需要时,您必须返回并更改所有设置为global: false页面的解决schemeglobal: false

解决scheme3:使用全局variables

 var showLoadingEnabled = true; $(document).ready(function () { $('#loading') .hide() // at first, just hide it .ajaxStart(function () { if (showLoadingEnabled) { $(this).show(); } }) .ajaxStop(function () { if (showLoadingEnabled) { $(this).hide(); } }); }); function justAnotherFunction() { window.showLoadingEnabled = false; $.ajax({ url: 'www.google.com', type: 'GET', complete: function (data) { window.showLoadingEnabled = true; console.log(data); } }); } 

全局variables不应该在JavaScript文件中使用。 但是,这是最简单的解决scheme,我可以find。

我首选我的项目的第三个解决scheme。

Interesting Posts