事件的綁定删性、捕獲和冒泡

傳統(tǒng)的綁定方式

element.onclick = function(e){
// ...
};

傳統(tǒng)綁定的優(yōu)點
非常簡單和穩(wěn)定庆械,可以確保它在你使用的不同瀏覽器中運作一致
處理事件時津肛,this關(guān)鍵字引用的是當(dāng)前元素葫辐,這很有幫組
傳統(tǒng)綁定的缺點
傳統(tǒng)方法只會在事件冒泡中運行搜锰,而非捕獲和冒泡
一個元素一次只能綁定一個事件處理函數(shù)。新綁定的事件處理函數(shù)會覆蓋舊的事件處理函數(shù)
事件對象參數(shù)(e)僅非IE瀏覽器可用

W3C綁定方式

element.addEventListener('click', function(e){
// ...
}, false);

W3C綁定的優(yōu)點
該方法同時支持事件處理的捕獲和冒泡階段耿战。事件階段取決于addEventListener最后的參數(shù)設(shè)置:false (冒泡) 或 true (捕獲)蛋叼。
在事件處理函數(shù)內(nèi)部,this關(guān)鍵字引用當(dāng)前元素剂陡。
事件對象總是可以通過處理函數(shù)的第一個參數(shù)(e)捕獲狈涮。
可以為同一個元素綁定你所希望的多個事件,同時并不會覆蓋先前綁定的事件
W3C綁定的缺點
IE不支持鸭栖,你必須使用IE的attachEvent函數(shù)替代歌馍。

IE綁定事件的方法

element.attachEvent('onclick', function(){
// ...
});

IE方式的優(yōu)點
可以為同一個元素綁定你所希望的多個事件,同時并不會覆蓋先前綁定的事件晕鹊。
IE方式的缺點
IE僅支持事件捕獲的冒泡階段
事件監(jiān)聽函數(shù)內(nèi)的this關(guān)鍵字指向了window對象松却,而不是當(dāng)前元素(IE的一個巨大缺點)
事件對象僅存在與window.event參數(shù)中
事件必須以ontype的形式命名,比如溅话,onclick而非click
僅IE可用晓锻。你必須在非IE瀏覽器中使用W3C的addEventListener

兼容寫法

// 綁定
/***************************************
element 需要綁定事件的元素
type 綁定事件的名稱(沒有on)
fn 要綁定的事件對應(yīng)的函數(shù)
****************************************/
function addEvevt(element,type,fn){
if(element.addEventListener){
element.addEventListener(type,fn,false);
}else if(element.attachEvent){
element.attachEvent('on' + type,fn,);
}else{
element['on' + type]=fn;
}
}
// 解除綁定
/***************************************
element 需要綁定事件的元素
type 綁定事件的名稱(沒有on)
fn 要綁定的事件對應(yīng)的函數(shù)
****************************************/
function removeEvent(element,type,fn){
if(element.removeEventListener){
element.removeEventListener(type,fn,false);
}else if(element.detachEvent){
element.detachEvent('on' + type,fn,);
}else{
element['on' + type]=null;
}
}

事件的捕獲

捕獲型事件(event capturing):事件從最不精確的對象(document 對象)開始觸發(fā),然后到最精確(也可以在窗口級別捕獲事件飞几,不過必須由開發(fā)人員特別指定)带射。
冒泡型事件:事件按照從最特定的事件目標(biāo)到最不特定的事件目標(biāo)(document對象)的順序觸發(fā)。
DOM事件流:同時支持兩種事件模型:捕獲型事件和冒泡型事件循狰,但是窟社,捕獲型事件先發(fā)生。兩種事件流會觸及DOM中的所有對象绪钥,從document對象開始灿里,也在document對象結(jié)束。
DOM事件模型最獨特的性質(zhì)是程腹,文本節(jié)點也觸發(fā)事件(在IE中不會)

事件捕獲階段:事件從最上一級標(biāo)簽開始往下查找匣吊,直到捕獲到事件目標(biāo)(target)。
事件冒泡階段:事件從事件目標(biāo)(target)開始,往上冒泡直到頁面的最上一級標(biāo)簽色鸳。

