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()與return false區別False
- js中return、return true、return false的區別JSFalse
- event.preventDefault()和event.stopPropagation()
- C++中的return和exit區別C++
- exit和return的區別
- JavaScript return falseJavaScriptFalse
- Python教程:return和yield的區別Python
- JavaScript中0, "", null, false, undefined的區別JavaScriptNullFalseUndefined
- return,continue和break之間的區別
- CSS中 link 和@import的區別CSSImport
- onclick="return check()" 和 onclick="check()" 區別
- jQuery中css()和attr()方法的區別jQueryCSS
- break,continue,return區別
- C#中continue、return、break的區別及作用C#
- CSS中 screenX clientX pageX 的概念和區別CSSclient
- CSS3中RGBA和opacity的區別CSSS3
- 'return await promise' 與 'return promise' 這細微的區別AIPromise
- css link和@import的區別CSSImport
- Ruby中的true和falseFalse
- CSS3中translate、transform、translation和animation的區別CSSS3ORM
- exit(0)與exit(1)、return的區別
- CSS列表中list-style-position inside 和outside 的區別?CSSIDE
- CSS之Display、Visbility和Opactity的區別CSS
- CSS中定義CLASS時,中間有空格和沒空格的區別CSS
- JavaScript--分支+迴圈(continue、break、return的區別)JavaScript
- JavaScript中==和===的區別JavaScript
- Linux中“>”和“>>”的區別Linux
- Python 中 is 和 == 的區別Python
- Python中is和==的區別Python
- mysql中“ ‘ “和 “ ` “的區別MySql
- JavaScript中for in 和for of的區別JavaScript
- Js中for in 和for of的區別JS
- mysql中!=和is not的區別MySql
- css中的border:none和border:0px有什麼區別?CSSNone
- CSS display:none和visible:hidden區別CSSNone
- CSS中 offsetLeft 與style.left 的區別CSS
- CSS中的class與id區別及用法CSS
- 好程式設計師Python培訓分享print和return的作用及區別程式設計師Python