-> -> -> document -> window
二、stopPropagation:江湖人称“截胡王”
现在,主角之一 stopPropagation 要登场了!它的作用非常简单粗暴,就是阻止事件继续传播,就像一个“截胡王”,把正在传递的信息直接拦截下来,不让它继续传递下去。
更形象一点说,就像你在微信群里发了一条消息,结果被群主直接撤回了,其他人就看不到了。
stopPropagation 主要用于阻止事件冒泡,也就是说,它可以阻止事件从目标元素向上冒泡到父元素。
我们来修改一下上面的例子,给 father 元素添加一个点击事件监听器,并在监听器中使用 stopPropagation:
const father = document.getElementById('father');
const son = document.getElementById('son');
const grandpa = document.getElementById('grandpa');
father.addEventListener('click', function(event) {
console.log('Father clicked!');
event.stopPropagation(); // 阻止事件冒泡
});
son.addEventListener('click', function(event) {
console.log('Son clicked!');
});
grandpa.addEventListener('click', function(event){
console.log('Grandpa clicked!');
});
现在,如果你点击
Son clicked!
Father clicked!
但是 Grandpa clicked! 不会被输出,因为当事件冒泡到 father 元素时,stopPropagation 阻止了事件继续向上冒泡。
为什么要阻止事件冒泡?
你可能会问,为什么要阻止事件冒泡呢?它有什么用呢?
答案是:为了防止不必要的事件触发,提高代码的效率和可维护性。
举个例子,假设你有一个复杂的表单,其中包含多个嵌套的元素,每个元素都有自己的点击事件监听器。如果你不阻止事件冒泡,那么当你点击最内层的元素时,可能会触发所有父元素的点击事件监听器,导致一些意想不到的错误。
另一个常见的应用场景是:自定义组件。当你创建一个自定义组件时,你可能只想让组件内部的事件处理逻辑生效,而不希望影响到组件外部的元素。
stopPropagation 的进阶用法:stopImmediatePropagation
除了 stopPropagation 之外,还有一个更加霸道的“截胡王”—— stopImmediatePropagation。
stopImmediatePropagation 不仅会阻止事件继续冒泡,还会阻止同一个元素上的其他事件监听器被触发。
我们来修改一下上面的例子,给 father 元素添加两个点击事件监听器,并在第一个监听器中使用 stopImmediatePropagation:
const father = document.getElementById('father');
const son = document.getElementById('son');
const grandpa = document.getElementById('grandpa');
father.addEventListener('click', function(event) {
console.log('Father clicked! - First Listener');
event.stopImmediatePropagation(); // 阻止事件冒泡和同一元素上的其他监听器
});
father.addEventListener('click', function(event) {
console.log('Father clicked! - Second Listener'); // 这行代码不会被执行
});
son.addEventListener('click', function(event) {
console.log('Son clicked!');
});
grandpa.addEventListener('click', function(event){
console.log('Grandpa clicked!');
});
现在,如果你点击
Son clicked!
Father clicked! - First Listener
可以看到,Father clicked! - Second Listener 和 Grandpa clicked! 都没有被输出,因为 stopImmediatePropagation 阻止了事件冒泡和 father 元素上的第二个监听器被触发。
总结一下 stopPropagation 和 stopImmediatePropagation 的区别:
方法
作用
stopPropagation()
阻止事件继续冒泡到父元素,但同一个元素上的其他事件监听器仍然会被触发。
stopImmediatePropagation()
阻止事件继续冒泡到父元素,并且阻止同一个元素上的其他事件监听器被触发。
三、preventDefault:江湖人称“反默认行为大师”
接下来,我们来认识一下另一位主角—— preventDefault。它的作用是阻止元素的默认行为,就像一个“反默认行为大师”,专门跟那些“固执己见”的元素作对。
什么是元素的默认行为呢?
不同的元素有不同的默认行为,比如:
点击 标签会跳转到指定的链接。
提交