2013-05-01 84 views
3

我有一個輸入框,每按一次鍵上都有一個Ajax請求。所以如果我輸入單詞「名稱」會有4個成功的請求。所以我實際上只想要執行的最新請求。所以如果我輸入單詞「名稱」將只有一個請求,這將是最後一個。多個Ajax只允許最近的呼叫

,我也有一個解決方案(這是一個簡單的例子與點擊法)

JS腳本

var callid = 1; 

function ajaxCall (checkval){ 
    if(checkval == callid){ 
     $.ajax({ 
      type: 'post', 
      url: baseurl + "test/call_ajax", 
      data: { 
       val: "1" 
      }, 
      success: function(data) { 
       console.log(data) 
      } 
     }); 
    } 
} 

function call(){ 
    var send = callid+=1; 
    setTimeout(function(){ ajaxCall(send) } , 500); 
} 

HTML腳本

<a href="#" onclick="call()" > Call ajax </a> 

這是可以正常使用。但我認爲是否有辦法改進一點。

任何想法:)

+0

可以放棄最後一次通話...... – epascarello 2013-05-01 17:35:32

+0

沒有,腳本應該放棄以前所有的通話,除了最後一個。 – Iori 2013-05-01 17:38:01

+0

我在說['abort()'](http://stackoverflow.com/questions/446594/abort-ajax-requests-using-jquery) – epascarello 2013-05-01 18:30:05

回答

4

我相信你正在尋找一些更好的事件調度的意圖技巧。

var eventDispatcher = null; 
$('.textbox').keyup(function(){ 
    if(eventDispatcher) clearTimeout(eventDispatcher); 
    eventDispatcher = setTimeout(function(){ 
     $.ajax({ ... }); 
    }, 300); 
}); 
1

的setTimeout返回可以存儲和使用,以清除先前設置的定時器的ID:

var timerId; 

function call() { 
    if (timerId !== undefined) { 
     clearTimeout(timerId); 
    } 

    timerId = setTimeout(function() { ajaxCall(send) }, 500); 
} 

這樣做的結果應該是把AjaxCall的方法將被調用爲500ms輸入最後一個字母后。

3

你可以在setTimeout中做你的ajax。所以,你不需要申報和檢查一個額外的變量或寫這樣調用另一個函數()

$(document).ready(function() { 
    var timer; 
    $('#fillMe').keypress(function() { 
     clearTimeout(timer); 
     timer = setTimeout(function() { 
      //replace this with your ajax call 
      var content = $('#fillMe').val(); 
      $('#result').text('You will only see this if the user stopped typing: ' + content); 
     }, 1000); // waits 1s before getting executed 
    }); 
}); 

<input type="text" id="fillMe"> 
<div id="result"></div> 

在每個按鍵事件這將清除超時,並立即創建一個新的超時。這意味着只有當用戶停止輸入至少1秒鐘時,setTimeout函數的內容纔會被執行。 當然,1秒僅僅是示例目的的價值。你可以把它改成任何你想要的或者認爲這是一個很好的時間(如500毫秒)

見我jsfiddle