2012-12-11 77 views
1

我有下一個代碼,它運行良好,問題是,當用戶完成寫單詞時,腳本不斷創建後調用並不斷改變建議列表。建議列表的jquery POST

我想要做的事情,如果用戶不斷寫一個字,腳本停止所有後調用只做最後一個。

$("#inputString").keydown(function() { 
lookup($(this).val()); 
//alert('a'); 
}); 

function lookup(inputString) { 
if(inputString.length == 0) { 
    $('#suggestions').fadeOut(); // Hide the suggestions box 
} else { 
    $.post("../jsonshow.php", {q: ""+inputString+""}, function(data) { // Do an AJAX call 
     $('#suggestions').fadeIn(); // Show the suggestions box 
     $('#suggestions').html(data); // Fill the suggestions box 
    }); 
} 
} 
+1

你只顯示了AJAX請求時在每個定時器;您所要求的更改可能必須在鍵綁定事件中進行,即顯示更多代碼請編輯 –

+0

並添加代碼 – MGE

+1

還需要調用lookup() –

回答

0

我提議將和上keydown事件AJAX請求,即:

$("#searchBox").keydown(function() { 
    lookup($(this).val()); 
}); 

這將只發送一個AJAX請求,當用戶鍵入的東西。

編輯:
我做了的jsfiddle,做,我才意識到它必須keyup而不是​​(用的keydown,你不會得到一個與輸入然後鍵入的字符)。

這裏是小提琴:http://jsfiddle.net/11684/sjCTZ/1/

+0

的綁定函數使它相同 – MGE

+0

您是否已將您的AJAX調用版本和eventlistener? @MikelGarcesEtxebarria – 11684

+0

現在的代碼只有你可以在頁面頂部看到的消息 – MGE

0

像這樣的東西應該工作:

function lookup(inputString) { 
    if (... 
    else if (!$("#suggestions").data('blocking')) { 
     $("#suggestions").data('blocking', true); 
     $.post(...function (data) { 
      ... 
      $("#suggestions").data('blocking', false); 
     }); 
    } 
} 

如果$("#suggestions").data('blocking')設置的互斥是假這將只執行Ajax請求;它在請求前設置爲true,並在請求完成後設置爲false。

+0

當用戶鍵入兩個字符,結果到達後,僅顯示第一個字符的結果 – pimvdb

2

您可以使用setTimeout來設置按鍵之間的某個特定時間間隔,以便在發佈之前允許。 - 然後清除使用擊鍵clearTimeout

var action; 
$('#inputString').keydown(function(){ 
    clearTimeout(action);  
    var $el = $(this); 
    action = setTimeout(function(){ 
     lookup($el.val()); 
    },1000); // <-- amount of time in ms before your post will run 
});​ 

http://jsfiddle.net/gunuW/

+0

你設置你的超時時間爲100 ..因此,這就是1/10秒。嘗試使用更大的數字? –

+0

我試過不同的超時時間 – MGE

+0

你推出了更改你鏈接的頁面? –