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.
添加回答
举报