javaScript事件流
事件流:事件從發生到傳播結束的過程。
事件流三個階段:捕獲階段、目標階段、冒泡階段。
addEventListener:
EventTarget.addEventListener()方法將指定的監聽器註冊到EventTarget
上,當該物件觸發指定的事件時,指定的回撥函式就會被執行。 事件目標可以是一個文件上的元素Element
,Document
和Window
或者任何其他支援事件的物件 (比如XMLHttpRequest
)。
addEventListener()
的工作原理是將實現EventListener
的函式或物件新增到呼叫它的EventTarget
上的指定事件型別的事件偵聽器列表中。
事件冒泡:
案例:第三個引數為false為表示冒泡
列印結果為:
btn
ps
ls
<!DOCTYPE html> <html> <head> <meta charset:"utf-8"> <title></title> </head> <body> <div class="ls"> <div class="ps"> <button class="btn">按鈕</button></button> </div> </div> </body> </html> <script type:"text/javascript"> varbtn = document.querySelector(".btn") var ps = document.querySelector(".ps") var ls = document.querySelector(".ls")
btn.addEventListener("click",function(){ console.log("btn") },false) ps.addEventListener("click",function(){ console.log("ps") },false) ls.addEventListener("click",function(){ console.log("ls") },false)</script>
捕獲階段:從外到內,和冒泡相反
案例:第三個引數為true表示冒泡
列印結果:
ls
ps
btn
<!DOCTYPE html> <html> <head> <meta charset:"utf-8"> <title></title> </head> <body> <div class="ls"> <div class="ps"> <button class="btn">按鈕</button></button> </div> </div> </body> </html> <script type:"text/javascript"> var btn = document.querySelector(".btn") var ps = document.querySelector(".ps") var ls = document.querySelector(".ls") btn.addEventListener("click",function(){ console.log("btn") },true) ps.addEventListener("click",function(){ console.log("ps") },true) ls.addEventListener("click",function(){ console.log("ls") },true)</script>
阻止捕獲和冒泡:event.stopPropagation()
相容性:
Event.cancelBubble
屬性是Event.stopPropagation()
的一個曾用名。在從事件處理程式返回之前將其值設定為true可阻止事件的傳播。
注意:不能阻止預設事件發生,例如:連結。可使用event.preventDefault()
案例:
結果列印為:
btn
ps
<!DOCTYPE html> <html> <head> <meta charset:"utf-8"> <title></title> </head> <body> <div class="ls"> <div class="ps"> <button class="btn">按鈕</button></button> </div> </div> </body> </html> <script type:"text/javascript"> var btn = document.querySelector(".btn") var ps = document.querySelector(".ps") var ls = document.querySelector(".ls") btn.addEventListener("click",function(){ console.log("btn") },false) ps.addEventListener("click",function(){ console.log("ps") event.stopPropagation() // event.cancelBubble = true },false) ls.addEventListener("click",function(){ console.log("ls") },false) </script>
並不是所有的事件都有冒泡,例如:
onblur
onfocus
onmouseenter
onmouseleave
input繫結事件執行順序
onmouseenter---onfocus---onmousedown---onmouseup---onclick---onmouseleave
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <input type="text" id="text"> </body> <script> const text = document.getElementById('text'); text.onclick = function (e) { console.log('onclick') } text.onfocus = function (e) { console.log('onfocus') } text.onmousedown = function (e) { console.log('onmousedown') } text.onmouseenter = function (e) { console.log('onmouseenter') } text.onmouseup = function (e) { console.log('onmouseup') }text.onmouseleave=function(e){ console.log('onmouseleave') }
</script> </html>
onmouseover 和 onmouseenter 區別
這兩者都是移入的時候觸發,但是onmouseover
會觸發多次,而onmouseenter
只在進去的時候才觸發。
案例:滑鼠從下到上移動
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <style> .div{ width: 200px; height: 200px; border: 1px solid #ccc; display: flex; flex-direction: column; justify-content: space-around; align-items: center; } .div div{ width: 100px; height: 60px; border: 1px solid #ccc; } </style> <body> <div class="div"> <div class="div1"></div> <div class="div2"></div> </div> </body> <script> document.querySelector(".div").onmouseover = function(){ console.log("onmouseover") } document.querySelector(".div").onmouseenter = function(){ console.log("onmouseenter") } </script> </html>