防止在jQuery中执行排队的事件

bxjv4tth  于 2022-12-22  发布在  jQuery
关注(0)|答案(2)|浏览(100)

我有一个为两个事件触发的处理程序:
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),功能失败,因为两个切换互相抵消。所以,我需要的是一种方法来清除一个元素的所有挂起事件。

rdrgkggo

rdrgkggo1#

您可能正在寻找event.preventDefault()
如果调用此方法,则不会触发事件的默认操作。
或者,您可能需要.unbind()一个事件,然后在触发另一个事件后重新绑定它。
.undelegate()可以满足您的需求:
根据一组特定的根元素,从与当前选择器匹配的所有元素(现在或将来)的事件中移除处理程序。

f0brbegy

f0brbegy2#

在事件处理程序中使用event.stopImmediatePropagation()

说明:阻止执行其余的处理程序,并防止事件在DOM树中向上冒泡。

文件:http://api.jquery.com/event.stopImmediatePropagation/
如果您跟踪触发的事件,并在其他事件已经被调用时阻止调用toggle,会怎么样呢?

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"),处理程序也只被调用了一次。

相关问题