1 回答

TA貢獻1876條經驗 獲得超6個贊
在每一個keydown
你eventListener
觸發你的autocomplete
功能。當有人點擊backspace
時,你會同時得到一堆keydown's
,而現在,這意味著你同時運行了該函數多次。這就是減緩一切的原因。
例如,如果我輸入“Hello my name is”然后刪除整個字符串,我會觸發您的搜索 16 次,搜索 12,000 x 16 條記錄!你可以開始明白為什么這會成為一個問題。
debounce 函數很容易解決這個問題,因為它設置了再次運行之間的延遲。IE。如果有人剛剛擦除了整個字符串,它可能只觸發一次。
這是 debounce 函數的一個很好的例子:
// http://davidwalsh.name/javascript-debounce-function
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) { func.apply(context, args); }
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) { func.apply(context, args); }
};
}
這就是你如何在你的代碼上實現它以實現自動完成:
searchElement.addEventListener("keydown", debounce(function(e) {
var x = document.getElementById(this.id + "autocomplete-list");
if (x) x = x.getElementsByTagName("div");
if (e.keyCode == 40) {
init++;
addActive(x);
} else if (e.keyCode == 38) { //up
init--;
addActive(x);
} else if (e.keyCode == 13) {
e.preventDefault();
if (init > -1) {
if (x) x[init].click();
}
}
}, 500)); // Time set here as callback for how often it should be run, change this to whatever you want the time delay to be.
添加回答
舉報