【发布时间】:2012-03-06 04:38:18
【问题描述】:
具有以下html结构:
<div>
<form><span><input></span></form>
</div>
<p>
以及下面的jquery代码:
$('form').on("focus", function(event) {
$("p").append("focus no delegation<br>");
})
为什么焦点事件没有到达我的事件处理程序?使用选择器参数绑定事件可以正常工作:
$('form').on("focus", "input", function(event) {
$("p").append("focus delegation<br>");
})
事件下一个 sn-p 工作,所以焦点事件实际上会冒泡......
$('form').on("focus", "span", function(event) {
$("p").append("focus delegation<br>");
})
两种形式都适用于点击和更改事件:
$('form').on("click", function(event) {
$("p").append("click no delegation<br>");
})
$('form').on("click", "input", function(event) {
$("p").append("click delegation<br>");
})
我发现的关于焦点事件冒泡的唯一说明是相对于我不使用的旧 jQuery 版本。亲身体验here
编辑 1
这很令人困惑……根据 jQuery 的焦点文档:
焦点事件在 Internet Explorer 中不会冒泡。因此,依赖于具有焦点事件的事件委托的脚本将无法在浏览器中一致地工作。然而,从 1.4.2 版本开始,jQuery 通过在其事件委托方法 .live() 和 .delegate() 中将焦点映射到 focusin 事件来解决此限制。
根据jQuery的focusin doc:
focusin 事件在元素或其中的任何元素获得焦点时发送到该元素。这与焦点事件的不同之处在于它支持检测父元素上的焦点事件(换句话说,它支持事件冒泡)。
对我来说太晚了还是两者相矛盾?
【问题讨论】:
-
你试过把 $('form').on("focus", function(event){ 改成, $('form').on("focus", "input", function (事件){ ?
-
尝试添加原生 javascript 事件处理程序,看看会发生什么
-
@Ohgodwhy:这不是我在第三个代码块中发布的内容吗?
-
jQuery 使用 WC3 有效调用 'focusin',其中 #1 不允许冒泡,而 #2 不允许出现以下元素以外的任何内容 -> LABEL、INPUT、SELECT、TEXTAREA和按钮。
-
可以使用jQuery的focusin方法,但不能使用focus方法,因为它不支持冒泡。
标签: javascript jquery event-handling