在jQuery 1.4.2中,绑定相同的事件两次会触发两次。

4
如果你遇到了类似这样的问题:
jQuery(selector).focus(function(){...});
jQuery(selector).focus(function(){...});

焦点会触发两次,有什么方法可以纠正/防止这种情况发生吗?
3个回答

9
使用 data('events') 查找事件处理程序:
var isBound = function(el, ev) {
    var found = false;
    $.each($(el).data("events"), function(i, e) {
        if (i === ev) {
            found = true;
        }
    });
    return found;
}

if (!isBound(selector, 'focus')) {
    $(selector).bind('focus', fn);
}

我认为你也可以使用jQuery中的.one()函数,参考http://api.jquery.com/one/


1
非常重要的一点是,.one() 只会触发一次。因此,一旦执行它,它就会被解除绑定。如果您希望它只绑定一次,但可以无限执行,则可以使用 jQuery Sparkle 的 once,它的工作方式与 bind 相同(但仅绑定一次): http://github.com/balupton/jquery-sparkle/blob/9921fcbf1cbeab7a4f2f875a91cb8548f3f65721/scripts/resources/jquery.events.js#L41 - balupton

3
您可以使用unbind来删除早期的处理程序。您如何使用它取决于您试图避免两个处理程序首先触发的原因。

我不认为那是一个好的解决方案。我在考虑在绑定之前检查它是否已经被绑定,但我不知道该怎么做。 - Adrian Crapciu
我可以问一下你在这里想要实现什么吗? - user11977
例如,通常人们尝试做类似于您所要求的事情,以便在页面上动态出现新元素时,您可以将相同的事件处理程序附加到它们上,而不会影响原始元素。但在这种情况下,您应该使用http://api.jquery.com/live/。 - user11977
我知道委托/代理,但这是另一回事。不管怎样,现在它可以工作了,感谢您的帮助。 - Adrian Crapciu

1
尝试使用事件命名空间并使用 bind:
var fnFocus = function(){ ... };
$(selector).bind('focus.namespace',fnFocus);

$(selector).unbind('focus.namespace').bind('focus.namespace',fnFocus);

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