js中的事件傳播過程

引子:
父div添加監(jiān)聽事件界逛,子div設(shè)置監(jiān)聽事件昆稿,點擊子元素,會出現(xiàn)什么結(jié)果

事件傳播的三個過程息拜,事件捕獲階段溉潭、處于目標(biāo)階段、事件冒泡階段少欺。
事件捕獲由遠(yuǎn)及近逐漸靠近事件目標(biāo)喳瓣,事件冒泡由事件目標(biāo)逐漸向上冒泡
那是不是所有的事件都要經(jīng)歷這三個過程呢?其實不然

IE:它認(rèn)為事件流應(yīng)該是事件冒泡赞别。
Netscape:它則認(rèn)為事件流應(yīng)該是事件捕獲畏陕。
W3C:首先是事件捕獲然后事件冒泡

在支持w3c的瀏覽器中,程序員可以通過設(shè)置addEventListener(type,handler,useCapture)中的userCapture值來決定元素是在冒泡階段執(zhí)行事件還是捕獲階段執(zhí)行仿滔,默認(rèn)為false惠毁,即冒泡階段。
IE沒有提供選擇堤撵,事件只能在冒泡階段捕獲仁讨。
偷個圖[https://www.w3cin.com/2016/06/03/%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84DOM%E4%BA%8B%E4%BB%B6/]

事件傳播三個階段

IE9羽莺、Opera实昨、Firefox、Chrome和Safari都支持DOM事件流盐固。
寫個代碼測試一下
頁面內(nèi)容很簡單荒给,父div子div

<div id="parent">
        parent
        <div id="child">child</div>
    </div>

因為考慮到瀏覽器兼容性丈挟,先寫一個跨瀏覽器事件處理函數(shù)

var eventHandler={
            addEventHandler:function(ele,type,handler,capture){
                if(ele.addEventListener){
                    ele.addEventListener(type,handler,capture);
                }else if(ele.attachEvent){
                    //ie下是需要加on的
                    //ele.attachEvent(type,handler);
                    ele.attachEvent('on'+type,handler);
                }else{
                    ele['on'+type]=handler;
                }
            },
            stopPropagation:function(event){
                event=event||window.event;
                if(event.stopPropagation){
                    event.stopPropagation();
                }else{
                    event.cancelBubble=true;
                }
            },
            preventDefault:function(event){
                event=event||window.event;
                if(event.preventDefault){
                    event.preventDefault();
                }else{
                    event.returnValue=true;
                }
            }
        }

進(jìn)入正題,對父子div添加監(jiān)聽函數(shù)

window.onload=function(){
            var parent=document.getElementById("parent");
            var child=document.getElementById("child");
            eventHandler.addEventHandler(parent,'click',function(e){
                console.log("parent捕獲階段");
            },true);
            eventHandler.addEventHandler(parent,'click',function(e){
                console.log("parent冒泡階段");
            },false);
            eventHandler.addEventHandler(child,'click',function(e){
                console.log("child冒泡階段");
            },false);
            eventHandler.addEventHandler(child,'click',function(e){
                console.log("child捕獲階段");
            },true);
        }

chrome下測試結(jié)果:

image.png

事件果然是從父div到子div被捕獲志电,然后從子div到父div冒泡曙咽。
注意:此處對子div綁定了兩個事件,即冒泡事件和捕獲事件挑辆,這兩個事件的執(zhí)行順序是按照綁定的先后順序執(zhí)行的例朱,如果把兩個執(zhí)行函數(shù)替換一下,結(jié)果就會先打印child捕獲階段鱼蝉,再打印child冒泡階段洒嗤,不信你試試~

ie8下的測試結(jié)果:

image.png

ie下不存在捕獲階段,直接從冒泡階段開始魁亦,由子div到父div打印事件渔隶。此處應(yīng)該注意,對重復(fù)綁定的事件洁奈,在IE9以下的瀏覽器中執(zhí)行順序都是反著的间唉,因為IE9開始已經(jīng)支持addEventListener()方法所以不會在有這個問題了。
比如現(xiàn)在我把事件的執(zhí)行順序改為

eventHandler.addEventHandler(parent,'click',function(e){
                console.log("parent捕獲階段");
                // eventHandler.stopPropagation(e);
            },true);
            eventHandler.addEventHandler(parent,'click',function(e){
                console.log("parent冒泡階段");
            },false);
            eventHandler.addEventHandler(child,'click',function(e){
                console.log("child捕獲階段");
            },true);
            eventHandler.addEventHandler(child,'click',function(e){
                console.log("child冒泡階段");
            },false);

chrome下的執(zhí)行結(jié)果為:

image.png

ie8下的執(zhí)行結(jié)果為:

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末利术,一起剝皮案震驚了整個濱河市呈野,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌印叁,老刑警劉巖际跪,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喉钢,居然都是意外死亡姆打,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門肠虽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幔戏,“玉大人,你說我怎么就攤上這事税课∠醒樱” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵韩玩,是天一觀的道長垒玲。 經(jīng)常有香客問我,道長找颓,這世上最難降的妖魔是什么合愈? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上佛析,老公的妹妹穿的比我還像新娘益老。我一直安慰自己,他們只是感情好寸莫,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布捺萌。 她就那樣靜靜地躺著,像睡著了一般膘茎。 火紅的嫁衣襯著肌膚如雪桃纯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天披坏,我揣著相機(jī)與錄音慈参,去河邊找鬼。 笑死刮萌,一個胖子當(dāng)著我的面吹牛驮配,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播着茸,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼壮锻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了涮阔?” 一聲冷哼從身側(cè)響起猜绣,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敬特,沒想到半個月后掰邢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡伟阔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年辣之,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皱炉。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡怀估,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出合搅,到底是詐尸還是另有隱情多搀,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布灾部,位于F島的核電站康铭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赌髓。R本人自食惡果不足惜从藤,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一催跪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呛哟,春花似錦、人聲如沸匿沛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逃呼。三九已至鳖孤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抡笼,已是汗流浹背苏揣。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留推姻,地道東北人平匈。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像藏古,于是被迫代替她去往敵國和親增炭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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

  • 以下文章為轉(zhuǎn)載拧晕,對理解JavaScript中的事件處理機(jī)制很有幫助隙姿,淺顯易懂,特分享于此厂捞。 什么是事件输玷? 事件(E...
    jxyjxy閱讀 3,035評論 1 10
  • 1. 事件冒泡與事件捕獲 事件冒泡和事件捕獲分別由微軟和網(wǎng)景公司提出,這兩個概念都是為了解決頁面中事件流(事件發(fā)生...
    cbw100閱讀 2,696評論 0 8
  • 聲明:本文來源于http://www.webzsky.com/?p=731我只是在這里作為自己的學(xué)習(xí)筆記整理一下(...
    angryyan閱讀 7,011評論 1 6
  • 1.何謂事件 用戶和網(wǎng)頁交互時的行為,動作,稱之為事件; 2.監(jiān)視事件 現(xiàn)實生活中靡馁,為了監(jiān)視車輛是否違章欲鹏,通過在紅...
    草鞋弟閱讀 605評論 0 0
  • 磨山的來歷 張淑英 在永城市芒山鎮(zhèn)芒碭山群的眾多山中,有一座山叫磨山臭墨。這座山因何得名貌虾?關(guān)于它的名字其實是有著一段動...
    秦小簡閱讀 189評論 0 0