项目中有一个搜索组件使用了autocomplete的自动填充功能,在用户点击任意键盘后将触发一次请求,根据autocomplete的文档可知,默认delay的值为10ms.
在用户慢速输入的时候,该模块没有问题,但是当快速的输入查询字符串时,结果有时候会出现差错。
第一种情况:
用户输入 | 请求后台参数 | 返回结果 |
h | h | h对应结果 |
hu | hu | hu结果 |
hua | 不发送请求 | |
huan | huan | huan结果 |
huang | huang | huang结果 |
第二种情况:
用户输入 | 请求后台参数 | 返回结果 |
h | h | h对应结果 |
hu | hu | hu结果 |
hua | hua | hua结果 |
huan | huan | huan结果 |
huang | huang | huan结果 |
首先,delay:10属性的意思是当用户敲击键盘10ms后再进行请求,源码的实现如下:
clearTimeout(timeout);
timeout = setTimeout(onChange, options.delay);
如果用户连续输入,则两次击键的时间间隔可分为以下两种情况:
间隔时间<10ms :取消前次请求,直接进行当前输入请求,如表格一的情况,中间空缺了hua的请求。
间隔时间>10ms:每次输入都有对应的请求,但是因为间隔时间只有10ms,可能因为网络,渲染等原因,“huang”的结果先返回,紧跟着“huan”的结果再返回,就出现如表2所述的情况,这种情况下建议将delay值改大到500ms--1000ms之间,这样两次请求就不会冲突。