`
lk557
  • 浏览: 142419 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

stopPropagation, preventDefault 和 return false 的区别

 
阅读更多

因为有父, 子节点同在, 因为有监听事件和浏览器默认动作之分. 使用 JavaScript 时为了达到预期效果经常需要阻止事件和动作执行. 一般我们会用到三种方法, 分别是stopPropagation(), preventDefault()return false. 它们之间有什么区别, 该何时使用呢? 将在本文中进行讲解.

术语

监听事件, 在在节点上能被监听的页面操作. 如: select 节点的 change 事件, a 节点的 click 事件.
浏览器默认动作, 指特定页面元素上带有的功能. 如: 点击 a 链接节点的跳转动作, 表单提交动作.

stopPropagation()

因为事件可以在各层级的节点中传递, 不管是冒泡还是捕获, 有时我们希望事件在特定节点执行完之后不再传递, 可以使用事件对象的 stopPropagation() 方法.

假设页面上存在一个浮动弹出层, 显示在最前面, 当点击弹出层以外页面区域时, 隐藏弹出层. 为了做到这样的效果, 我们会监听 documentElement 的 click 事件, 一旦事件被触发即隐藏弹出层. 但是...

这显然存在问题. 当用户点击弹出层时, 我们不希望它隐藏掉. 但因为事件的冒泡传递, documentElement 的 click 事件也会被触发. 这个时候, 我们可以监听弹出层的 click 事件, 并使用stopPropagation() 方法阻止冒泡. 请参考下面的代码.

// 在弹出对话框上点击时, 不进行任何页面操作, 并阻止冒泡
document.getElementById('dialog').onclick = function(ev) {
ev.stopPropagation();
};

// 在 documentElement 节点上监听到点击事件时, 隐藏对话框
document.documentElement.onclick = function(ev) {
document.getElementById('dialog').style.display = 'none';
};

stopPropagation() 相当好用, 可是 IE8 及以前版本都不支持. IE 的事件对象包含特有的属性 cancelBubble, 只要将它赋值为 false 即可阻止事件继续. 如:

// 在弹出对话框上点击时, 不进行任何页面操作, 并阻止冒泡
document.getElementById('dialog').onclick = function(ev) {
ev.cancelBubble = false;
};

preventDefault()

一个带事件监听的链接代码如下:

<a href="http://w3c.org" onclick="alert('JavaScript Click Event');">点击链接</a>

点击该链接, 显示对话框后跳转页面. 由此可知, 除了执行监听事件还会触发浏览器默认动作; 执行监听事件在前, 触发浏览器默认动作在后.

这里有个经典示例, 我们希望点击链接在新窗口打开页面, 但不希望当前页面跳转. 这个时候可以使用 preventDefault() 阻止后面将要执行的浏览器默认动作.

<a id="link" href="http://w3c.org">W3C 首页链接</a>

<script>
// 在新窗口, 打开页面
document.getElementById('link').onclick = function(ev) {
// 阻止浏览器默认动作 (页面跳转)
ev.preventDefault();
// 在新窗口打开页面
window.open(this.href);
};
</script>

return false

退出执行, return false 之后的所有触发事件和动作都不会被执行. 有时候 return false 可以用来替代stopPropagation()preventDefault(), 比如我们上面新窗口打开链接的例子, 如:

<a id="link" href="http://w3c.org">W3C 首页链接</a>

<script>
// 在新窗口, 打开页面
document.getElementById('link').onclick = function(ev) {
// 在新窗口打开页面
window.open(this.href);
// 退出执行 (在监听事件之后执行的浏览器默认动作将不会被执行)
return false;
};
</script>

有人认为 return false = stopPropagation() + preventDefault(), 其实是错的.return false 不但阻止事件, 还可以返回对象, 跳出循环等... 方便地一刀切而不够灵活, 滥用易出错.

后话

因为习惯用 return false 来阻止事件, 最近在搞手机 Web 的时候遇到一些问题, 很是难堪. 写下此文当作笔记, 提醒自己.


分享到:
评论

相关推荐

    return false;和e.preventDefault();的区别

    在JavaScript和jQuery中,`return false;` 和 `e.preventDefault();` 都被用来取消默认行为,但它们之间存在一些微妙的区别。这两种方法通常在处理DOM事件,如点击(click)事件时使用,以防止浏览器执行与事件关联...

    js(冒泡)中的preventDefault和stopPropagation.doc

    通过上述分析,我们可以看出`preventDefault`和`stopPropagation`这两个方法虽然都可以用于控制事件的处理流程,但是它们的功能侧重点不同: - `preventDefault`主要用于阻止元素的默认行为; - `stopPropagation`...

    学习jQuey中的return false

    总之,理解并恰当使用`return false`、`.preventDefault()` 和 `.stopPropagation()` 是编写高效、可控的jQuery事件处理代码的关键。根据实际情况选择合适的方法,可以有效地控制事件的执行流程,提高用户体验。

    浅析return false的正确使用

    本文将深入探讨何时以及如何正确地阻止浏览器的默认行为,以及`return false`与`event.preventDefault()`、`event.stopPropagation()`和`event.stopImmediatePropagation()`之间的区别。 首先,`return false`在...

    EventEmitter:简单的事件发射器,可以用“return false”语句取消

    在JavaScript的DOM事件处理中,`event.preventDefault()`和`event.stopPropagation()`常用于此目的。然而,对于Node.js的EventEmitter,情况有所不同。虽然它没有提供直接的`stopPropagation`方法,但有一种约定俗成...

    js阻止默认浏览器行为与冒泡行为的实现代码.docx

    总的来说,理解和正确使用`event.preventDefault()`和`event.stopPropagation()`是JavaScript事件处理中的关键技能,它们能够帮助开发者实现更灵活的交互和控制。在实际项目中,根据具体需求选择合适的方法,确保...

    js阻止冒泡及jquery阻止事件冒泡示例介绍.docx

    `和`return false;`,我们可以精确控制哪些事件被阻止以及它们的行为。 ##### 2. 原生JS示例 ```javascript function ttt() { var e = arguments.callee.caller.arguments[0] || window.event; if (window....

    JS网页屏蔽右键代码.txt

    &lt;input onpaste="return false" oncopy="return false;" oncut="return false;"&gt; ``` 这些属性可以附加在`&lt;body&gt;`标签或者任何输入框上,以阻止用户进行选中、复制、粘贴和剪切操作。 ### 4. 图标和标题的自定义 ...

    javascript与jquery中跳出循环的区别总结

    因此,它在某些情况下类似于JavaScript的`event.preventDefault()`和`event.stopPropagation()`的组合。 ```javascript $('a').click(function() { return false; // 阻止链接的跳转 }); ``` 2. **return true**:...

    阻止浏览器的默认事件和冒泡

    例如,在Chrome和Firefox中,`event.preventDefault()`和`event.returnValue`都是必需的,而在Safari中,只需要设置`event.returnValue`即可。 - 这个事件不应该被滥用,因为它可能会对用户体验造成负面影响。应该...

    jquery 事件冒泡的介绍以及如何阻止事件冒泡

    与`stopPropagation()`不同,`return false;`会同时阻止事件的冒泡和默认行为。因此,在上述代码中,使用`return false;`后,点击“点击我”只会弹出“我是最里层”的警告框,超链接的跳转会被阻止。 3. `event....

    jQuery阻止事件冒泡实例分析

    1. 使用return false阻止事件冒泡和默认行为 return false是在事件处理函数中返回的一个特殊值。它不仅阻止了事件的冒泡,同时也阻止了事件的默认行为。例如,如果事件是链接的点击,点击链接通常会跳转到链接指向的...

    关于javaScript注册click大事传递参数的不胜利问题_.docx

    this.returnValue = false; } function stopPropagation() { this.cancelBubble = true; } ``` 通过这样的方式,我们可以确保事件处理函数在任何浏览器中都能正确地接收和使用传递的参数。这种方法在处理复杂的...

    常被问到的React.js 面试题你一定要看!(附答案).pdf

    - React事件不能用`return false`阻止默认行为,必须使用`event.preventDefault()`。 - 合成事件提供了更好的跨浏览器兼容性和性能优化。 3. **React组件中的事件代理** - React的事件代理基于Virtual DOM实现,...

    jquery的冒泡事件的阻止与允许(三种实现方法)

    在jQuery事件处理函数中,使用`return false`是一种简单但强大的方法来同时阻止事件的默认行为和冒泡。例如,如果你有一个链接(`&lt;a&gt;`标签),点击时你不希望页面跳转,同时也不希望这个点击事件继续向上冒泡到其他...

    从菜鸟到大神的React.js 面试题集合整理(面试用的).pdf

    - React事件处理函数接收合成事件对象,而不是原生DOM事件对象,这意味着React事件处理不支持`return false`来阻止默认行为,必须使用`event.preventDefault()`。 3. **React事件和HTML事件的差异**: - React...

    javascript 处理事件绑定的一些兼容写法

    它先尝试使用W3C标准的`preventDefault`和`stopPropagation`,然后回退到IE的旧方法: ```javascript var stopEvent = function(e){ e = e || window.event; if(e.preventDefault) { e.preventDefault(); e....

    禁止粘贴复制

    如果检测到用户同时按下了Ctrl键和V键(表示粘贴操作),则调用`preventDefault()`方法阻止默认的粘贴行为,并通过`stopPropagation()`方法阻止事件冒泡。 #### 粘贴事件 `onpaste`事件专门用于监听粘贴操作。在...

Global site tag (gtag.js) - Google Analytics