很久之前有個(gè)叫Netscape的姑娘,她制定了Javascript的1套事件驅(qū)動(dòng)機(jī)制(即事件捕獲)
后來又有1個(gè)叫“IE”的小子,這孩子比較傲氣,他認(rèn)為“憑甚么我要依照你的規(guī)則走”,因而他又創(chuàng)造了1套自己的規(guī)則(事件冒泡)
再后來,有個(gè)叫W3C的牙婆,想撮合這兩個(gè)孩子,將他們的特點(diǎn)融會(huì)在了1起,這下,事件產(chǎn)生的順序變成:
事件從根節(jié)點(diǎn)開始,逐級(jí)派送到子節(jié)點(diǎn),若節(jié)點(diǎn)綁定了事件動(dòng)作,則履行動(dòng)作,然后繼續(xù)走,這個(gè)階段稱為“捕獲階段(Capture)”;
履行完捕獲階段后,事件由子節(jié)點(diǎn)往根節(jié)點(diǎn)派送,若節(jié)點(diǎn)綁定了事件動(dòng)作,則履行動(dòng)作,然后繼續(xù)走,這個(gè)階段稱為“冒泡階段(Bubble)”。
仁慈的Netscape和其姐妹們都接受了牙婆的建議,采取了新的事件規(guī)則,而自豪固執(zhí)的IE小子始終依照自己的規(guī)則履行。終究使得這成為困擾前端開發(fā)人員的兼容性問題之1。那末,怎樣綁定事件呢?
由于這兩派閱讀器的差異,其綁定的方法也不1樣,其中,遵守標(biāo)準(zhǔn)的閱讀器使用W3C定義的addEventListener函數(shù)綁定,函數(shù)定義以下:
function addEventListener(string eventFlag, function eventFunc, [bool useCapture=false])
eventFlag : 事件名稱,如click、mouseover…
eventFunc: 綁定到事件中履行的動(dòng)作
useCapture: 指定是不是綁定在捕獲階段,true為是,false為否,默許為true
在事件監(jiān)聽流中可使用event.stopPropagation()來禁止事件繼續(xù)往下流
IE中使用自有的attachEvent函數(shù)綁定時(shí)間,函數(shù)定義以下:
function attachEvent(string eventFlag, function eventFunc)
eventFlag: 事件名稱,但要加上on,如onclick、onmouseover…
eventFunc: 綁定到事件中履行的動(dòng)作
在事件監(jiān)聽流中可使用window.event.cacenlBubble=false來禁止事件繼續(xù)往下流
總結(jié):addEventListener(string eventFlag, function eventFunc, [bool useCapture=false]),針對(duì)ff,chrome,safari閱讀器,false指冒泡階段,默許為true,指捕獲階段。不過1般我們都用false。
attachEvent(string eventFlag, function eventFunc),針對(duì)ie系列、還有opera閱讀器,少了事件處理機(jī)制的參數(shù),只指定事件類型(別忘了on)和觸發(fā)哪一個(gè)函數(shù)。
有了這些認(rèn)知以后,有了大致的思路,對(duì)應(yīng)的代碼:
if(document.addEventListener){
document.addEventListener('click', hideBox, false);
在document綁定信息框(豎的那個(gè))隱藏函數(shù)(即隨意點(diǎn)html頁面的哪里關(guān)閉展開的信息框,這也是使用document.addEventListener的緣由,要幫在文檔上)
document.getElementById('status_hide').addEventListener('click', showBox, false);
在status_hide節(jié)點(diǎn)綁定信息框展開(詳細(xì)的那個(gè))函數(shù)并停止事件流(即點(diǎn)擊豎的這個(gè),展開詳細(xì)的那個(gè))
document.getElementById('status_show').addEventListener('click', stopEvent, false);
由于false肯定的是事件冒泡,為了避免點(diǎn)詳情的時(shí)候,向上冒泡到document,觸發(fā)document設(shè)置的click時(shí)hidebox方法,在status_show我們要綁定禁止事件流函數(shù)。
}
這個(gè)明白了,針對(duì)ie再寫個(gè)attachEvent的就能夠了,固然ie的參數(shù)只用2個(gè)就能夠了,它的時(shí)間處理機(jī)制就是冒泡不用額外設(shè)置。
最后要說說這段函數(shù)。
var stopEvent = function(event){ e = event || window.event; if(e.stopPropagation){ e.stopPropagation(); }else { e.cancelBubble = true; } };
可以肯定它的作用是避免前面提到的冒泡,引發(fā)不該引發(fā)的click事件。
可是它呢function(event){e = event || window.event}