//clicking the link will *not* allow the user to leave the page
myChildElement.onclick = function(e) {
e.preventDefault();
console.log('brick me!');
};
//clicking the parent node will run the following console statement because event propagation occurs
logo.parentNode.onclick = function(e) {
console.log('you bricked my child!');
};
虽然元素的默认功能是砖块化的,但事件继续冒泡DOM .
Event.stopPropagation
第二种方法stopPropagation允许事件的默认功能发生但阻止事件传播:
//clicking the element will allow the default action to occur but propagation will be stopped...
myChildElement.onclick = function(e) {
e.stopPropagation();
console.log('prop stop! no bubbles!');
};
//since propagation was stopped by the child element's onClick, this message will never be seen!
myChildElement.parentNode.onclick = function(e) {
console.log('you will never see this message!');
};
<div class="container">
<a href="#" class="element">Click Me!</a>
</div>
$('.container').on('click', function(e) {
console.log('container was clicked');
});
$('.element').on('click', function(e) {
e.preventDefault(); // Now link won't go anywhere
console.log('element was clicked');
});
结果将是
“元素被点击”
“点击了容器”
现在event.StopPropation它会停止事件的冒泡或事件的升级 . 现在用上面的例子
$('.container').on('click', function(e) {
console.log('container was clicked');
});
$('.element').on('click', function(e) {
e.preventDefault(); // Now link won't go anywhere
e.stopPropagation(); // Now the event won't bubble up
console.log('element was clicked');
});
8 回答
stopPropagation
阻止事件冒泡事件链 .preventDefault
阻止浏览器对该事件进行的默认操作 .让我们说你有
Example
使用
stopPropagation
时,仅调用 buttons click handler 并且 divs click handler 永远不会触发 .就好像你只是
preventDefault
只停止浏览器默认操作但div的点击处理程序仍然会触发 .以下是来自
MDN
和MSDN
的DOM事件对象的一些文档MDN:
event.cancelBubble
event.preventDefault
event.returnValue
event.stopPropagation
对于IE9和FF,您可以使用preventDefault和stopPropagation .
要支持IE8和更低版本,请将
stopPropagation
替换为cancelBubble
,并将preventDefault
替换为returnValue
术语
来自quirksmode.org:
element1的事件处理程序首先触发,element2的事件处理程序最后触发 . 事件冒泡当您使用事件冒泡/
--------------- | | -----------------
| element1 | | |
| ----------- | | -----------
| | element2 | | | |
| ------------------------- |
|活动BUBBLING |
element2的事件处理程序首先触发,element1的事件处理程序最后触发 . 首先捕获在W3C事件模型中发生的任何事件,直到它到达目标元素,然后再次冒泡 . | | /
----------------- | | - | | -----------------
| element1 | | | | |
| ------------- | | - | | -----------
| | element2 \ / | | | |
| -------------------------------- |
| W3C活动模型|
界面
从w3.org开始,用于事件捕获:
对于事件冒泡:
取消活动:
例子
在以下示例中,单击Web浏览器中的超链接将触发事件的流(执行事件侦听器)和事件目标的默认操作(打开新选项卡) .
HTML:
JavaScript的:
Example 1:它会产生输出
Example 2:将
stopPropagation()
添加到该函数中结果输出
事件监听器阻止了事件的进一步向下和向上传播 . 但是它并没有阻止默认操作(新的选项卡打开) .
Example 3:将
stopPropagation()
添加到该函数中或者功能
结果输出
这是因为两个事件侦听器都在同一事件目标上注册 . 事件监听器阻止了事件的进一步向上传播 . 但是,它们并未阻止默认操作(新选项卡打开) .
Example 4:例如,将
preventDefault()
添加到任何函数阻止新标签打开 .
return false;
return false;
在你打电话时会做3件事:event.preventDefault()
- 它会停止浏览器的默认行为 .event.stopPropagation()
- 它阻止事件传播(或“冒泡”)DOM .停止回调执行并在调用时立即返回 .
请注意,此行为与普通(非jQuery)事件处理程序不同,其中,特别是
return false
不会阻止事件冒泡 .preventDefault();
preventDefault();
做了一件事:它停止了浏览器的默认行为 .When to use them?
我们知道他们做了什么但是何时使用它们?这完全取决于你想要完成什么 . 如果您想“仅”阻止默认的浏览器行为,请使用
preventDefault();
. 使用return false;当您想要阻止默认浏览器行为并阻止事件传播DOM时 . 在大多数情况下你会使用return false;你真正想要的是preventDefault()
.Examples:
让我们尝试用例子来理解:
我们将看到纯JAVASCRIPT示例
Example 1:
Example 2:
Example 3:
Example 4:
Example 5:
案例:
从内联事件处理程序返回 false 会阻止浏览器导航到链接地址,但它不会阻止事件通过DOM传播 .
从jQuery事件处理程序返回 false 会阻止浏览器导航到链接地址,并阻止事件通过DOM传播 .
从常规DOM事件处理程序返回 false 什么都不做 .
将看到所有三个例子 .
希望这些例子清楚 . 尝试在html文件中执行所有这些示例,看看它们是如何工作的 .
这是here的引用
Event.preventDefault
preventDefault方法阻止事件携带超出其默认功能 . 例如,您可以在A元素上使用preventDefault来停止单击该元素离开当前页面:
虽然元素的默认功能是砖块化的,但事件继续冒泡DOM .
Event.stopPropagation
第二种方法stopPropagation允许事件的默认功能发生但阻止事件传播:
stopPropagation有效地阻止父元素知道其子元素上的给定事件 .
e.preventDefault()将阻止发生默认事件,e.stopPropagation()将阻止事件冒泡并返回false将同时执行 .
event.stopPropagation()允许执行同一元素上的其他处理程序,而event.stopImmediatePropagation()则阻止每个事件运行 .
event.preventDefault();
停止发生元素的默认操作 .event.stopPropagation();
防止事件冒泡DOM树,防止任何父处理程序被通知事件 .例如,如果在
DIV
或FORM
内附加了单击方法的链接也附加了单击方法,则会阻止DIV
或FORM
单击方法触发 .Event.preventDefault-停止浏览器默认行为 . 现在是什么是浏览器默认行为 . 假设你有一个锚标记,它有一个href属性,这个锚标记嵌套在div标记内,该标记有一个click事件 . 锚标记的默认行为是在它应该导航的锚标记上单击时,但event.preventDefault的作用是它在这种情况下停止导航 . 但它永远不会阻止事件的冒泡或事件的升级,即
结果将是
“元素被点击”
“点击了容器”
现在event.StopPropation它会停止事件的冒泡或事件的升级 . 现在用上面的例子
结果将是
“元素被点击”
欲了解更多信息,请参阅此链接https://codeplanet.io/preventdefault-vs-stoppropagation-vs-stopimmediatepropagation/