W3C模型

W3C模型是將兩者進行中和社痛,在W3C模型中,任何事件發(fā)生時命雀,先從頂層開始進行事件捕獲蒜哀,直到事件觸發(fā)到達了事件源元素。然后吏砂,再從事件源往上進行事件冒泡撵儿,直到到達document。
程序員可以自己選擇綁定事件時采用事件捕獲還是事件冒泡狐血,方法就是綁定事件時通過addEventListener函數(shù)淀歇,它有三個參數(shù),第三個參數(shù)若是true匈织,則表示采用事件捕獲浪默,若是false,則表示采用事件冒泡缀匕。
ele.addEventListener('click',doSomething2,true)
true=捕獲
false=冒泡

事件的傳播是可以阻止的:

? 在W3c中浴鸿,使用stopPropagation()方法
? 在IE下設(shè)置cancelBubble = true;
在捕獲的過程中stopPropagation()弦追;后岳链,后面的冒泡過程也不會發(fā)生了~

阻止事件的默認行為,例如click <a>后的跳轉(zhuǎn)~

? 在W3c中劲件,使用preventDefault()方法掸哑;
? 在IE下設(shè)置window.event.returnValue = false;
?return false;

取消冒泡的兼容寫法

/***************************************
ev 取消冒泡事件對象
****************************************/
function stopBubble(e){
if(e && e.stopPropagation){
e.stopPropagation();
}else{
e.cancelBubble = true;
}
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市零远,隨后出現(xiàn)的幾起案子苗分,更是在濱河造成了極大的恐慌,老刑警劉巖牵辣,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摔癣,死亡現(xiàn)場離奇詭異,居然都是意外死亡纬向,警方通過查閱死者的電腦和手機择浊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逾条,“玉大人琢岩,你說我怎么就攤上這事∈χ” “怎么了担孔?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵江锨,是天一觀的道長。 經(jīng)常有香客問我糕篇,道長啄育,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任拌消,我火速辦了婚禮挑豌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拼坎。我一直安慰自己,他們只是感情好完疫,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布泰鸡。 她就那樣靜靜地躺著,像睡著了一般壳鹤。 火紅的嫁衣襯著肌膚如雪盛龄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天芳誓,我揣著相機與錄音余舶,去河邊找鬼。 笑死锹淌,一個胖子當(dāng)著我的面吹牛匿值,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赂摆,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼挟憔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烟号?” 一聲冷哼從身側(cè)響起绊谭,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汪拥,沒想到半個月后达传,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡迫筑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年宪赶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脯燃。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡逊朽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出曲伊,到底是詐尸還是另有隱情叽讳,我是刑警寧澤追他,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站岛蚤,受9級特大地震影響邑狸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涤妒,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一单雾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧她紫,春花似錦硅堆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至民褂,卻和暖如春茄菊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赊堪。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工面殖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哭廉。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓脊僚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遵绰。 傳聞我的和親對象是個殘疾皇子吃挑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 以下文章為轉(zhuǎn)載,對理解JavaScript中的事件處理機制很有幫助街立,淺顯易懂舶衬,特分享于此。 什么是事件赎离? 事件(E...
    jxyjxy閱讀 3,023評論 1 10
  • 1.使用過的事件 onclick 點擊 onchange 表單元素改變的時候 (三級聯(lián)動) oninput 表單文...
    于曉魚閱讀 380評論 0 0
  • 什么是事件: 我們可以簡單的把事件理解為瀏覽器的感知系統(tǒng)逛犹。比如說:他可以感覺到用戶是否點擊(click)了頁面、鼠...
    張松1366閱讀 6,769評論 1 6
  • 1.使用過的事件 onclick 點擊 onchange 表單元素改變的時候 (三級聯(lián)動) oninput 表單文...
    3hours閱讀 184評論 0 0
  • 風(fēng)一程 雨一程 窗外花叢敲不停 風(fēng)箏墻角扔 夢難行 愿不成 放飛藍天了無影 雨滴到天明
    風(fēng)箏_5c59閱讀 408評論 6 9