讀書筆記,寫的很亂 javascript
事件處理程序html
事件處理程序分爲三種: 1.html事件2. DOM0級,3,DOM2級別 沒有DOM1 java
一樣的事件 DOM0會頂掉html事件 由於他們都是屬性 而DOM0比html事件執行的晚(能夠理解爲誰離html元素近先執行誰)node
JS事件執行順序理解jquery
先捕獲(document-往下)->目標階段(執行)->冒泡(具體到不具體);chrome
addEventListener 第三個參數 默認false (false 是冒泡階段執行) true 是捕獲階段執行 瀏覽器
若是是多個元素嵌套的狀況,先捕獲不具體的,而後逐級往下捕獲,到目標階段學習
而後目標階段就有意思了,到了目標階段,addEventListener第三個參數無論是true仍是false,都無所謂了,由於已經到了目標了,若是寫了一樣的事件,一個true一個false他們的執行順序是誰在前先執行誰。測試
而後是一點疑惑,我測試的(chrome67.0,ie11裏)事件到了目標階段以及冒泡階段 事件執行順序都是先html-後DOM0後DOM2 這是一點疑惑多是瀏覽器的差別this
看圖
來一段小代碼 加強一下記憶:
<div class="div"> <p class="box"> </p> </div> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <script type="text/javascript"> var get = document.querySelector.bind(document); var log = console.log.bind(this) get('p').addEventListener('click', function(e) { log(e.eventPhase) alert('p') }, false) get('body').addEventListener('click', function(e) { log(e.eventPhase) alert('body') if(e.target.nodeName == 'DIV' || e.target.nodeName == 'P') { //若是點擊的是div 那麼 e.stopPropagation() } //true 是捕獲階段獲取 }, false) get('div').addEventListener('click', function(e) { alert('div') //true 是捕獲階段獲取 }, true) </script>
聊聊 e.stopPropagation();
最先知道e.stopPropagation()的時候只知道是阻止冒泡,本身也一直死記硬背的用着,具體什麼原理,一直沒搞清楚.
今天學習了相關文檔,說是阻止冒泡並不錯,可是不全面.
按官方說法 stopPropagation()是再也不派發事件。
終止事件在傳播過程的捕獲、目標處理或起泡階段進一步傳播。調用該方法後,該節點上處理該事件的處理程序將被調用,事件再也不被分派到其餘節點。
該方法將中止事件的傳播,阻止它被分派到其餘 Document 節點。在事件傳播的任何階段均可以調用它。注意,雖然該方法不能阻止同一個 Document 節點上的其餘事件句柄被調用,可是它能夠阻止把事件分派到其餘節點。
看來stopPropagation()是任何階段均可以調用而且生效的. 那是否是能夠理解爲,若是給body加事件捕獲 而後 再阻止派發事件,那麼就能夠作掉頁面上的其餘點擊事件了? 確實是的! 用在點擊頁面任意位置關閉某個彈窗仍是不錯的. 也能夠某種權限驗證時來簡單限制.
測試代碼以下:
get('body').addEventListener('click', function(e) { e.stopPropagation() alert(2) }, true)