Jquery 不要在1秒内再次执行javascript,即使触发器被重新触发

Jquery 不要在1秒内再次执行javascript,即使触发器被重新触发,jquery,Jquery,即时消息检测页面上的滚动,并在用户上下滚动时执行一些代码。问题是代码很快就会触发多次。我需要的代码,一旦它被执行,不能再执行一秒钟 理想情况下,任何执行都将被禁用1秒。所以如果//do something刚刚启动,那么它在1秒内不能再次启动,也不能//执行其他操作 注意-我知道这不是完全可靠的跨浏览器,但目前这还可以。它也不需要用于触摸屏滚动 $(document).ready(function(){ $('body').bind('mousewheel', function(e){

即时消息检测页面上的滚动,并在用户上下滚动时执行一些代码。问题是代码很快就会触发多次。我需要的代码,一旦它被执行,不能再执行一秒钟

理想情况下,任何执行都将被禁用1秒。所以如果//do something刚刚启动,那么它在1秒内不能再次启动,也不能//执行其他操作

注意-我知道这不是完全可靠的跨浏览器,但目前这还可以。它也不需要用于触摸屏滚动

$(document).ready(function(){
    $('body').bind('mousewheel', function(e){
        if(e.originalEvent.wheelDelta /120 > 0) {
            //do something
        }
        else{
            //do something else 
        }
    });
});
我尝试过使用超时功能,但它似乎会等待并触发多次,而不是一次:

setTimeout(function() {
    //do something 
    event.stopPropagation();
}, 1000);

一种方法是在您第一次调用事件后立即解除绑定,然后使用setTimeout重新绑定该事件。请查看debounce/throttle。本·阿尔曼(Ben Alman)写了一篇流行的文章,提供了这种功能。另见

去盎司还是节流?从文档中:

简单地说,节流限制了 函数设置为每延迟毫秒不超过一次,消除抖动 保证函数只执行一次 (给定一个指定的阈值)


设置超时,然后清除每个滚动上的超时,这样,超时仅在用户停止滚动时执行,而不是每次:

$(document).ready(function(){
    $('body, html').on('scroll', function(e){
        clearTimeout( $(this).data('timer') );
        $(this).data('timer', 
            setTimeout(function() {
                if( $(this).scrollTop() > 0) {

                }else{
                    //do something else 
                }
            }, 1000)
        );
    });
});
你应该试试看