jQuery-如何将滚动视为单个事件?

jQuery-如何将滚动视为单个事件?,jquery,scroll,Jquery,Scroll,当我将函数绑定到滚动和滚动鼠标滚轮一次时,该函数会运行七到八次。当我滚动鼠标滚轮一次时,我希望它只运行一次,这可能吗?我使用以下代码: $(document).ready(function () { $(window).bind('scroll', function() { alert("Scroll."); } }); }); 如果“一次”是指每页加载一次, 您可以使用off()方法解除侦听器中事件的绑定。 还可能发生名称空

当我将函数绑定到滚动和滚动鼠标滚轮一次时,该函数会运行七到八次。当我滚动鼠标滚轮一次时,我希望它只运行一次,这可能吗?我使用以下代码:

$(document).ready(function () {
    $(window).bind('scroll', function() {
        alert("Scroll.");          
    }   
    });
});
如果“一次”是指每页加载一次, 您可以使用
off()
方法解除侦听器中事件的绑定。

还可能发生名称空间事件,如:

scroll.namespace
仍然是同一事件,但您可以具体解除绑定

$(document).ready(function () {
    $(window).on('scroll.myEvent', function() {
        $(window).off('scroll.myEvent');
        alert("Scroll.");          
    }   
    });
});
试一试


演示:

您可以使用插件中的节流功能


只是Aruns答案的一个变体:

类似的方法,只是立即触发事件,然后在一段时间内防止再次处理事件。 这样你就不必在处理事件之前等待

$(document).ready(function () {
    var locked = false
        , timeout;

    $(window).bind('scroll', function() {
        //do nothing if still locked
        if(true === locked){
            return false;
        }
        //lock
        locked = true;

        //do something if not locked
        alert('scroll!')

        clearTimeout(timeout)
        timeout = setTimeout(function(){
            //unlock
            locked = false;         
        }, 1000)
    });
});

如果只想检测一次滚动,请使用以下方法:

$(function () {
    var done = false;
    $(window).bind('scroll', function() {
       if (!done){
           alert("Scroll.");
           done = true;
       }
   });
});

但是,如果您想检测每个滚动事件,请尝试回答4这样的问题,即“一次”的滚动次数是多少?每个浏览器都有自己的滚动分辨率。短滚动可能会调用许多滚动事件。这是很自然的。我所说的“一次”是指一个不间断的卷轴,无论不是我多久,我都会记住你。为了速度,如果没有别的;)@RoryMcCrossan这是一个已知的问题和解决方案。这对我来说非常适合,但我想这会减慢速度。。!!这个解决方案正在发挥作用。我看不出它怎么没有被评得更高。这应该是被接受的答案,而且肯定是最高的。
$(document).ready(function () {
    var locked = false
        , timeout;

    $(window).bind('scroll', function() {
        //do nothing if still locked
        if(true === locked){
            return false;
        }
        //lock
        locked = true;

        //do something if not locked
        alert('scroll!')

        clearTimeout(timeout)
        timeout = setTimeout(function(){
            //unlock
            locked = false;         
        }, 1000)
    });
});
$(function () {
    var done = false;
    $(window).bind('scroll', function() {
       if (!done){
           alert("Scroll.");
           done = true;
       }
   });
});