一、什麼是事件冒泡流
我們知道事件流指的是從頁面中接受事件的順序。
為了形象理解事件冒泡,可以想象三軍主將諸葛亮,在帳內運籌帷幄,眼觀六路耳聽八方,這時候前方的戰事情況就需要靠傳令兵來傳達,當第一位傳令兵接到士官戰事信息,打出旗語,百米之外的第二個傳令兵看到後打出同樣的旗語,第三個,第四個....,直到信息傳到諸葛亮手中。用專業術語解釋就是:當一個元素上的事件被觸發的時候,比如說鼠標點擊了一個按鈕,同樣的事件將會在那個元素的所有祖先元素中被觸發。這一過程被稱為事件冒泡;這個事件從原始元素開始一直冒泡到DOM樹的最上層。
(還有一種事件流為捕獲,可以理解為諸葛亮向戰場上的某位士官發布指令的過程)
二、事件冒泡的用處
1、事件委托
就是把事件處理器(或監聽器)添加到parent元素上,避免把其添加到多個子元素上。
<div id="out"> <span>我是span標簽</span> <a href="###">我是a標簽</a> </div> <script> var out=document.getElementById('out'); out.onclick=function (ev){ var tags=out.children; var event=ev||window.event; var target=event.target||event.srcElement; // event.target//火狐 事件目標 // event.srcElement//IE 事件源 for (var i = 0; i < tags.length; i++) { tags[i].style.background=''; }; target.style.background='green'; //目標對象背景顏色改變 } </script>
2、讓不同對象捕獲同一事件
這個其實是給不同對象綁定相同的觸發事件,比如點擊onclick,當點擊其中一個的話,所有這些對象就會觸發各自所對應的函數操作。
<div> <span id="sp1">123 <span id="sp2">456 <span id="sp3">789</span> </span> </span> </div> <script> var sp1=document.getElementById('sp1'); var sp2=document.getElementById('sp2'); var sp3=document.getElementById('sp3'); sp1.onclick=function(){ alert("123"); } sp2.onclick=function(){ alert("456"); } sp3.onclick=function(){ alert("789"); } </script>
三、阻止事件冒泡
先要清楚什麼時候需要阻止事件冒泡:比如document上有A事件,div有B事件,div裡的span有C事件(ABC是同類型事件,比如都是onclick),若不給div和span阻止事件冒泡的話,點擊span時就會觸發到B、C事件。所以事件冒泡可能會激活我們本來不想激活的事件,導致程序錯亂,所以必要時,我們要阻止事件冒泡。
阻止冒泡事件要考慮浏覽器的兼容問題:
if(Event.stopPropagation){ Event.stopPropagation(); //非IE }else{ Event.cancelBubble=true; //IE }
四、冒泡排序算法(雖然和JavaScript中的冒泡事件沒多大關系,了解一下也不是壞事)
JavaScript冒泡排序:
function bubbleSort(arr) { var i = arr.length, j; var tempExchangVal; while (i > 0) { for (j = 0; j < i - 1; j++) { if (arr[j] > arr[j + 1]) { tempExchangVal = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tempExchangVal; } } i--; } return arr; } var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8]; var arrSorted = bubbleSort(arr); console.log(arrSorted); alert(arrSorted);