pet*_*ter 9 html javascript checkbox preventdefault stoppropagation
我最近遇到过这种情况(这里简化).只需用一个元素包装一个复选框,并在它的click事件上应用preventDefault(),然后该复选框将被取消选中.
看到这个小提琴,但这里是一个剪辑:
<div>
<input type="checkbox"/>
</div>
/* Wrapper could be any element (and any ancestor element will work) */
$('div').on('click', function(e){
e.preventDefault();
});
/* Uncomment to make the checkbox work again
$('input').on('click', function(e){
e.stopPropagation();
});
*/
Run Code Online (Sandbox Code Playgroud)
行为发生在Chrome和FF中,所以我认为这是有意的.
为什么已经在复选框上触发的click事件不会导致复选框被切换?在preventDefault
对祖先好像它应该是风马牛不相及的孩子复选框的行为.似乎,为了发生复选框更改,click事件需要一直自由地冒泡到文档根目录.
这里发生了什么?
Ber*_*rgi 12
对祖先的preventDefault似乎应该与子复选框的行为无关.
不,不是真的.事件起泡,所有处理程序(包括祖先的处理程序)都可能影响它.
似乎,为了发生复选框更改,click事件需要一直自由地冒泡到文档根目录.
不完全是.它不需要到达文档根目录,但它不能被默认阻止.
您可能希望阅读DOM规范中有关事件流,默认操作和可取消事件的体系结构说明.
那么一步一步发生什么呢?
<input>
<div>
,它被处理.您的事件侦听器调用该preventDefault
方法,设置内部cancelled
标志.如果取消注释代码的第二部分,则步骤6+看起来不同:
<input>
.您的侦听器调用该stopPropagation
方法preventDefault
防止触发浏览器的默认操作.更改复选框的选中状态或跟随href
锚点,提交表单等是默认操作.preventDefault
在允许事件传播的同时阻止它们.
这与事件传播不同(您可以 - 正如您所指出的那样 - 停止stopPropagation
).在调用浏览器的默认行为之前,事件将在整个侦听器层次结构中传播(除非被阻止).