一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

DOM事件模型總結(jié)【分享】

 ivy1107 2009-05-30
前言,關(guān)于DOM事件的Bubbling和Capturing——



在瀏覽器解析事件的時(shí)候,有兩種觸發(fā)方式,一種叫做Bubbling(冒泡),另外一種叫做Capturing(捕獲)。由上圖可以看出來(lái),冒泡的方式效 果就是當(dāng)一個(gè)DOM元素的某事件例如click事件被fire時(shí),依次它的父元素的click事件也被fire(觸發(fā)),一直傳遞到最頂層的body元素 為止。而捕獲的觸發(fā)方式正好相反,當(dāng)某個(gè)元素的click事件被觸發(fā)時(shí),先從最頂層的body元素click事件被觸發(fā)開(kāi)始,一直傳遞到真正被觸發(fā)的元素 為止。
****************************************************************************

這次我將討論W3C的標(biāo)準(zhǔn)DOM事件模型和IE獨(dú)立門戶的DOM事件模型到底有多少區(qū)別,首先我們可以回想一下目前大多數(shù)Js程序員習(xí)慣如何綁定事件到 DOM元素上,最常見(jiàn)的就是obj.onclick=handler這種方式(更惡劣的是在Html代碼的元素標(biāo)簽中直接加上onclick屬性,完全沒(méi) 達(dá)到視圖和動(dòng)作分開(kāi)的原則)。我們暫時(shí)稱這種方式的事件添加為Traditional(傳統(tǒng)方式)吧,IE有自己的IE Event Module,而火狐等瀏覽器則遵循的W3C方式的Event Module,下面看看這三者各自的優(yōu)缺點(diǎn)在哪里——

1、Traditional Module
傳統(tǒng)方式的事件模型即直接在DOM元素上綁定事件處理器,例如—
window.onload=function(){…}
obj.onmouseover=function(e){…}
obj.onclick=function(){…}

首先這種方式是無(wú)論在IE還是Firefox等其他瀏覽器上都可以成功運(yùn)行的通用方式。這便是它最大的優(yōu)勢(shì)了,而且在Event處理函數(shù)內(nèi)部的this變量無(wú)一例外的都只想被綁定的DOM元素,這使得Js程序員可以大大利用this關(guān)鍵字做很多事情。

至于它的缺點(diǎn)也很明顯,就是傳統(tǒng)方式只支持Bubbling,而不支持Capturing,并且一次只能綁定一個(gè)事件處理器在DOM元素上,無(wú)法實(shí)現(xiàn)多 Handler綁定。最后就是function參數(shù)中的event參數(shù)只對(duì)非IE瀏覽器有效果(因?yàn)镮E瀏覽器有特制的window.event)。

2、W3C (Firefox.e.g) Event Module
Firefox等瀏覽器很堅(jiān)決的遵循W3C標(biāo)準(zhǔn)來(lái)制定瀏覽器事件模型,使用addEventListener和removeEventListener兩個(gè)函數(shù),看幾個(gè)例子—
window.addEventListener(‘load’,function(){…},false);
document.body.addEventListener(‘keypress’,function{…},false);
obj.addEventListener(‘mouseover’,MV,true);
function MV(){…}

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

W3C的事件模型優(yōu)點(diǎn)是Bubbling和Capturing都支持,并且可以在一個(gè)DOM元素上綁定多個(gè)事件處理器,各自并不會(huì)沖突。并且在處理函數(shù)內(nèi) 部,this關(guān)鍵字仍然可以使用只想被綁定的DOM元素。另外function參數(shù)列表的第一個(gè)位置(不管是否顯示調(diào)用),都永遠(yuǎn)是event對(duì)象的引 用。

至于它的缺點(diǎn),很不幸的就只有在市場(chǎng)份額最大的IE瀏覽器下不可使用這一點(diǎn)。

3、IE Event Module
IE自己的事件模型跟W3C的類似,但主要是通過(guò)attachEvent和detachEvent兩個(gè)函數(shù)來(lái)實(shí)現(xiàn)的。依舊看幾個(gè)例子吧—
window.attachEvent(‘onload’,function(){…});
document.body.attachEvent(‘onkeypress’,myKeyHandler);

可以發(fā)現(xiàn)它跟W3C的區(qū)別是沒(méi)有第三個(gè)參數(shù),而且第一個(gè)表示事件類型的參數(shù)也必須把’on’給加上。這種方式的優(yōu)點(diǎn)就是能綁定多個(gè)事件處理函數(shù)在同一個(gè)DOM元素上。

至于它的缺點(diǎn),為什么如今在實(shí)際開(kāi)發(fā)中很少見(jiàn)呢?首先IE瀏覽器本身只支持Bubbling不支持Capturing;而且在事件處理的function 內(nèi)部this關(guān)鍵字也無(wú)法使用,因?yàn)閠his永遠(yuǎn)都只想window object這個(gè)全局對(duì)象。要想得到event對(duì)象必須通過(guò)window.event方式,最后一點(diǎn),在別的瀏覽器中,它顯然是無(wú)法工作的。

最后我在推薦兩個(gè)必須知道的IE和W3C標(biāo)準(zhǔn)的區(qū)別用法吧—
1、當(dāng)我們需要阻止瀏覽器某DOM元素的默認(rèn)行為的時(shí)候在W3C下調(diào)用e.preventDefault(),而在IE下則通過(guò)window.event.returnValue=false來(lái)實(shí)現(xiàn)。
2、當(dāng)我們要阻止事件冒泡的時(shí)候,在W3C標(biāo)準(zhǔn)里調(diào)用e.stopPropagation(),而在IE下通過(guò)設(shè)置window.event.cancelBubble=true來(lái)實(shí)現(xiàn)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产欧美精品对白性色| 日韩人妻毛片中文字幕| 亚洲一区二区三区国产| 欧美精品激情视频一区| 青青操视频在线观看国产| 日本加勒比在线观看不卡| 国产又大又黄又粗又免费| 欧美人与动牲交a精品| 欧美中文字幕日韩精品| 日韩1区二区三区麻豆| 亚洲欧美日韩网友自拍| 亚洲精品成人午夜久久| 老司机这里只有精品视频| 国产麻豆一线二线三线| 色播五月激情五月婷婷| 亚洲第一香蕉视频在线| 久久成人国产欧美精品一区二区| 欧美日韩一级aa大片| 欧美亚洲另类久久久精品| 日韩和欧美的一区二区三区| 国产成人精品一区二三区在线观看| 国产亚洲欧美日韩国亚语| 中文字幕av诱惑一区二区| 高清亚洲精品中文字幕乱码| 国产精品内射视频免费| 欧美精品在线观看国产| 日本和亚洲的香蕉视频| 好骚国产99在线中文| 91日韩在线视频观看| 久久综合九色综合欧美| 欧美日韩中黄片免费看| 欧美做爰猛烈叫床大尺度| 91爽人人爽人人插人人爽| 免费大片黄在线观看日本| 国产剧情欧美日韩中文在线| 女同伦理国产精品久久久| 国产精品成人又粗又长又爽| 九九热这里只有精品视频| 免费亚洲黄色在线观看| 日韩欧美好看的剧情片免费| 久久永久免费一区二区|