防止在jquery中执行排队事件

时间:2010-09-07 10:10:46

标签: javascript javascript-events jquery

我有一个为两个事件触发的处理程序:

  1. 模糊对象A的触发器。
  2. 点击对象B。
  3. 问题是当对象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),因此功能失败,因为两个切换相互抵消。所以,我需要的是一种清除元素的所有待处理事件的方法。

2 个答案:

答案 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中进行了测试。