2013-10-01 54 views
0

我有一個帶按鍵事件處理程序jsfiddle的文本字段。當我在此字段中輸入內容並按下「Enter」2次時,將發送2個請求。我想關閉所有事件,同時ajax請求正在進行中。一種選擇是在ajax調用之前調用.off()函數,然後再次綁定事件處理函數。任何其他選項?在Ajax進程中解除綁定事件處理程序

+1

我想你可以設置'異步:FALSE' – tymeJV

+0

使用標誌(變量或數據屬性),但爲什麼不關閉()這就是它的存在了。 – adeneo

+0

'async:false'是一個可怕的想法。它完全鎖定了JavaScript事件循環。如果您的用戶在同一時間做了其他事情,則附加的JavaScript也將無響應。而且我認爲你實際上會得到每個keydown的請求,他們只是序列化(延遲)。 – Halcyon

回答

1

我用2個布爾標誌,如:

var is_requesting = false, should_request = false; 
function onkeydown() { 
    if (is_requesting) { 
     should_request = true; 
     return; 
    } 
    is_requesting = true; 
    $.ajax({}, function() { 
     is_requesting = false; 
     if (should_request) { 
      onkeydown(); 
     } 
    }); 
} 
+0

我不完全理解'should_request'布爾值的需要,你能解釋一下嗎? – Nunners

+0

這意味着緩衝請求。如果你調用這個函數5次,它會調用ajax兩次。這種方法對於自動完成等功能非常有用。你永遠不會得到競爭性的請求,你將永遠得到最後的事件。如果你認爲你不需要它,你可以放棄它。 – Halcyon

2

使用回調處理程序從您的AJAX調用和使用國旗的布爾值。通過在「始終」回調中將ajaxLoading布爾值設置爲false,您可以確保其他未來請求可以獨立於當前ajax調用是否引發錯誤。

var ajaxLoading = false; 

if(!ajaxloading){ 
    ajaxloading=true; 
    $.ajax({ 
    url: 'your url', 
    type: 'GET', 
    dataType: 'JSON' 

    }) 
    .done(function(data) { 
    console.log("success"); 

    }) 
    .fail(function() { 
    console.log("error"); 
    }) 
    .always(function() { 
    console.log("complete"); 
     ajaxloading=false; 
    }); 

} 
1

有沒有很好的理由不使用jQuery .off()函數?

如果是這樣,那麼您可以在創建ajax請求之前簡單地禁用該控件,並在請求完成後重新啓用該控件。這也會阻止用戶認爲他/她可以通過在請求期間更改文本值來更改結果。

 //Disable the input   
     $('#myresult').prop('disabled', true); 
     $('#myresult').append('<br>'+$(this).val()); 
     $.ajax({ 
      type: "POST", 
      beforeSend: function() {}, 
      complete: function() { 
       //Re-Enable the input 
       $('#myresult').prop('disabled', false); 
      }, 
      url: "/echo/json/", 
      data: { delay : 3 }, 
      success: function(){}, 
      error: function() {}, 
      dataType: 'json' 
     }); 
+0

不喜歡經常綁定/解除綁定。這很討厭我。禁用輸入字段是個好主意,謝謝。我會將它與布爾標誌結合起來 – Suic

相關問題