使用jQuery检测每个实例的鼠标滚动,而不是每次点击

时间:2014-05-28 18:17:57

标签: jquery scroll mousewheel

我尝试做的是在用户向上或向下滚动时移动元素。我在一个名为goTo()的函数中有这个机制。我也试图通过使用变量来跟踪用户的位置。当用户向上或向下滚动时,变量上升或下降一。这就是我的功能到目前为止的样子:

$(window).on('DOMMouseScroll mousewheel', function(event){

 clearTimeout($.data(this, 'timer')); // NEW CODE 

 $.data(this, 'timer', setTimeout(function() { // NEW CODE

    if( event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0 )
    {
        --curScl;
        goTo(curScl);

    } else {
        ++curScl;
        goTo(curScl);
    }

 }, 250)); // NEW CODE 

});

更新:根据@Bart Jedrocha的建议,我添加了一个setTimeout包装器,使curSel的值不会因每个滚动而暴涨。但是,在执行滚动和元素移动之间存在延迟。感觉非常不自然。有没有办法在没有延迟的情况下做到这一点?

3 个答案:

答案 0 :(得分:4)

尽管setTimeout在技术上有效,但用户滚动鼠标和页面滚动之间会有一点延迟。这感觉不自然并且变得烦人。因此,我需要另一种解决方案。

var scl=0; // Create a variable

window.setInterval(function(){
   scl=0; // Reset this variable every 1.5 seconds
}, 1500);

$(window).on('DOMMouseScroll mousewheel', function (e) { 
// Detect movement on the scrollwheel anywhere in browser window

if(e.originalEvent.detail > 0 || e.originalEvent.wheelDelta < 0) {

    while(scl==0) { 
    // Create a while loop that only executes while your variable equals 0

        // CODE HERE            

        scl++; // Make your variable equal 1 after executing once
    }

} else {

    while(scl==0) { 
    // Same deal, but this time while the user scrolls down

       // CODE HERE

        scl++;
    }

}

});

这似乎没有问题。如果有人看到可以清理一下的地方,请告诉我。谢谢!

答案 1 :(得分:1)

如果我理解正确,你试图在滚动事件的停止处递增/递减1。遗憾的是,您无法绑定到 scrollStop 事件。您可以在事件处理程序中使用setTimeout来防止变量在滚轮的每个刻度上增加。请查看this示例。

答案 2 :(得分:1)

您可以随时查看自上次调用活动以来经过的系统时间。

&#13;
&#13;
var c_time = 0;

$(window).on('DOMMouseScroll mousewheel', function(event){
    if(($.now() - c_time) > 500) //0.5s
    {
        c_time = $.now();
        //Do smthng there...
    }
});
&#13;
&#13;
&#13;