Javascript 当某人停止键入1秒时触发功能
我有一个输入字段,当有人开始打字时,它会自动生成建议。用户无需模糊或点击提交按钮即可显示建议 当有人停止输入时,我想运行一个函数来跟踪向用户显示了哪些产品,以及当前输入字段中的文本字符串 我添加了一个“输入”事件侦听器,但我无法正确地获取逻辑 如果上次输入事件发生后至少1秒,我想查看Javascript 当某人停止键入1秒时触发功能,javascript,javascript-events,Javascript,Javascript Events,我有一个输入字段,当有人开始打字时,它会自动生成建议。用户无需模糊或点击提交按钮即可显示建议 当有人停止输入时,我想运行一个函数来跟踪向用户显示了哪些产品,以及当前输入字段中的文本字符串 我添加了一个“输入”事件侦听器,但我无法正确地获取逻辑 如果上次输入事件发生后至少1秒,我想查看doStuff()。问题是,我的脚本是在用户开始键入而不是之后启动的,因为它基于“更改”事件侦听器 我想一定有比我现在做的更合乎逻辑的方法 我还担心“输入”事件会影响用户的浏览器,因为它会在每次击键时运行,也许有更好
doStuff()
。问题是,我的脚本是在用户开始键入而不是之后启动的,因为它基于“更改”事件侦听器
我想一定有比我现在做的更合乎逻辑的方法
我还担心“输入”事件会影响用户的浏览器,因为它会在每次击键时运行,也许有更好的方法
不情愿地在下面显示我的代码块,尽管它没有多大意义,而且是我较弱的脚本编写时刻之一,更多地表明我一直在尝试不同的事情。我更喜欢忽略我一直使用的疯狂逻辑的解决方案
我想doStuff(e)
当用户“停止在输入中输入文本”时,这不是一个精确的定义。用户何时被视为已停止键入?现在我说的是1秒钟
不想使用change event,因为它会错过很多用户不会模糊的事件
喜欢纯JS
var input = document.querySelector('#search_input');
var newinput;
var lastinput;
var diff;
input.addEventListener('input', function(e) {
newinput = new Date();
if(!lastinput) {
lastinput = new Date()
}
diff = newinput - lastinput;
if(diff > 500 && diff < 2000) {
doStuff(e)
}
lastinput = newinput;
}, false);
var input=document.querySelector('search#u input');
var新输入;
var输入;
var-diff;
input.addEventListener('input',函数(e){
newinput=新日期();
如果(!lastinput){
lastinput=新日期()
}
diff=newinput-lastinput;
如果(差值>500和&diff<2000){
多斯塔夫(e)
}
lastinput=新输入;
},假);
您可以将输入
事件侦听器与和一起使用,如下所示:
var timeoutID;
document.querySelector(“#search_input”).addEventListener('input',function(e){
clearTimeout(timeoutID);
timeoutID=setTimeout(函数(){
警报(“收到任何输入后已过1秒”);
//多斯塔夫()
}, 1000);
});代码>
您可以将输入
事件侦听器与和一起使用,如下所示:
var timeoutID;
document.querySelector(“#search_input”).addEventListener('input',function(e){
clearTimeout(timeoutID);
timeoutID=setTimeout(函数(){
警报(“收到任何输入后已过1秒”);
//多斯塔夫()
}, 1000);
});代码>
这种技术有时被称为“去抖动”。虽然很多库(如下划线或Lodash)都有这种功能,但在纯javascript中可以相当容易地完成。它包装了一个函数,该函数将在超过去盎司时间时调用。它涉及使用setTimeout()
并在每次对输入触发事件时清除和重置超时。如果事件中存在延迟,并且超过了超时时间,则最终将触发取消公告功能
发件人:
使用它:
var myEfficientFn = debounce(function() {
// All the taxing stuff you do
}, 250);
element.addEventListener('keyup', myEfficientFn);
在您的情况下,您需要将事件添加到keyup
,keydown
,更改
,剪切
,复制
,粘贴
,等等
element.addEventListener('keyup', myEfficientFn);
element.addEventListener('keydown', myEfficientFn);
element.addEventListener('change', myEfficientFn);
// etc...
这种技术有时被称为“去抖动”。虽然很多库(如下划线或Lodash)都有这种功能,但在纯javascript中可以相当容易地完成。它包装了一个函数,该函数将在超过去盎司时间时调用。它涉及使用setTimeout()
并在每次对输入触发事件时清除和重置超时。如果事件中存在延迟,并且超过了超时时间,则最终将触发取消公告功能
发件人:
使用它:
var myEfficientFn = debounce(function() {
// All the taxing stuff you do
}, 250);
element.addEventListener('keyup', myEfficientFn);
在您的情况下,您需要将事件添加到keyup
,keydown
,更改
,剪切
,复制
,粘贴
,等等
element.addEventListener('keyup', myEfficientFn);
element.addEventListener('keydown', myEfficientFn);
element.addEventListener('change', myEfficientFn);
// etc...
您可以尝试window.setTimeOut()代码>在事件键向上之后@用户3502626请写一个正确的答案。不要对此使用注释。@user3502626在这种情况下没有按键事件在描述用户“键入”的情况下怎么可能没有按键事件?有按键和释放事件。我要为你写一个代码你可以试试window.setTimeOut()代码>在事件键向上之后@用户3502626请写一个正确的答案。不要对此使用注释。@user3502626在这种情况下没有按键事件在描述用户“键入”的情况下怎么可能没有按键事件?有按键和释放事件。我要给你写个密码这太棒了!经过测试,效果很好-谢谢。更具哲理的是,使用“输入”事件是否被认为是一种不好的做法,因为它会给用户浏览器带来压力?@DougFir-没关系。它不应该给浏览器带来压力。@DougFir您的压力更小,因为在超过延迟之前,您在触发每个事件时所做的工作更少。感谢您的反馈,这非常有用。这太棒了!经过测试,效果很好-谢谢。更具哲理的是,使用“输入”事件是否被认为是一种不好的做法,因为它会给用户浏览器带来压力?@DougFir-没关系。它不应该给浏览器带来压力。@DougFir您的压力更小,因为在超过延迟之前,您在触发每个事件时所做的工作更少。感谢您的反馈,这非常有帮助