javascript - 根据您键入的速度,onkeyup 会触发多次
问题描述
我遇到了一个非常奇怪的onkeyup
函数问题。根据人打字的速度,由打字触发的功能可能会运行多次。
var inputFilter = document.getElementById('inputFilter');
inputFilter.onkeyup = function(e, value) {
e.preventDefault();
value = e.target.value
if (value.length >= 3) {
console.log(value);
getItems(value);
}
};
如果我打字慢,该getItems()
功能运行完美,但如果我打字非常快,它的行为很奇怪。该getItems()
函数使用 Ajax( ) 从 SharePoint 列表中提取数据XMLHttpRequest()
,并创建一个包含结果的表。如果我打字慢,表格就好了,但如果我打字快,每个表格行都会重复。我在 getItems() 函数中添加了 abody.innerHTML = ''
以确保它在每次运行该函数时清空表的主体:
const table = document.getElementById('smeTable'),
body = table.getElementsByTagName('tbody')[0];
body.innerHTML = '';
我不是程序员,对于这个可能很愚蠢的问题,我可能会得到很多反对票,但我对这个问题感到困惑。任何想法,将不胜感激。谢谢你。
解决方案
这可能是因为您在短时间内产生了大量 ajax 请求,并且由于响应是异步的,因此对先前 keyUp 事件的响应可能会在当前 keyup 的响应之后加载,并且可能会搞砸,特别是如果您是拉一些自动完成的结果。
我通常会在创建新请求时放弃以前的 ajax 请求。您可以按照此处关于如何中止先前请求的答案进行操作: Abort previous ajax request on new request
var currentRequest = null;
currentRequest = jQuery.ajax({
type: 'POST',
data: 'value=' + text,
url: 'AJAX_URL',
beforeSend : function() {
if(currentRequest != null) {
currentRequest.abort();
}
},
success: function(data) {
// Success
},
error:function(e){
// Error
}
});
推荐阅读
- python - 如何使用 python 抓取亚马逊的多个搜索结果页面?
- javascript - 有状态的 React Context Provider 可以增加重新渲染的次数吗?
- laravel - Laravel-permissionTrait.php
- javascript - 有没有办法将在 .then 承诺中返回的结果保存到变量中
- html - 我如何从下往上“折叠”一个 div?
- docker - 无法远程连接到数字海洋 redis 服务组件
- r - 如何分析 R 中的多项选择题?
- sockets - 不得暂停 UWP 应用 - 切换到 Win32?
- ios - 在 SwiftUI 中更改 TabBar 色调
- reactjs - React 应用程序不显示从 MongoDB Atlas 获取的数据