聯繫:
css
(1)、都是 事件觸發時序問題 的術語。 (2)、綁定事件方法(addEventListener)的第三個參數是控制事件觸發順序的,默認爲false,即事件冒泡;若爲true,即事件捕獲。
區別:
node
(1)、事件冒泡: 從觸發事件的那個節點一直到document,是自下而上的去觸發事件。 (2)、事件捕獲: 從document到觸發事件的那個節點,即自上而下的去觸發事件。
(1)、冒泡事件圖示:
<div id="father"> <div id="son">事件測試</div> </div> <script src="jquery.min.js"></script> <script> window.onload = function () { //addEventListener綁定事件的第三個參數默認爲false document.getElementById("father").addEventListener("click", function () { console.log("這是父親=>" + this.id) }); //addEventListener綁定事件的第三個參數默認爲false document.getElementById("son").addEventListener("click", function () { console.log("這是兒子=>" + this.id) }) } </script> //結果: 點擊father輸出結果: 這是父親=>father 點擊son輸出結果: 這是兒子=>son 這是父親=>father (事件冒泡:先son,後father)
(2)、上述代碼採用的事件冒泡機制:
1.當點擊son元素時,先觸發son的點擊事件,再觸發father的點擊事件,打印相應的內容;
2.當點擊father元素時,只觸發father的點擊事件,由於father元素冒泡上去沒有dom元素設置了click事件的函數
(3)、阻止事件冒泡jquery
e.stopPropagation();
事件捕獲圖示:
<div id="father"> <div id="son"></div> </div> <script src="jquery.min.js"></script> <script> window.onload = function () { //addEventListener綁定事件的第三個參數默認爲true document.getElementById("father").addEventListener("click", function () { console.log("這是父親=>" + this.id) },true); //addEventListener綁定事件的第三個參數默認爲true document.getElementById("son").addEventListener("click", function () { console.log("這是兒子=>" + this.id) },true) } </script> //結果: 點擊father輸出結果: 這是父親=>father 點擊son輸出結果: 這是父親=>father 這是兒子=>son (事件捕獲:先father,後son)
上述代碼採用事件捕捉機制:
1.當點擊son元素時,先觸發father的點擊事件,再觸發son的點擊事件,打印相應的內容;
2.當點擊father元素時,只觸發father的點擊事件,由於father元素從上面捕捉下來一直到father元素沒有dom元素設置了click事件的函數;
(1)、定義dom
事件委託:利用事件冒泡的原理。
(2)、使用狀況: 當有多個相似元素須要綁定事件時,一個一個去綁定既浪費時間,又不利於性能,這時候可使用事件委託,給他們的一個共同父級元素添加一個事件函數去處理他
們全部的事件狀況,代碼以下:函數
<ul id="newslist"> <li>1234567890987654</li> <li>1234567890987654</li> <li>1234567890987654</li> <li>1234567890987654</li> <li>1234567890987654</li> <li>1234567890987654</li> </ul> <script src="jquery.min.js"></script> <script> $(document).ready(function () { $("#newslist").on("click", function (e) { $(e.target).css({ "background": "#f00" }).siblings().css({ "background": "#fff" }); }) }) </script>
注意:hover事件不能使用事件委託方式。
(3)、雖然上述例子中沒有給li添加點擊事件,爲何點擊相應的li會產生效果,咱們能夠理解爲:雖然咱們沒有給li設置點擊事件,可是默認的點擊事件是採用的時間冒泡,冒泡到父
級元素的點擊事件是用事件的target屬性判斷進行點擊的元素性能
而且e.target有不少屬性可操做:測試
- e.target.nodeName //獲取事件觸發元素標籤的name - e.target.id //獲取事件觸發元素的id - e.target.className //獲取事件觸發元素的className - e.target.innerHTML //獲取事件觸發元素的內容