解绑后如何“重新绑定”点击事件(“点击”)?

时间:2010-04-07 14:19:33

标签: jquery animation bind unbind

我将锚标记<a class="next">next</a>制作成“按钮”。有时,如果没有新的内容可以显示,则需要隐藏此标记。如果我只是用.hide()隐藏按钮并使用.show()重新显示它,一切正常。但我想改用.fadeIn()和.fadeOut()。

我遇到的问题是,如果用户在fadeOut动画期间点击按钮,可能会导致我运行该节目的逻辑出现问题。我找到的解决方案是在原始单击函数开始后从按钮解除绑定事件,然后在动画完成后重新绑定它。

$('a.next').click(function() {
    $(this).unbind('click');
    ...
    // calls some functions, one of which fades out the a.next if needed
    ...
   $(this).bind('click');
}

上面示例的最后一部分不起作用。 click事件实际上并未重新绑定到锚点。有没有人知道完成这个的正确方法?

我是一个自学成才的jquery家伙,所以像unbind()和bind()等一些更高级别的东西都在我脑海中,而jquery文档对我来说并不是很简单。

3 个答案:

答案 0 :(得分:15)

我只想添加一张支票,看看它是否先制作动画:

$('a.next').click(function() {
    if (!$(this).is(":animated")) {
        // do stuff
    }
});

答案 1 :(得分:6)

重新绑定点击事件时,您将重新开始。您需要提供要处理事件的函数。在你打电话给“unbind”之后,jQuery不会为你记住它们。

在这种特殊情况下,它有点复杂。问题在于,当您启动这些动画时,您将启动一系列由计时器驱动的动作。因此,解除绑定并重新绑定点击处理程序本身中的“click”处理程序实际上无济于事。什么 帮助(假设您不想用is(":animated")技巧解决问题)将取消绑定处理程序,然后重新绑定动画中的“完成”回调。 / p>

首先设置“click”处理程序时,可以将函数声明与“click()”调用分开:

var handler = function() {
  $(this).whatever();
};
$('a.next').click(handler);

然后,如果您最终想要取消绑定/重新绑定,您可以重复调用“click”并以相同的方式引用“handler”函数。

答案 2 :(得分:2)

更简单的解决方案

  

(不使用bind / unbind方法)

是要向对象添加一个类,如果你要取消绑定它,然后删除这个类来重新绑定ex;

$('#button').click( function(){
   if($(this).hasClass('unbinded')) return;
   //Do somthing
 });

$('#toggle').click(function(){
    $('#button').toggleClass('unbinded');
 });