事件对象(二)
冒泡和默认行为
如果在页面中重叠了多个元素,并且重叠的这些元素都绑定了同一个事件,那么就会出现冒泡问题。
例,html代码如下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>事件对象</title> <script type="text/javascript" src="jquery-1.12.3.js"></script> <script type="text/javascript" src="demo.js"></script> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <div style="width: 200px; height: 200px; background-color: #ccc;"> <input type="button" value="按钮" /> </div> </body> </html>
三个不同元素触发事件:
注意:当我们点击文档的时候,只触发文档事件;当我们点击div层时,触发了div和文档两个;当我们点击按钮时,触发了按钮、div和文档。触发的顺序是从小范围到大范围。
这就是所谓的冒泡现象,一层一层往上。
jQuery提供了一个事件对象的方法:event.stopPropagation();这个方法设置到需要触发的事件上时,所有上层的冒泡行为都将被取消。
阻止冒泡:
//冒泡和阻止冒泡 $("input").click(function(e) { e.stopPropagation(); //禁止冒泡 alert("按钮被触发!"); }); $("div").click(function(e) { e.stopPropagation(); //禁止冒泡 alert("div层被触发了!"); }); $(document).click(function() { alert("文档页面被触发了!"); });
网页中的元素,在操作的时候会有自己的默认行为。比如:右击文本框输入区域,会弹出系统菜单、点击超链接会跳转到指定页面、点击提交按钮会提交数据。
如html(部分)代码:
<div style="width: 200px; height: 200px; background-color: #ccc;"> <input type="button" value="按钮" /> <a href="http://www.ycku.com" target="_blank">ycku.com</a> </div>
jQuery代码:
$("a").click(function(e) {
e.preventDefault(); //阻止默认行为
alert("ycku.com");
});
禁止提交表单跳转:
html(部分)代码如下:
<form action="123.html"> <div style="width: 200px; height: 200px; background-color: #ccc;"> <input type="submit" value="按钮" /> <a href="http://www.ycku.com" target="_blank">ycku.com</a> </div> </form>
方式①禁止提交表单跳转:
//禁止表单提交 $("input").click(function(e) { e.preventDefault(); //阻止默认行为 alert("表单提交"); });
方式②禁止提交表单跳转:
//禁止表单提交 $("form").submit(function(e) { e.preventDefault(); });
注意:如果想让上面的超链接同时阻止默认行为且禁止冒泡行为,可以把两个方法同时写上:event.stopPropagation()和event.preventDefault()。这两个方法如果需要同时启用的时候,还有一种简写方案代替,就是直接return false。
//阻止冒泡又禁止默认行为 $("a").click(function(e) { e.preventDefault(); e.stopPropagation(); alert("ycku.com"); });
或者
$("a").click(function(e) {
alert("ycku.com");
return false;
});
冒泡和默认行为的一些方法
| 方法名 | 描述 |
| preventDefault() | 取消某个元素的默认行为 |
| isDefaultPrevented() | 判断是否调用了preventDefault()方法 |
| stopPropagation() | 取消事件冒泡 |
| isPropagationStopped() | 判断是否调用了stopPropagation()方法 |
| stopImmediatePropagation() | 取消事件冒泡,并取消该事件的后续事件处理函数 |
| isImmediatePropagationStopped() | 判断是否调用了stopImmediatePropagation()方法 |
html代码如下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>事件对象</title> <script type="text/javascript" src="jquery-1.12.3.js"></script> <script type="text/javascript" src="demo.js"></script> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <form action="123.html"> <div style="width: 200px; height: 200px; background-color: #ccc;"> <input type="submit" value="按钮" /> <a href="http://www.ycku.com" target="_blank">ycku.com</a> </div> </form> </body> </html>
jQuery代码如下:
$(document).click(function() { alert("document"); }); $("div").click(function(e) { alert("div"); }); $("a").click(function(e) { e.preventDefault(); e.stopPropagation(); alert(e.isDefaultPrevented()); //true alert(e.isPropagationStopped()); //true });
还能这样判断:
$("a").click(function(e) {
e.preventDefault();
e.stopPropagation();
});
$("a").click(function(e) {
alert(e.isDefaultPrevented()); //true
alert(e.isPropagationStopped()); //true
});
取消冒泡并取消后续事件处理函数:
$("a").click(function(e) {
e.stopImmediatePropagation();
alert(e.isImmediatePropagationStopped()); //true
alert("a1");
});
$("a").click(function(e) {
alert("a2");
});
$("div").click(function(e) {
alert("div");
});
$(document).click(function() {
alert("document");
});

浙公网安备 33010602011771号