我有一个为两个事件触发的处理程序:
问题是当对象A有焦点并且我点击B时,两个事件都被触发。我想阻止这种情况发生。在这种情况下,处理程序应该只执行一次,因为在其中有一个toggle()由于第二次调用而无效。有什么方法可以清除对象上的所有待处理事件吗?
<div id='panel'>Hey!</div>
<input type='text' id='a'>
<div id='b'>Hello</div>
function handler() {
$('#panel').toggle();
}
$('#a').blur(handler);
$('#b').click(handler);
当文本框具有焦点和时,用户点击div'b',会触发两个事件 - 模糊输入 a 和点击 b 的。这两个事件都由相同的函数处理,并且由于该函数偶然切换了另一个元素(panel),因此功能失败,因为两个切换相互抵消。所以,我需要的是一种清除元素的所有待处理事件的方法。
答案 0 :(得分:1)
您可能正在寻找event.preventDefault()
:
如果调用此方法,则不会触发事件的默认操作。
或许,您可能需要.unbind()
一个事件,然后在另一个事件被触发后重新绑定它。
.undelegate()
可以做你想要的事情:
从事件中删除与当前选择器匹配的所有元素的处理程序, 现在或将来,基于一组特定的根元素。
答案 1 :(得分:1)
在事件处理程序中使用 event.stopImmediatePropagation()
。
描述 :保持其余处理程序不被执行,并防止事件冒泡DOM树。
文档:http://api.jquery.com/event.stopImmediatePropagation/
如果你跟踪发射的事件怎么办?如果已经调用了另一个,阻止切换被调用?
var called = false;
function handler() {
if (!called) {
called = true;
$('#panel').toggle(1, function () { // change the duration to your liking
called = false;
});
}
}
$('#a').blur(handler);
$('#b').click(handler);
尚未测试,但我相信这应该有用。
编辑:它工作正常,但是当我测试原始处理程序时,我没有得到你说你得到的行为 - 处理程序只被调用一次,即使在你描述的情况下(聚焦输入,点击在“b”)。我在FF 3.6,IE8和Chrome 5中进行了测试。