Javascript 一次只调用一次函数

Javascript 一次只调用一次函数,javascript,html,jquery,Javascript,Html,Jquery,我的网站上有这样一个功能: $("#search-label").on("keypress", function(e) { if(e.which == 13) { $('html, body').animate({ scrollTop: $("#content").offset().top }, 2000); } }); 它的任务是在按enter键后滚动到所选元素,工作正常,但问题是它可以在短

我的网站上有这样一个功能:

$("#search-label").on("keypress", function(e) {
  if(e.which == 13) {
    $('html, body').animate({
      scrollTop: $("#content").offset().top
    }, 2000);   
  }
});
它的任务是在按enter键后滚动到所选元素,工作正常,但问题是它可以在短时间内重复调用,然后页面就会卡住

如何限制每10秒调用一次的可能性


谢谢

您可以混合使用变量和
设置超时
来执行此操作:

var scrollOK=true;
$(“#搜索标签”)。在(“按键”,功能(e){
如果((e.which==13)&&scrollOK){
$('html,body')。设置动画({
scrollTop:$(“#内容”).offset().top
}, 2000);   
scrollOK=false;
setTimeout(函数(){scrollOK=true;},10000);
}
});
它使用
scrollOK
确保滚动正常,当滚动时,它会暂时将其设置为
false
(暂时是因为
setTimeout
在10秒或10000毫秒后将其设置回
true

编辑:正如@ChloeAnderson所说,这可能会占用更多的资源。这是一个应该更好的版本:

var lastcrolled=0;
$(“#搜索标签”)。在(“按键”,功能(e){
如果((e.which==13)和&(Date.now()>=(lastScrolled+10000))){
$('html,body')。设置动画({
scrollTop:$(“#内容”).offset().top
}, 2000);   
lastScrolled=Date.now();
}
});

您可以混合使用变量和设置超时来执行此操作:

var scrollOK=true;
$(“#搜索标签”)。在(“按键”,功能(e){
如果((e.which==13)&&scrollOK){
$('html,body')。设置动画({
scrollTop:$(“#内容”).offset().top
}, 2000);   
scrollOK=false;
setTimeout(函数(){scrollOK=true;},10000);
}
});
它使用
scrollOK
确保滚动正常,当滚动时,它会暂时将其设置为
false
(暂时是因为
setTimeout
在10秒或10000毫秒后将其设置回
true

编辑:正如@ChloeAnderson所说,这可能会占用更多的资源。这是一个应该更好的版本:

var lastcrolled=0;
$(“#搜索标签”)。在(“按键”,功能(e){
如果((e.which==13)和&(Date.now()>=(lastScrolled+10000))){
$('html,body')。设置动画({
scrollTop:$(“#内容”).offset().top
}, 2000);   
lastScrolled=Date.now();
}
});

搜索“去抖动”。“使用10秒而不是2秒”这是回放时间,而不是调用函数之间的停顿我想您正在寻找节流,我建议使用lodash的
节流
函数:-或者查看此问题以获得无依赖项的解决方案:为什么
html
在查询选择器中?这似乎有点倒退。搜索“去抖动”。“使用10秒而不是2秒”这是倒带时间,不是调用函数之间的停顿我想你在寻找节流,我建议使用lodash的
throttle
函数:-或者查看此问题以获得无依赖性的解决方案:为什么
html
在查询选择器中?这似乎有点倒退。请不要在冷却时使用间隔(或超时),使用时间戳(如
performance.now()
)没有什么错,因为它们只会根据请求进行评估。@ChloeAnderson:我不明白使用
setTimeout
有什么错。它似乎非常适合这种情况。它似乎是,也可能是,但更高的性能设置是使用时间戳。依靠一个时间间隔比比较两个整数(时间戳)使用的资源更多。@ChloeAnderson:好的。我在我的问题中添加了你的解决方案。非常感谢。请不要使用间隔(或超时)进行冷却,使用时间戳(如
performance.now()
)没有什么错,因为它们只会根据请求进行评估。@ChloeAnderson:我不明白使用
setTimeout
有什么错。它似乎非常适合这种情况。它似乎是,也可能是,但更高的性能设置是使用时间戳。依靠一个时间间隔比比较两个整数(时间戳)使用的资源更多。@ChloeAnderson:好的。我在我的问题中添加了你的解决方案。非常感谢。