分离并重新连接鼠标滚轮事件侦听器不会重置滚动惯性

时间:2013-09-27 01:46:03

标签: javascript jquery mouseevent mousewheel

我正在使用jquery-mousewheel插件触发一个功能。

当我调用 moveit 时,我会分离监听器并等待动画完成,然后重新连接监听器。

问题在于,当我重新连接它时,鼠标滚轮插件仍在听一些鼠标/触控板的惯性,并反复调用 moveit

我认为在我的特定情况下,对函数调用进行去抖或限制并不是好的解决方案,因为惯性仍然存在,我还希望立即附加侦听器以进行其他可能的 moveit 调用。

有没有办法通过完全重置鼠标滚轮事件来“消除惯性”,而不是只拆卸它?

$(document).ready(function () {

    var tween;
    var slide = $('#slide');

    function bodyListen () {
        $('body').on('mousewheel.bodyscroll',
        function (e, delta, deltaX, deltaY) {
            e.preventDefault();
            $('body').off('mousewheel.bodyscroll');
            moveit();
        });
    }

    function moveit () {
        tween = TweenMax.to(slide, 0.8, {
            marginLeft: 300,
            onComplete: bodyListen
        });
    }

    bodyListen();
});

2 个答案:

答案 0 :(得分:4)

在处理事件(或与DOM相关的任何操作)时使用标志,因为事件监听器通常可以像异步函数一样运行。

$(document).ready(function () {

    var tween;
    var slide = $('#slide');
    var flag = true;

    function bodyListen () {
        $('body').on('mousewheel.bodyscroll',
        function (e, delta, deltaX, deltaY) {
            if(flag){
                e.preventDefault();
                flag = false;
                moveit();
            }
        });
    }

    function moveit () {
        tween = TweenMax.to(slide, 0.8, {
            marginLeft: 300,
            onComplete: function(){
                flag = true;
            }
        });
    }

    bodyListen();
});

答案 1 :(得分:0)

虽然我自己没有尝试过,但是TweenMax有Kill Tweens ofKillAll允许您杀死补间并可选择在完成之前完成它们。也许不是你想要的,因为它会强制动画完成,但它会让你回到你想要的状态,代码插入很简单。在函数bodyListen的开头

function bodyListen() {
    if(tween) tween.killAll(true)
    .....