【问题标题】:jQuery event triggers twicejQuery 事件触发两次
【发布时间】:2014-02-10 08:24:59
【问题描述】:

谁能解释一下为什么这个事件会触发两次?在 1.7 之前的 jQuery 版本上似乎没有这样做。

<input type="textbox" id="box" onblur="console.log('This will trigger twice!');"/>
<script>
$('#box').blur();
</script>

小提琴: http://jsfiddle.net/EWbmD/52/

【问题讨论】:

  • 为我触发一次。你用什么浏览器?
  • 我试过 Chrome、IE11 和 Firefox。一切似乎都有问题。 (请注意,控制台倾向于“分组”重复消息,因此您可能只会在控制台中获得一行,但在某处带有“(2)”)
  • 是的,我知道,但仍然只有一次 :)
  • 好的,现在我看到了你的问题,之前由于某种原因显示过一次。
  • 用 firbug jsfiddle.net/EWbmD/56检查这个

标签: jquery events


【解决方案1】:

从内部来看,触发blur 事件似乎是在内部触发blurfocusout 事件,这两次调用onblur

概念验证

$('#box').on('blur focusout', function (e) {
    console.log('this too', e.type);
});
$('#box').blur();

演示:Fiddle

blur 事件是非冒泡事件,冒泡对应事件是 foucsout 事件。所以在正常情况下,模糊操作会触发这两个事件。因此 jQuery 试图变得智能并在发生模糊事件时触发这两个事件,但看起来实现中存在错误。

【讨论】:

  • 有谁知道这是一个 jQuery 错误,还是预期的行为?如果有意,您将如何修改/修复我的代码并仍然保留内联“onBlur”?我不想使用 jQuery.on() 进行绑定。
  • @SleepMachine 我不认为这是缩进行为,因为它应该调用 onbluronfocusout 处理程序而不是调用 onblur 两次 - jsfiddle.net/arunpjohny/SvqwF/4
  • 顺便说一句,甚至不符合 W3C 规范。模糊:当事件目标失去焦点时,用户代理必须调度此事件。 必须在调度此事件之前从元素获取焦点 类型。此事件类型类似于 focusout,但在焦点转移后调度,并且不会冒泡。 w3.org/TR/DOM-Level-3-Events/#events-focusevent
  • 我知道这是一个老话题,但它似乎并没有在 jQuery 中得到修复。有人知道这是否在任何人的名单上吗?我注意到 .trigger("onblur") 有效,因为 onblur 事件处理程序只被触发一次。用“onblur”代替“blur”好吗?
【解决方案2】:

编辑:这可能是您的问题的解决方案。

JSFIDDLE http://jsfiddle.net/SvqwF/7/

基于focusout


你触发了两次,因为.blur()被触发了

.on('blur focusout', function(){}) (Thanks to @Arun P Johny)

如果您没有将函数传递给.blur(),它只会触发您添加的内联event listenerJSFIDDLE

由于您添加了一个内联函数,该函数会被触发两次。

说明:将事件处理程序绑定到“模糊”JavaScript 事件,或在元素上触发该事件。 jQuery .blur()

要了解更多关于 jQuery 所涉及的方法(对于旧的 IE .attachEvent):

要为目标注册多个事件侦听器,请为同一目标调用 addEventListener() 但具有不同的事件类型或捕获参数。 MDN

注意:我不确定要在.on() 中声明哪个事件,似乎一切正常

W3C 将焦点和模糊事件指定为不冒泡,但 jQuery 定义了会冒泡的跨浏览器“focusin”和“focusout”事件。当 "focus" 和 "blur" 用于附加委托事件处理程序时,jQuery 映射名称并将它们分别作为 "focusin" 和 "focusout" 传递。 jQuery .on()

注意 2: blur() &lt;- emptytrigger('blur') 的快捷方式。 JSFIDDLE

【讨论】:

    【解决方案3】:

    你只需要调用一次:

    $('#box').on('blur', function() {
        console.log('This will trigger twice!');
    });
    
    $('#box').blur();
    

    Updated Fiddle

    或者只是删除您的 jQuery 代码并将您的 onblur 事件保留在您的 input 标记中。

    【讨论】:

    • 但问题是为什么要被叫两次
    • 因为他调用了两次?一个是onblur,一个是通过jQuery触发的?
    • no.. 如果您在 Chrome 中打开小提琴并只看到控制台,则会记录两次消息
    猜你喜欢
    • 2015-01-06
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多