聚焦和模糊jQuery事件而不是冒泡

使用以下html结构:

和以下jquery代码:

 $('form').on("focus", function(event) { $("p").append("focus no delegation
"); })

为什么焦点事件没有到达我的事件处理程序? 使用选择器参数绑定事件可以正常工作:

 $('form').on("focus", "input", function(event) { $("p").append("focus delegation
"); })

事件下一个片段的工作原理所以焦点事件实际上是泡沫……

 $('form').on("focus", "span", function(event) { $("p").append("focus delegation
"); })

这两种forms都适用于点击和更改事件:

 $('form').on("click", function(event) { $("p").append("click no delegation
"); }) $('form').on("click", "input", function(event) { $("p").append("click delegation
"); })

我发现关于焦点事件冒泡的唯一注意事项是相对于我不使用的旧jQuery版本。 在这里看到它

编辑1

好吧这令人困惑……根据jQuery的焦点文档:

焦点事件不会在Internet Explorer中冒泡。 因此,依赖于焦点事件的事件委派的脚本将无法跨浏览器一致地工作。 但是,从版本1.4.2开始,jQuery通过在其事件委托方法.live()和.delegate()中将焦点映射到focusin事件来解决此限制。

根据jQuery的焦点文档:

当focusin或其中的任何元素获得焦点时,focusin事件将被发送到元素。 这与焦点事件的不同之处在于它支持在父元素上检测焦点事件(换句话说,它支持事件冒泡)。

对我来说为时已晚还是与另一方相矛盾?

是的,似乎jQuery文档具有误导性。 我认为关于focus的文档忽略了提到这是针对不涉及用户输入的元素(@Ohgodwhy在你的问题的评论中将它们列在上面)。

我想这与浏览器需要将光标捕获到具有focus的输入元素有关,因此它可以接受来自键盘的输入。 换句话说,如果jQuery允许它冒泡,那么你永远不会有机会输入输入字段。

无论哪种方式,你都不会得到一个表格来接受一个focus事件,除非你首先在它上面添加一个tabindex : http : //jsfiddle.net/qxLqP/但是如果基于输入的字段首先获得焦点,它将永远不会冒泡。 默认情况下, form元素没有tabindex ,并且您无法将焦点设置为没有tabindex

我只是接受@ Ohgodwhy使用focusin的解决方案,然后让jQuery团队了解他们令人困惑的文档。

正如Ohgodwhy指出的那样,使用focusin而不是焦点确实有效。

但是,如果“焦点”事件没有冒泡,我无法理解以下代码如何工作:

 $('form').on("focus", "span", function(event) { $("p").append("focus delegation
"); })

如果表单的span子项收到“焦点”事件,则表示事件从输入冒泡到span。 即便如此!

 $('div').on("focus", "form", function(event) { $("p").append("focus delegation
"); })

所以……使用“focusin”确实解决了这个问题,但我并不完全满意这种解决方法。 如果有人有更好的答案,我会高兴地接受它。

Jquery有一个跨浏览器function,负责焦点授权。

Chrome,safari和opera支持名为“DOMFocusIn”的活动,该活动实际上是委托。

IE支持用于委派焦点的事件“focusin”。

Firefox仅支持捕获阶段而非冒泡阶段的“焦点”。

jQuery创建了一个跨浏览器事件,它实际上是委托的“焦点”。

我希望这能解决你所有的疑虑。