【发布时间】:2015-08-06 05:41:15
【问题描述】:
我只是好奇,需要对以下情况进行一些解释。
假设我有一个复选框类型的输入元素,并附加了一个事件监听器,用于监听点击事件。我阻止复选框的默认行为并记录复选框的选中状态,该状态将始终返回 true。
复选框的视觉表示告诉我它没有被选中。所以我会假设检查状态会返回假。我确信这一定是愚蠢的,我在这里肯定误解了一些东西。有趣的是,我也在记录事件本身。在目标属性内部,checked 属性设置为 false,正如我所预料的那样。
据我了解,prevent default 会在不停止传播的情况下取消事件,那么这里到底发生了什么?
如果有人能在这方面启发我,那就太好了。这是一个例子。
var checkbox = document.getElementsByTagName('input')[0],
output = document.getElementById('output');
checkbox.addEventListener('click', function(evt) {
evt.preventDefault();
output.innerHTML = "Checkbox checked attribute is " + this.checked;
console.log(this.checked, evt.target.checked);
console.log(evt);
}, false);
<input type="checkbox" id="my-checkbox" />
<label for="my-checkbox">Checkbox with preventDefault().</label>
<div id="output"></div>
【问题讨论】:
-
我不确定,但似乎事件的默认操作在冒泡停止后实际上被取消了,因为如果您记录复选框的选中属性,以及事件的阶段在父元素中,您会注意到它仍然是正确的(并且阶段是 3,这意味着冒泡)。它保持
true直到窗口,然后,我假设preventDefault()实际上阻止了默认操作,将其设置为false:jsfiddle.net/j52ggg7x -
这也可能有用:jsfiddle.net/j52ggg7x/1,超时为 0(将超时功能推到“结束”),检查值将为 false,eventPhase 将为
0. -
感谢阿方索的例子。那么这是否意味着在冒泡阶段的最外层对象(在本例中为窗口对象)阻止了默认行为?
-
会这样做,只需要再等 8 个小时,我就可以开始一场比赛了。 :-)
-
@Liam 感谢 Liam,即使感觉很奇怪,这也可能是预期的行为。这个 bug 已经很老了,所以既然什么都没有改变,那实际上可能就是它的设计方式。但如果是这样,那一定是有原因的,我很想理解它。 ;-)
标签: javascript checkbox