2014-09-22 97 views
1

我知道关于jQuery's ajaxStop的方法。检查所有Ajax请求何时完成 - 纯JavaScript

$(document).ajaxStop(function() { //Do something }); 

如果jQuery不可用,有没有办法用纯JavaScript来做到这一点?

你能举个例子吗?

干杯

+0

你可以看看jQuery的源代码,它是如何在那里处理的...... – Sirko 2014-09-22 09:55:59

+0

是的,你可以在没有jQuery的情况下做到这一点...甚至没有那么难。这是个问题吗?或者你指望我们告诉你如何? – 2014-09-22 09:59:08

+0

你能让我知道吗?这确实是一个问题。 – Paddy 2014-09-22 10:01:02

回答

1

很好,我会咬(但即使没有试图在你的部分很懒惰):

jQuery docs

每当Ajax请求完成时,jQuery将检查是否存在其他未完成的Ajax请求。如果不存在,jQuery将触发ajaxStop事件。任何和所有已经使用.ajaxStop()方法注册的处理程序都会在此时执行。

那么你需要什么?那么:您将用来执行AJAX请求的中央API(各种模块)。在这个模块中,你必须跟踪待处理的请求,并在请求终止后删除它们。
如果队列(可以这么说)是空的,那么你可以检查ajaxStop队列中的任何已注册的回调,并调用它们。

基本设置(伪代码)是这样的:

var myAjax = (function() 
{//create closure scope to track ajax requests 
    var activeRequests = [], 
     stopQueue = [], 
     ajaxModule = {},//the module itself 
     createXhr = function(){};//function to create XHR requests 
    ajaxModule.ajax = function(params, callback) 
    { 
     var xhr = createXhr(params), 
      key = activeRequests.length; 
     activeRequests.push(xhr);//add to active array 
     xhr.onreadystatechange = function() 
     {//assign internal handler 
      if (this.readyState === 4 && this.status === 200) 
      { 
       //invoke passed callback only if request is done 
       callback.call(this, []);//pass params as you please 
       activeRequests.filter(function(e) 
       { 
        return e !== this; 
       }, this);//define this callback in closure, of course 
       if (activeRequests.length === 0) 
       {//no more active requests 
        stopQueue.map(function(callback) 
        { 
         callback();//invoke callbacks 
        }); 
       } 
      } 
     }; 
    }; 
    return ajaxModule;//expose module 
}()); 

当然,你仍然必须执行该管理stopQueue回调的功能,你就必须实现可靠的AJAX模块,但这是您可以使用的简单设置。

+0

干杯。我找不到一个很好的例子来学习。 – Paddy 2014-09-22 10:25:38

0

的JavaScript abort();方法 参考 http://help.dottoro.com/ljomfaxv.php

var httpRequest = null; 
function sentReq() { 
      if (!httpRequest) { 
       httpRequest = CreateHTTPRequestObject(); 
      } 
      if (httpRequest) {   

       var url = "file.php"; 

       httpRequest.open ("GET", url, true); 
       httpRequest.onreadystatechange = OnStateChange; 
       httpRequest.send (null); 
} 

function abort(){ 
    if(httpRequest) 
     httpRequest.abort(); 
} 
+1

它会帮助你包括一个简短的例子。 – Xan 2014-09-22 10:28:24