Javascript 根据键入的速度,onkeyup会触发多次
我在使用Javascript 根据键入的速度,onkeyup会触发多次,javascript,Javascript,我在使用onkeyup函数时遇到了一个非常奇怪的问题。根据用户键入的速度,由键入触发的功能可能会运行多次 var inputFilter = document.getElementById('inputFilter'); inputFilter.onkeyup = function(e, value) { e.preventDefault(); value = e.target.value if (value.length >= 3) { console.log(valu
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(XMLHttpRequest()
)从SharePoint列表中提取数据,并创建一个包含结果的表。如果我打字慢一点,表格就可以了,但是如果我打字快一点,表格的每一行都会重复。我在getItems()函数中添加了一个body.innerHTML='
,以确保每次运行函数时都清空表的主体:
const table = document.getElementById('smeTable'),
body = table.getElementsByTagName('tbody')[0];
body.innerHTML = '';
我不是一个程序员,可能会因为这个可能很愚蠢的问题而获得很多反对票,但我对这个问题感到困惑。任何想法都将不胜感激。谢谢。发生这种情况可能是因为您在短时间内生成了大量ajax请求,而且由于响应是异步的,所以对以前的keyUp事件的响应可能会在当前keyUp的响应之后加载,这可能会把事情搞得一团糟,特别是如果您正在提取一些自动完成的结果 我通常会在创建新请求时中止以前的ajax请求。您可以按照此处给出的关于如何中止上一个请求的答案进行操作:
你试过键盘吗?你需要一个更快的服务器和连接,或者你必须等到用户停止写,然后再去服务器。你在写代码,所以你是一个程序员。你得到了更多的选票。你看,生活可能会让人惊讶,
getItems
函数更有可能出现问题,而监听器的回调函数对于同一事件会被多次触发。如果每次都进行http调用,那么为keyup事件实现debounce/throttle
方法总是一个好主意。谢谢,但是我们不允许使用jQuery。它要么是纯JavaScript,要么什么都不是(不客气。在这种情况下,您可以使用XMLHttpRequest.abort()
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
}
});