前言,關(guān)于DOM事件的Bubbling和Capturing—— 在瀏覽器解析事件的時候,有兩種觸發(fā)方式,一種叫做Bubbling(冒泡),另外一種叫做Capturing(捕獲)。由上圖可以看出來,冒泡的方式效 果就是當一個DOM元素的某事件例如click事件被fire時,依次它的父元素的click事件也被fire(觸發(fā)),一直傳遞到最頂層的body元素 為止。而捕獲的觸發(fā)方式正好相反,當某個元素的click事件被觸發(fā)時,先從最頂層的body元素click事件被觸發(fā)開始,一直傳遞到真正被觸發(fā)的元素 為止。 **************************************************************************** 這次我將討論W3C的標準DOM事件模型和IE獨立門戶的DOM事件模型到底有多少區(qū)別,首先我們可以回想一下目前大多數(shù)Js程序員習慣如何綁定事件到 DOM元素上,最常見的就是obj.onclick=handler這種方式(更惡劣的是在Html代碼的元素標簽中直接加上onclick屬性,完全沒 達到視圖和動作分開的原則)。我們暫時稱這種方式的事件添加為Traditional(傳統(tǒng)方式)吧,IE有自己的IE Event Module,而火狐等瀏覽器則遵循的W3C方式的Event Module,下面看看這三者各自的優(yōu)缺點在哪里—— 1、Traditional Module 傳統(tǒng)方式的事件模型即直接在DOM元素上綁定事件處理器,例如— window.onload=function(){…} obj.onmouseover=function(e){…} obj.onclick=function(){…} 首先這種方式是無論在IE還是Firefox等其他瀏覽器上都可以成功運行的通用方式。這便是它最大的優(yōu)勢了,而且在Event處理函數(shù)內(nèi)部的this變量無一例外的都只想被綁定的DOM元素,這使得Js程序員可以大大利用this關(guān)鍵字做很多事情。 至于它的缺點也很明顯,就是傳統(tǒng)方式只支持Bubbling,而不支持Capturing,并且一次只能綁定一個事件處理器在DOM元素上,無法實現(xiàn)多 Handler綁定。最后就是function參數(shù)中的event參數(shù)只對非IE瀏覽器有效果(因為IE瀏覽器有特制的window.event)。 2、W3C (Firefox.e.g) Event Module Firefox等瀏覽器很堅決的遵循W3C標準來制定瀏覽器事件模型,使用addEventListener和removeEventListener兩個函數(shù),看幾個例子— window.addEventListener(‘load’,function(){…},false); document.body.addEventListener(‘keypress’,function{…},false); obj.addEventListener(‘mouseover’,MV,true); function MV(){…} addEventListener帶有三個參數(shù),第一個參數(shù)是事件類型,就是我們熟知的那些事件名字去掉前面的’on’,第二個參數(shù)是處理函數(shù),可以直接給函數(shù)字面量或者函數(shù)名,第三個參數(shù)是boolean值,表示事件是否支持Capturing。 W3C的事件模型優(yōu)點是Bubbling和Capturing都支持,并且可以在一個DOM元素上綁定多個事件處理器,各自并不會沖突。并且在處理函數(shù)內(nèi) 部,this關(guān)鍵字仍然可以使用只想被綁定的DOM元素。另外function參數(shù)列表的第一個位置(不管是否顯示調(diào)用),都永遠是event對象的引 用。 至于它的缺點,很不幸的就只有在市場份額最大的IE瀏覽器下不可使用這一點。 3、IE Event Module IE自己的事件模型跟W3C的類似,但主要是通過attachEvent和detachEvent兩個函數(shù)來實現(xiàn)的。依舊看幾個例子吧— window.attachEvent(‘onload’,function(){…}); document.body.attachEvent(‘onkeypress’,myKeyHandler); 可以發(fā)現(xiàn)它跟W3C的區(qū)別是沒有第三個參數(shù),而且第一個表示事件類型的參數(shù)也必須把’on’給加上。這種方式的優(yōu)點就是能綁定多個事件處理函數(shù)在同一個DOM元素上。 至于它的缺點,為什么如今在實際開發(fā)中很少見呢?首先IE瀏覽器本身只支持Bubbling不支持Capturing;而且在事件處理的function 內(nèi)部this關(guān)鍵字也無法使用,因為this永遠都只想window object這個全局對象。要想得到event對象必須通過window.event方式,最后一點,在別的瀏覽器中,它顯然是無法工作的。 最后我在推薦兩個必須知道的IE和W3C標準的區(qū)別用法吧— 1、當我們需要阻止瀏覽器某DOM元素的默認行為的時候在W3C下調(diào)用e.preventDefault(),而在IE下則通過window.event.returnValue=false來實現(xiàn)。 2、當我們要阻止事件冒泡的時候,在W3C標準里調(diào)用e.stopPropagation(),而在IE下通過設置window.event.cancelBubble=true來實現(xiàn)。 |
|
|