Javascript事件機(jī)制-冒泡與捕獲

我們經(jīng)常說(shuō)的Javascript中的事件分為捕獲階段撇他,執(zhí)行階段和冒泡階段温技,對(duì)應(yīng)的是不同的標(biāo)準(zhǔn)對(duì)于事件處理的規(guī)則。以IE為代表的時(shí)間冒泡機(jī)制和以Netscape為代表的時(shí)間補(bǔ)獲機(jī)制。

1:事件冒泡
事件冒泡的處理過(guò)程是事件開(kāi)始的時(shí)候從最具體的元素到最不具體的元素,即事件的傳播路徑是子元素-父元素-父父元素薄辅,自底向上執(zhí)行

2:事件補(bǔ)獲
事件補(bǔ)獲的過(guò)程和冒泡的相反,自頂向下執(zhí)行抠璃,先是最不具體的元素接收到事件长搀,然后一直往下執(zhí)行到最具體的元素

3:事件處理
由于存在兩種不同的事件機(jī)制,所以對(duì)應(yīng)的存在了兩種不同的事件綁定機(jī)制
3.1:符合W3C標(biāo)準(zhǔn)的標(biāo)準(zhǔn)瀏覽器綁定機(jī)制
又稱DOM2級(jí)事件處理機(jī)制鸡典,對(duì)應(yīng)的事件的指定和刪除的方法是addEventListener和removeEventListener。
function addEventListener(事件名稱,事件動(dòng)作,是否綁定在捕獲階段)
function removeEventListener(事件名稱,事件動(dòng)作,是否綁定在捕獲階段)
在采用addEventListener添加事件的時(shí)候枪芒,可以添加多個(gè)事件彻况,如下:

var btn = document.querySelector("#btn");
btn.addEventListener("click",function(){
  alert(this.id);
}, false);
btn.addEventListener("click", function(){
  alert("double operation");
}, false);

添加完上述兩個(gè)事件之后,兩個(gè)事件會(huì)按照定義的順序執(zhí)行舅踪,即先執(zhí)行ID纽甘,再執(zhí)行double operation。
在事件執(zhí)行過(guò)程中抽碌,如果要禁止事件繼續(xù)流動(dòng)悍赢,則使用event.stopPropgation()
3.2:IE的事件綁定機(jī)制
又稱IE事件處理程序,IE使用的事件處理方法為attachEvent和detachEvent货徙。
function attachEvent("on"+事件名稱, 事件動(dòng)作)
function detachEvent("on"+事件名稱, 事件動(dòng)作)
在采用attachEvent的時(shí)候也可以添加多次事件左权,如下:

var btn = document.querySelector("#btn");
btn.attatchEvent("onclick",function(){
  alert("clicked");
});
btn.attatchEvent("onclick", function(){
  alert("double operation");
}, false);

要注意的是,現(xiàn)在安裝的事件的執(zhí)行順序與定義的順序相反痴颊,即先出現(xiàn)double operation赏迟,而后出現(xiàn)clicked。
在執(zhí)行過(guò)程中蠢棱,要是想取消事件锌杀,可以采用event.cancelBubble=true;
需要注意的是當(dāng)前的事件處理機(jī)制中的this是綁定到window下的。
3.3:DOM0級(jí)事件處理程序
比較傳統(tǒng)的方式泻仙,就是將一個(gè)函數(shù)賦值給一個(gè)事件處理程序?qū)傩愿庠伲缦拢?/p>

var btn = document.querySelector("#btn");
btn.onclick=function(){
  alert("clicked");
}

取消事件的話是btn.onclick = null
并且只能綁定一個(gè)事件

4:跨瀏覽器事件處理

var EventUtil = {
  addHandler:function(element, type, handler){
    if(element.addEventListener){
      element.addEvnetListener(type, handler, false);
    }else if(element.attachEvent){
      element.attatchEvent("on" + type, handler);
    }else{
      element["on"+type] = handler;
    }
  },
  removeHandler:function(element, type,handler){
    if(element.removeEventLisntener){
        element.removeEventListener(type, handler, false);
    }else if(element.detachEvent){
        element.detachEvent("on"+type, handler);
    }else{
      element["on" + type] = null;
    }
  },
  getEvent:function(event){
    return event ? event || window.event;
  },
  getTarget:function(event){
    return event.target || event.srcElement;
  },
  preventDefault:function(event){
    if(event.preventDefault){
      event.preventDefault();
    }else{
      event.returnValue = false;
    }
  },
  stopPropagation:function(event){
    if(event.stopPrapagation){
      event.stopPropagation();
    }else{
      event.cancelBubble = true;
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市玉转,隨后出現(xiàn)的幾起案子突想,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒿柳,死亡現(xiàn)場(chǎng)離奇詭異饶套,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)垒探,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門妓蛮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人圾叼,你說(shuō)我怎么就攤上這事蛤克。” “怎么了夷蚊?”我有些...
    開(kāi)封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵构挤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我惕鼓,道長(zhǎng)筋现,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任箱歧,我火速辦了婚禮矾飞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呀邢。我一直安慰自己洒沦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布价淌。 她就那樣靜靜地躺著申眼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝉衣。 梳的紋絲不亂的頭發(fā)上括尸,一...
    開(kāi)封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音病毡,去河邊找鬼姻氨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剪验,可吹牛的內(nèi)容都是我干的肴焊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼功戚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼娶眷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起啸臀,我...
    開(kāi)封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤届宠,失蹤者是張志新(化名)和其女友劉穎烁落,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豌注,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伤塌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轧铁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片每聪。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖齿风,靈堂內(nèi)的尸體忽然破棺而出药薯,到底是詐尸還是另有隱情,我是刑警寧澤救斑,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布童本,位于F島的核電站,受9級(jí)特大地震影響脸候,放射性物質(zhì)發(fā)生泄漏穷娱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一运沦、第九天 我趴在偏房一處隱蔽的房頂上張望泵额。 院中可真熱鬧,春花似錦茶袒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至澜共,卻和暖如春向叉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗦董。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工母谎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人京革。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓奇唤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親匹摇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咬扇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 以下文章為轉(zhuǎn)載,對(duì)理解JavaScript中的事件處理機(jī)制很有幫助廊勃,淺顯易懂懈贺,特分享于此。 什么是事件? 事件(E...
    jxyjxy閱讀 3,037評(píng)論 1 10
  • DOM0 事件和DOM2級(jí)在事件監(jiān)聽(tīng)使用方式上有什么區(qū)別梭灿? DOM 0 級(jí)事件是基于元素內(nèi)聯(lián)屬性或DOM元素命名的...
    邢烽朔閱讀 337評(píng)論 0 0
  • 什么是事件: 我們可以簡(jiǎn)單的把事件理解為瀏覽器的感知系統(tǒng)画侣。比如說(shuō):他可以感覺(jué)到用戶是否點(diǎn)擊(click)了頁(yè)面、鼠...
    張松1366閱讀 6,794評(píng)論 1 6
  • JavaScript 程序采用了異步事件驅(qū)動(dòng)編程模型堡妒。在這種程序設(shè)計(jì)風(fēng)格下配乱,當(dāng)文檔、瀏覽器涕蚤、元素或與之相關(guān)的對(duì)象發(fā)...
    劼哥stone閱讀 1,256評(píng)論 3 11
  • 聲明:本文來(lái)源于http://www.webzsky.com/?p=731我只是在這里作為自己的學(xué)習(xí)筆記整理一下(...
    angryyan閱讀 7,021評(píng)論 1 6