內容:html
1.事件複習前端
2.事件冒泡與事件捕獲瀏覽器
3.事件委託dom
1.事件複習函數
(1)事件spa
事件是用來處理響應的一個機制,這個響應能夠來自於用戶(點擊, 鼠標移動, 滾動), 也能夠來自於瀏覽器code
下面的連接描述了全部事件:https://developer.mozilla.org/en-US/docs/Web/Eventshtm
(2)事件綁定對象
事件綁定有3種方法,前兩鍾方法在這裏不介紹,主要看第三種:blog
addEventListener方法(使用事件監聽綁定事件)
addEventListener:
1 element.addEventListener(event, function, useCapture) 2 event : (必需)事件名,支持全部 DOM事件 注:事件名要去掉開頭的on 3 function:(必需)指定要事件觸發時執行的函數 4 useCapture:(可選)指定事件是否在捕獲或冒泡階段執行。true,捕獲。false,冒泡。默認false
2.事件冒泡與事件捕獲
補充:綁定事件方法(addEventListener)的第三個參數,就是控制事件觸發順序是否爲事件捕獲。true,事件捕獲;false,事件冒泡。默認false,即事件冒泡。該參數默認爲false,當對一個dom節點觸發事件時,若外層的節點也設置了相應的事件函數,就會使外層的節點也觸發本身的事件函數,而若是設置該參數爲true,當對一個dom節點觸發事件時,將從最外層開始觸發事件而不是從這個dom節點開始!
阻止事件冒泡:event.cancelBubble = true
取消事件冒泡:
1 if(typeof e.cancelBubble == 'undefined'){ 2 e.stopPropagation(); // 兼容IE 3 } else{ 4 e.cancelBubble = true; 5 }
事件冒泡實例:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>事件冒泡和事件捕獲</title> 6 <style> 7 #id1 { 8 background: lightblue; 9 padding: 20px; 10 } 11 #id2 { 12 background: lightyellow; 13 padding: 20px; 14 } 15 </style> 16 </head> 17 <body> 18 <div id='id1'> 19 <div id="id2"> 20 <button id='id3'>id3 按鈕</button> 21 </div> 22 </div> 23 <script> 24 var id1 = document.querySelector('#id1'); 25 var id2 = document.querySelector('#id2'); 26 var id3 = document.querySelector('#id3'); 27 // 事件冒泡: 28 id1.addEventListener('click', function(event){ 29 console.log('click id1', event) 30 }); 31 id2.addEventListener('click', function(event){ 32 console.log('click id2', event) 33 }); 34 id3.addEventListener('click', function(event){ 35 console.log('click id3', event) 36 37 // 阻止事件冒泡 38 // event.cancelBubble = true 39 }); 40 </script> 41 </body> 42 </html>
事件捕獲實例:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>事件冒泡和事件捕獲</title> 6 <style> 7 #id1 { 8 background: lightblue; 9 padding: 20px; 10 } 11 #id2 { 12 background: lightyellow; 13 padding: 20px; 14 } 15 </style> 16 </head> 17 <body> 18 <div id='id1'> 19 <div id="id2"> 20 <button id='id3'>id3 按鈕</button> 21 </div> 22 </div> 23 <script> 24 var id1 = document.querySelector('#id1'); 25 var id2 = document.querySelector('#id2'); 26 var id3 = document.querySelector('#id3'); 27 28 // 事件捕獲: 29 // addEventListener 的第三個參數 useCapture 設置爲true 30 id1.addEventListener('click', function(event){ 31 console.log('capture click id1', event) 32 }, true); 33 id2.addEventListener('click', function(event){ 34 console.log('capture click id2', event) 35 }, true); 36 id3.addEventListener('click', function(event){ 37 console.log('capture click id3', event) 38 }, true); 39 </script> 40 </body> 41 </html>
3.事件委託
1 事件委託相關概念 2 === 3 4 在前端中一些元素是動態添加的 5 對於這樣的元素, 咱們沒辦法實現綁定事件 6 咱們能夠把 click 事件綁定在事先存在的父元素上 7 經過父元素響應click事件 調用相應的事件響應函數 8 而事件響應函數會被傳入一個參數, 就是事件自己 9 而後在運行的時候經過 event.target 屬性(發起事件的元素,例如某個按鈕) 10 來檢查被點擊的對象是不是須要的對象, 若是是就能夠對這個對象進行操做, 這個概念就是事件委託
事件委託實例:
1 <!-- author: wyb --> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <title>事件委託實例</title> 8 </head> 9 <body> 10 11 12 <div id="test"> 13 <button class="i1">按鈕1</button> 14 <button class="i2">按鈕2</button> 15 <button class="i3">按鈕3</button> 16 </div> 17 18 </body> 19 20 <script> 21 // 事件委託: 22 document.querySelector("#test").addEventListener("click", function (event) { 23 var target = event.target 24 log(target) 25 if(target.classList.contains("i1")){ 26 alert("點擊了按鈕1") 27 }else if(target.classList.contains("i2")){ 28 alert("點擊了按鈕2") 29 }else if(target.classList.contains("i3")){ 30 alert("點擊了按鈕3") 31 } 32 }) 33 </script> 34 35 </html>