2010-06-02 31 views
10

我想知道在使用jquery和ajax時停止duplciate提交的最佳方法是什麼?停止重複的Ajax子鏡像?

我想出了2種可能的方式,但不知道它們是僅有的2

  1. 在阿賈克斯開始禁用所有按鈕,直至請求完成。 2我遇到的問題雖然是我使用jquery模型對話框,所以我不知道如何禁用這些按鈕,因爲我不知道他們是否有id。第二,如果請求掛起,用戶無法再次嘗試,因爲所有按鈕都被禁用。

  2. 我正在尋找一種叫做AjaxQueue的功能,在這個時候,我不知道它是什麼我需要的或者它是如何工作的,因爲插件顯然是停機維護的。

http://docs.jquery.com/AjaxQueue

編輯

我覺得這是關閉的我一直在尋找在旋轉。

http://www.protofunc.com/scripts/jquery/ajaxManager/

我這個ajaxManager看到的唯一問題是,我想我有我所有的$。員額,$不用彷徨和$就那些改變自己的類型。

但是如果我需要$ .ajax中的特殊參數會發生什麼?或者我喜歡使用.post和.get。

編輯2

我認爲它可以在所有$阿賈克斯選項。我仍在研究它。然而,我現在不確定的是,我可以爲所有使用相同選項的請求使用相同的構造函數。

First you have to construct/configure a new Ajaxmanager 
//create an ajaxmanager named someAjaxProfileName 
var someManagedAjax = $.manageAjax.create('someAjaxProfileName', { 
    queue: true, 
    cacheResponse: true 
}); 

或者我必須每次都做出上述情況嗎?

回答

20

如何在用戶點擊按鈕時設置標誌?只有在AJAX請求成功完成時(complete,在successerror回調之後調用)才能清除標誌,並且只有在未設置標誌時纔會發送AJAX請求。

與AJAX隊列相關的是一個名爲jQuery Message Queuing的插件,非常好用。我自己使用它。

var requestSent = false; 

jQuery("#buttonID").click(function() { 
    if(!requestSent) { 
     requestSent = true; 

     jQuery.ajax({ 
     url: "http://example.com", 
     ...., 
     timeout: timeoutValue, 
     complete: function() { 
      ... 
      requestSent = false; 
     }, 
     }); 
    } 
}); 

可以爲長時間運行的請求超時值(值以毫秒爲單位),如果你認爲你的請求有掛的可能性。如果發生超時,則調用error回調,之後將調用complete回調。

9

您可以將活動請求存儲在變量中,然後在出現響應時將其清除。

var request; // Stores the XMLHTTPRequest object 

$('#myButton').click(function() { 
    if(!request) { // Only send the AJAX request if there's no current request 

     request = $.ajax({ // Assign the XMLHTTPRequest object to the variable 
      url:..., 
      ..., 
      complete: function() { request = null } // Clear variable after response 
     }); 

    } 
}); 

編輯:關於這個

的一個好處是,你可以使用abort()取消長時間運行的請求。

var request; // Stores the XMLHTTPRequest object 
var timeout; // Stores timeout reference for long running requests 

$('#myButton').click(function() { 
    if(!request) { // Only send the AJAX request if there's no current request 

     request = $.ajax({ // Assign the XMLHTTPRequest object to the variable 
      url:..., 
      ..., 
      complete: function() { timeout = request = null } // Clear variables after response 
     }); 

     timeout = setTimeout(function() { 
         if(request) request.abort(); // abort request 
        }, 10000);       // after 10 seconds 

    } 
}); 
+0

不會使用'timeout'屬性會更容易嗎?還是不按照我認爲的方式工作? :) – 2010-06-02 17:15:41

+0

@Vivin - 好點。除非您想在'setTimeout()'中使用其他邏輯來決定是否中止,否則可以使用'timeout'屬性。 'request'變量是一個類似於你的答案的標誌,但是如果需要的話,還可以提供'abort()'功能。 – user113716 2010-06-02 17:21:18

0
$.xhrPool = {}; 
$.xhrPool['hash'] = [] 
$.ajaxSetup({ 
    beforeSend: function(jqXHR,settings) { 
     var hash = settings.url+settings.data 
     if ($.xhrPool['hash'].indexOf(hash) === -1){ 
      jqXHR.url = settings.url; 
      jqXHR.data = settings.data; 
      $.xhrPool['hash'].push(hash); 
     }else{ 
      console.log('Duplicate request cancelled!'); 
      jqXHR.abort(); 
     } 
    }, 
    complete: function(jqXHR,settings) { 
     var hash = jqXHR.url+jqXHR.data 
      if (index > -1) { 
       $.xhrPool['hash'].splice(index, 1); 
      } 
     } 
    });