从jquery中的函数解除绑定时,在链接上返回false



我有一个奇怪的问题,我在jQuery中编程了一个旋转木马类型的动画。我有它,这样当你点击链接时,它会为div.为了防止链接在动画中被点击,我设置了一个绑定条件,链接绑定到动画,但在动画中它是未绑定的,然后在最后重新绑定。小提琴最能证明:http://jsfiddle.net/aRrmD/1/.

这一切在菲德尔都表现得非常好。然而,当我把它放在一个实际的网页中时,如果你快速点击链接两次,效果就不太好了——你得到的是第一次点击会触发动画,但第二次点击会重新加载页面,因为链接在动画过程中没有绑定到动画功能,因此,链接的默认行为开始生效,它成为一个标准链接,直到动画完成,函数绑定回它。因此,如果你双击链接,它会在第二次单击时重新加载页面。我不知道为什么它没有在Fiddlr中这样做,这一定与事件如何与该系统一起工作有关,这使它与独立页面不同。

所以我想做的是,当链接没有绑定时(即在动画中),防止默认的链接默认行为。我知道我可以通过让锚不是锚来解决这个问题,但这是一个更广泛的系统的一部分,不幸的是,我无法控制它。

谢谢各位的指点。。。

您可以测试动画是否正在进行,而不是解除绑定和绑定事件处理程序:

function moveNext(e) {
    e.preventDefault();
    var $carousel = $('.carousel');
    if(!$carousel.is(':animated')) {
        $carousel.animate({
            marginLeft: '-=' + widthOfItem
        }, 500)
    }
}

参考::animated


如果您真的想解除绑定和绑定事件处理程序,请添加另一个事件处理程序。它总是阻止默认操作:

$('.btn-next').bind('click', false); // will always prevent the default action
$('.btn-next').bind('click', moveNext);

false传递到.bind与传递function() { return false;)相同。这可以防止默认操作事件冒泡,因此它可能正是您想要的。但你可以简单地通过function(e) { e.preventDefault(); }

然后,您只解除绑定moveNext:,而不是解除绑定所有事件处理程序

$('.btn-next').unbind(moveNext);

您应该缓存对$('.btn-next')的引用,或者使用$(this)

最新更新