我正在實現一個帶有自動建議值的文本框,它從每個按鍵上的mysql數據庫取值。由於我在數據庫中有大量值,因此我的功能需要時間。到一個函數是按順序運行的在按下的每個按鍵上實現自動建議
假設 我按了一個鍵,它觸發一個事件並啓動func的執行。 然後我按下B鍵,這又觸發了一個事件,但現在我想早些時候func應該在運行第二個功能之前被殺死
我該如何做到這一點?
通過我發現線程可以用來實現this.But,但我仍然無法實現即使通過線程。如果有人知道確切的程序?
我正在實現一個帶有自動建議值的文本框,它從每個按鍵上的mysql數據庫取值。由於我在數據庫中有大量值,因此我的功能需要時間。到一個函數是按順序運行的在按下的每個按鍵上實現自動建議
假設 我按了一個鍵,它觸發一個事件並啓動func的執行。 然後我按下B鍵,這又觸發了一個事件,但現在我想早些時候func應該在運行第二個功能之前被殺死
我該如何做到這一點?
通過我發現線程可以用來實現this.But,但我仍然無法實現即使通過線程。如果有人知道確切的程序?
這是作爲一個偉大的(在我看來)求職面試問題,和內森萊克萊爾wrote about it on his blog。
相關摘錄:
如果我們使用window.setTimeout我們可以推遲呼籲200毫秒。 ......但是,如果用戶的輸入速度很快,甚至只是正常的速度,那麼這不會對我們有所幫助。所以我們需要一種方法來中斷超時,如果用戶繼續打字。
...
所以,我知道,當你調用
window.setTimeout
,你回來唯一引用超時的ID。如果需要的話,你可以用它來取消超時!所以我們應該只在keypress函數閉包中存儲超時ID,並且如果用戶在超時函數觸發之前再次觸發按鍵事件,我們將取消它並設置一個新的!
最後,他分享了一些代碼示例,我想可以幫助您優化您的功能!
$(document).ready(function() {
$('input').keypress(function() {
if (this.timeoutId)
window.clearTimeout(this.timeoutId);
this.timeoutId = window.setTimeout(function() {
$.ajax({
// do some stuff
});
}, 200);
});
});
數據庫調用每個按鍵?讓人驚訝。你不能把這個存儲在內存中嗎? (ps使用[trie](http://en.wikipedia.org/wiki/Trie)或[基數樹](http://en.wikipedia.org/wiki/Radix_tree)) – roippi
不,我的數據庫很大我必須過濾每個按鍵的結果 –