【发布时间】:2014-11-20 20:09:43
【问题描述】:
谁能告诉我,为什么以下代码会触发两次事件: http://jsfiddle.net/m8heyzgz/3/ 请打开您的控制台,firefox 或 chrome 有控制台,然后观察结果 你点击'div1',然后 事件演练顺序将是:
- div3
- div2
- div1
- div3
- div2
- div1
据我所知,捕获阶段可以是从上到下,冒泡阶段可以是从目标到父节点。
我的问题是为什么,它以相同的顺序被触发了 2 次?
HTML:
<div id="div1">
<div id="div2">
<div id="div3">
<form>
<ul>
<li>
<label>
<div>
<div>div1</div>
</div>
<div>
<div>div2</div>
</div>
<div>
<input type="checkbox" name="div3" value="div3" />
</div>
</label>
</li>
</ul>
</form>
</div>
</div>
</div>
js:
var d1 = document.getElementById('div1');
var d2 = document.getElementById('div2');
var d3 = document.getElementById('div3');
var f = function(e) {
console.log(e.currentTarget);
}
d1.addEventListener('click', f);
d2.addEventListener('click', f);
d3.addEventListener('click', f);
【问题讨论】:
-
在 Opera 中也可以重现。
-
@juvian,如果您在第一个复选框下添加另一个复选框,您将选中第一个复选框。但是,如果新复选框(如果添加新复选框)也在同一个父级下,为什么在这种情况下只检查第一个复选框?
-
为什么只有第一个?因为只有一个在语法上是有效的。
label只能绑定到一个元素。通过将元素包裹在label中,或者将label的for属性设置为元素的id。
标签: javascript html events addeventlistener