jQuery暂时解除绑定事件

12

也许在处理jQuery的事件时我完全忽略了某些东西,但这是我的问题。

假设存在一些事件绑定,例如

$(element).bind("mousemove", somefunc);

现在,我想介绍一种新的mousemove绑定方式,它不会覆盖先前的绑定,而是暂时排除(解绑)它。换句话说,在绑定我的函数时,我必须确保没有其他函数会为该事件执行,直到我恢复它们。

我正在寻找类似于以下内容的东西:

$(element).bind("mousemove", somefunc);
// Somefunc is used regularly
var savedBinding = $(element).getCurrentBinding("mousemove");
$(element).unbind("mousemove").bind("mousemove", myfunc);
// Use myfunc instead
$(element).unbind("mousemove", myfunc).bind("mousemove", savedBindings);
当然,somefunc 不在我的控制之下,所以这将是无用的 :) 我的理解是可以将多个函数绑定到同一个事件上,并且这些函数的执行顺序不能被预先确定。 我知道如何停止事件传播和立即事件传播,但我认为它们在我的情况下是无用的,因为执行顺序无法确定(但也许我弄错了)。 我该如何做到这一点? 编辑:我需要强调这一点:我需要先前安装的处理程序(somefunc)不被执行。我没有定义该处理程序,可能存在或不存在,但由第三方用户安装。 编辑2:好吧,现在这是不可行的,我想我需要使用 eventListenerList,但大多数浏览器还没有实现。 http://www.w3.org/TR/2002/WD-DOM-Level-3-Events-20020208/changes.html
2个回答

7
另一种方法可能是使用自定义事件,大致如下:
var flag = 0;
$(element).bind("mousemove", function() {
    if(flag) {
        $(this).trigger("supermousemove");
    } else {
        $(this).trigger("magicmousemove");
    }
}).bind("supermousemove", function() {
    // do something super
}).bind("magicmousemove", function() {
    // do something magical
}); 

$("#foo").click(function() {
    flag = flag == 1 ? 0 : 1; // simple switch
});

这里有一个非常恼人的演示:http://jsfiddle.net/SkFvW/


抱歉,我错了:那个解决方案不起作用,因为我需要禁用之前绑定的mousemove处理程序。 - AkiRoss
@AkiRoss - 你为什么需要禁用先前的处理程序?通过翻转开关,你可以获得相同的效果。 - JasCav
@Jason,因为如果用户将一个函数绑定到一个事件上,而我正在引入新的事件,我可能需要拦截该事件并触发另一个事件,而不让原始函数被执行。 - AkiRoss

0

如果事件绑定到多个元素上会更好:

$('.foo').click(function() {
    if ( ! $(this).hasClass('flag')) {
        do something
    }
});

(将类“flag”添加到解除绑定,将其添加到“bind”)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接