面試題中的一道題目。
事件流:描述的是事件發生的順序。
包含的三個階段:
- 事件捕獲階段
- 處於目標階段
- 事件冒泡階段
事件捕獲階段
這是一個從上而下的過程,越高級的父級元素越早接到事件。
例:
1. 如點擊li元素會先觸發ul元素。
注意:如果在li上綁定click事件,那么新添加的li元素不會有這個click事件。此時應該在ul上綁定事件,根據事件捕獲的原理,事件會自上而下傳遞給li。通過event.target找到這個li元素。
這種方式被稱為事件委托。
2. 目標元素有子元素。如希望綁定到li上,但li有子元素,則event.target變成了子元素。
此時需要組織事件捕獲的傳遞。這個時候可以給子元素添加css: li>* {pointer-events:none;}
jquery通過on方法解決了這個問題: $('ul').on('click','li',function(event){//code});
事件冒泡
讓DOM樹最底層的目標元素最先接收到事件,然后向上傳遞,是一個自下而上的過程。
如button和button的父元素都添加了click事件,當點擊button的時候,button和其父元素的點擊事件都會執行,自下而上的順序執行。這個事件需要阻止冒泡事件。
解決方法:
$('button').click(function(e){ //可以是任何需要阻止冒泡的元素。
e.stopPropagation();
//ie
e.cancelBubble = true;
})
一些不支持冒泡的事件:
blur:元素失去焦點時觸發,不支持冒泡。
focus: 元素獲得焦點時觸發,不支持冒泡。
mouseenter:鼠標移入元素觸發,不支持冒泡。
mouseleave:鼠標移出元素時觸發,不支持冒泡。