1.什么是事件冒泡?
事件冒泡是指事件由子级传向父级,事件冒泡常常会使事件按照不属于我们原本的方式进行,影响我们正常处理事件的流程。
下边的代码 通过控制台 可以看出事件冒泡的流程。
<body>
<div id="info">
<div class="box-1" onclick="box1()">
<p>最外层</p>
<div class="box-2" onclick="box2()">
<p>第二层</p>
<div class="box-3" onclick="box3()">
<p>第三层</p>
<div class="box-4" onclick="bubbles()">
<p>最底</p>
</div>
</div>
</div>
</div>
</div>
<script>
function box1() {
console.log("最外层盒子被点击了");
}
function box2() {
console.log("第二个盒子被点击了");
}
function box3() {
console.log("第三个盒子被点击了");
}
function bubbles() {
console.log("最底层盒子被点击了")
}
</script>
</body>
控制台
上边的是点击 最底 出现的结果,只点击了 一个子级标签,却触发了四个点击事件,并且是从子级向父级的过程,这就是 事件冒泡。
2.阻止冒泡
<body>
<div id="info">
<div class="box-1">
<p>最外层</p>
<div class="box-2">
<p>第二层</p>
<div class="box-3">
<p>第三层</p>
<div class="box-4">
<p>最底</p>
</div>
</div>
</div>
</div>
</div>
<script>
var box1 = document.querySelector(".box-1");
var box2 = document.querySelector(".box-2");
var box3 = document.querySelector(".box-3");
var box4 = document.querySelector(".box-4");
//使用 e.stopPropagation() 阻止冒泡
box1.onclick = function (e) {
e.stopPropagation();
console.log("最外层");
}
box2.onclick = function (e) {
e.stopPropagation();
console.log("第二层");
}
box3.onclick = function (e) {
e.stopPropagation();
console.log("第三层");
}
box4.onclick = function (e) {
e.stopPropagation();
console.log("最底层");
}
</script>
</body>
控制台
阻止冒泡后,点击最底, 不会触发 其他父级的点击事件
3.默认行为
在html中有很多自带默认事件的元素,典型例子是:单击<a>标签后,会自动跳转到href指定的URL链接,单击表单的submit按钮后,会自动将表单数据提交到指定的服务器端页面处理,因此我们把标签 具有的这种行为称为默认行为。
4.阻止默认事件
<body>
<a href="https://www.baidu.com">百度</a>
</body>
<script>
var a = document.querySelector("a");
//方式1:DOM标准写法,早期版本不支持
a.addEventListener('click', function (e) {
e.preventDefault();
})
//方式2:推荐的使用注册方式
a.onclick = function (e) {
e.preventDefault(); //标准浏览器使用e.prenventDefault();
e.returnValue; //早期浏览器(IE6 - IE8)使用returnValue属性
}
</script>