W3C事件與IE事件的區別及預設事件的阻止

來源:互聯網
上載者:User

        在瀏覽器解析事件的時候,有兩種觸發方式,一種叫做Bubbling(冒泡),另外一種叫做Capturing(捕獲)。冒泡的方式效果就是當一個DOM元素的某事件例如click事件被f觸發時,依次它的父元素的click事件也被fire(觸發),一直傳遞到最頂層的body元素為止。而捕獲的觸發方式正好相反,當某個元素的click事件被觸發時,先從最頂層的body元素click事件被觸發開始,一直傳遞到真正被觸發的元素為止。

       如何綁定事件到DOM元素上,最常見的就是obj.onclick=handler這種方式。我們暫時稱這種方式的事件添加為Traditional(傳統方式)吧,IE有自己的IE Event Module,而Firefox等瀏覽器則遵循的W3C方式的Event Module,下面看看這三者各自的優缺點在哪裡——

 

1、 Traditional Module(傳統方式)

傳統方式的事件模型即直接在DOM元素上綁定事件處理器,例如—

window.onload=function(){…}

obj.onmouseover=function(e){…}

obj.onclick=function(){…}

 

首先這種方式是無論在IE還是Firefox等其他瀏覽器上都可以成功啟動並執行通用方式。這便是它最大的優勢了,而且在Event處理函數內部的this變數無一例外的都只想被綁定的DOM元素,這使得Js程式員可以大大利用this關鍵字做很多事情。

 

至於它的缺點也很明顯,就是傳統方式只支援Bubbling,而不支援Capturing,並且一次只能綁定一個事件處理器在DOM元素上,無法實現多Handler綁定。最後就是function參數中的event參數只對非IE瀏覽器有效果(因為IE瀏覽器有特製的window.event)。

 

2、 W3C (Firefox.e.g) Event Module

Firefox等瀏覽器很堅決的遵循W3C標準來制定瀏覽器事件模型,使用addEventListener和removeEventListener兩個函數,例子—

window.addEventListener(‘load’,function(){…},false);

document.body.addEventListener(‘keypress’,function{…},false);

obj.addEventListener(‘mouseover’,MV,true);

function MV(){…}

 

addEventListener帶有三個參數,第一個參數是事件類型,就是我們熟知的那些事件名字去掉前面的’on’,第二個參數是處理函數,可以直接給函數字面量或者函數名,第三個參數是boolean值,表示事件是否支援Capturing。

 

W3C的事件模型優點是Bubbling和Capturing都支援,並且可以在一個DOM元素上綁定多個事件處理器,各自並不會衝突。並且在處理函數內部,this關鍵字仍然可以使用只想被綁定的DOM元素。另外function參數列表的第一個位置(不管是否顯示調用),都永遠是event對象的引用。

 

至於它的缺點,就只有在市場份額最大的IE瀏覽器下不可使用這一點。

 

3、 IE Event Module

IE自己的事件模型跟W3C的類似,但主要是通過attachEvent和detachEvent兩個函數來實現的。例子—

window.attachEvent(‘onload’,function(){…});

document.body.attachEvent(‘onkeypress’,myKeyHandler);

 

可以發現它跟W3C的區別是沒有第三個參數,而且第一個表示事件類型的參數也必須把’on’給加上。這種方式的優點就是能綁定多個事件處理函數在同一個DOM元素上。

 

至於它的缺點,為什麼如今在實際開發中很少見呢。首先IE瀏覽器本身只支援Bubbling不支援Capturing;而且在事件處理的function內部this關鍵字也無法使用,因為this永遠都只想window object這個全域對象。要想得到event對象必須通過window.event方式,最後一點,在別的瀏覽器中,它顯然是無法工作的。

 

組織預設事件:

1、 當我們需要阻止瀏覽器某DOM元素的預設行為的時候在W3C下調用e.preventDefault(),而在IE下則通過window.event.returnValue=false來實現。

2、當我們要阻止事件冒泡的時候,在W3C標準裡調用e.stopPropagation(),而在IE下通過設定window.event.cancelBubble=true來實現。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.