CSS 中 stopPropagation, preventDefault 和 return false 的區別
監聽事件, 在在節點上能被監聽的頁面操作. 如: select 節點的 change 事件, a 節點的 click
事件.
瀏覽器預設動作, 指特定頁面元素上帶有的功能. 如: 點選 a 連結節點的跳轉動作, 表單提交動作.
因為事件可以在各層級的節點中傳遞, 不管是冒泡還是捕獲, 有時我們希望事件在特定節點執行完之後不再傳遞, 可以使用事件物件的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;}; |
一個帶事件監聽的連結程式碼如下:
<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可以用來替代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不但阻止事件, 還可以返回物件, 跳出迴圈等... 方便地一刀切而不夠靈活, 濫用易出錯.
內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。
相關文章
- preventDefault,stopPropagation,return false三者的區別False
- preventDefault()與return false區別False
- js中return、return true、return false的區別JSFalse
- js跳出迴圈的方法區別( break, continue, return ) 及 $.each 的(return true 和 return false)...JSFalse
- event.preventDefault()和event.stopPropagation()
- js事件之event.preventDefault()與event.stopPropagation()用法區別JS事件
- C++中的return和exit區別C++
- ruby中proc和lambda的return區別
- exit和return的區別
- JavaScript return falseJavaScriptFalse
- JavaScript return false的作用JavaScriptFalse
- 阻止事件冒泡(stopPropagation和cancelBubble)和阻止預設行為(preventDefault和returnValue)事件
- [轉] 由表單中 onsubmit="return false;" 想到的MITFalse
- JavaScript中0, "", null, false, undefined的區別JavaScriptNullFalseUndefined
- 解析php中die(),exit(),return的區別PHP
- Python教程:return和yield的區別Python
- onclick="return check()" 和 onclick="check()" 區別
- return false影響事件冒泡False事件
- CSS中 link 和@import的區別CSSImport
- jQuery中css()和attr()方法的區別jQueryCSS
- display:none 和visible:false 的區別(轉)NoneFalse
- jQuey return false作用是什麼False
- Break,Continue,Return的區別
- C#中continue、return、break的區別及作用C#
- break,continue,return區別
- CSS中 screenX clientX pageX 的概念和區別CSSclient
- 原生javascript的return false並不能阻止事件冒泡JavaScriptFalse事件
- 'return await promise' 與 'return promise' 這細微的區別AIPromise
- Ruby中的true和falseFalse
- CSS3中translate、transform、translation和animation的區別CSSS3ORM
- CSS3中RGBA和opacity的區別CSSS3
- 不要用return false阻止event的預設行為False
- exit(0)與exit(1)、return的區別
- CSS中PX與EM的區別CSS
- css link和@import的區別CSSImport
- CSS中px和em屬性的特點與區別CSS
- css中單位 px、em 的區別CSS
- CSS中定義CLASS時,中間有空格和沒空格的區別CSS