我有一个为两个事件触发的处理程序:
1.对象A的模糊触发。
1.单击对象B。
问题是当对象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',将触发两个事件-input * a * 的 * blur * 和div * b * 的 * click *。这两个事件由同一个函数处理,并且由于该函数附带地切换了另一个元素 (panel),功能失败,因为两个切换互相抵消。所以,我需要的是一种方法来清除一个元素的所有挂起事件。
2条答案
按热度按时间rdrgkggo1#
您可能正在寻找
event.preventDefault()
:如果调用此方法,则不会触发事件的默认操作。
或者,您可能需要
.unbind()
一个事件,然后在触发另一个事件后重新绑定它。.undelegate()
可以满足您的需求:根据一组特定的根元素,从与当前选择器匹配的所有元素(现在或将来)的事件中移除处理程序。
f0brbegy2#
在事件处理程序中使用
event.stopImmediatePropagation()
。说明:阻止执行其余的处理程序,并防止事件在DOM树中向上冒泡。
文件:http://api.jquery.com/event.stopImmediatePropagation/
如果您跟踪触发的事件,并在其他事件已经被调用时阻止调用toggle,会怎么样呢?
还没测试过,但我相信应该能用。
编辑:它工作得很好,但话说回来,当我测试最初的处理程序时,我没有得到您所说的行为--即使在您描述的情况下(聚焦输入,单击"b"),处理程序也只被调用了一次。