输入框自动补全怎么防抖才不卡顿?
我用原生 JS 做了个搜索框的自动补全,每次 input 事件都发请求,结果疯狂请求接口,页面卡得不行。试过加 setTimeout,但好像没生效,还是频繁触发。
这是我现在写的监听代码:
input.addEventListener('input', () => {
fetch(<code>/search?q=${input.value}</code>)
.then(res => res.json())
.then(data => renderSuggestions(data));
});
该怎么正确加防抖?是不是得把定时器变量提到外面?求个靠谱写法!
你的问题在于每次input都新建了一个setTimeout,这些定时器各跑各的,根本不会取消上一次。
正确写法是这样的:
原理很简单:每次触发时先把之前的timer清掉,只有最后一次输入停下来300ms才会真正发请求。
还有个坑提醒你:请求发出去之后,用户可能已经清空输入框了,这时候返回的结果不应该展示。最好在fetch之前判断一下input.value是否为空,另外可以在发新请求前把上一次请求取消掉,不过这个需要用AbortController,稍微复杂点,先把基础防抖搞定吧。