[英]Why does the form submit event fire when I have stopped propagation at the submit button level?
HTML
<form>
<input type='text'>
<button type='submit'>Submit</button>
</form>
JavaScript的
$('form').on('submit', function(e) {
alert('submit');
e.preventDefault();
});
$('button').on('click', function(e) {
e.stopPropagation();
alert('clicked');
});
观看精彩的视频后在这里 ,我明白,当我点击提交按钮,事件冒泡到窗体,然后将表单提交事件被触发。 这解释了为什么“clicked”在“submit”之前被警告(在我将e.stopPropagation()
添加到按钮处理程序之前)。
但是当我将e.stopPropagation()
添加到按钮处理程序时,“提交”仍然会被警告。 为什么? 我认为stopPropagation
可以阻止事件冒泡到form
,因此form.on('submit')
监听器不应该“听到”一个事件。
当您单击表单中的提交按钮时,单击事件会在按钮上生成并冒泡。 提交事件在表单上生成(而不是按钮)并从那里冒泡。
如果停止在click事件上传播,则只是停止click事件的冒泡阶段。 这对提交事件没有影响。
要停止提交操作,您必须向提交处理程序添加一个检查。
请记住,在按钮中的单击处理程序上添加e.preventDefault()
不足以阻止生成提交事件,因为有更多方法可以提交表单而不仅仅是单击按钮。 (例如,在输入字段中按Enter键 )。
看到处理程序
$('button').on('click', function(e) {
e.stopPropagation();
请注意,该事件是click
,因此您要阻止click
事件向上传播,并且根本不与submit
事件交互,仍然会触发,因为提交按钮的默认操作是提交表单,以及停止这种方法的方法是使用preventDefault
防止该默认操作
换句话说, stopPropagation
仅停止正在处理的当前事件传播到父元素,它不会停止元素的默认行为,那就是preventDefault
!
你需要e.preventDefault();
在按钮单击中:
$('form').on('submit', function(e) { alert('submit'); e.preventDefault(); }); $('button').on('click', function(e) { e.preventDefault(); alert('clicked'); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form> <input type='text'/> <button type='submit'>Submit</button> </form>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.