JavaScript事件處理程序與事件對象

__ 一郁稍、事件冒泡和事件捕獲__

  • 事件冒泡
    事件冒泡就是從HTML中具體的一個元素,沿著DOM樹胜宇,向父級冒泡耀怜,直到document。
    demo驗證
<body>
    <div class="one">one
        <div class="two">two
            <div class="three">three</div>
        </div>
    </div>
    <script type="text/javascript">
        var one=document.getElementsByClassName("one")[0];
        var two=document.getElementsByClassName("two")[0];
        var three=document.getElementsByClassName("three")[0];
        var html=document.getElementsByTagName("html")[0];
        var test=false;
        one.addEventListener('click',function(){
            console.log("one");
        },test);
        two.addEventListener('click',function(){
            console.log("two");
        },test);
        three.addEventListener('click',function(){
            console.log("three");
        },test);
        document.body.addEventListener('click',function(){
            console.log("body");
        },test);
        html.addEventListener('click',function(){
            console.log("html");
        },test);
        document.addEventListener('click',function(){
            console.log("document");
        },test);
    </script>
</body>

點擊three桐愉,控制臺結果:
three
two
one
body
html
document
IE5.5及更早版本事件冒泡會跳過html元素财破,從body直接到document。

  • 事件捕獲
    事件捕獲是與事件冒泡相反的過程从诲,沿著DOM樹左痢,事件最先觸發(fā)最頂級的元素,依次向下到最底層的元素系洛。
    把代碼中的test=true俊性,再次點擊three,控制臺結果:
    document
    html
    body
    one
    two
    three
    支持的瀏覽器:IE9描扯,Safari定页,Chrome,OPera绽诚,FireFox
    由于老版本瀏覽器不支持典徊,因此很少使用事件捕獲,書中也建議我們使用事件冒泡恩够。

__ 二卒落、事件處理程序 __
事件處理程序有三種
1、是在HTML中嵌入事件處理程序
2蜂桶、DOM0級事件處理程序
3儡毕、DOM2級事件處理程序
添加事件:addEventListener(type,function,Boolean)
移除事件:removeEventListener(type,function,Boolean)
type:事件類型,function:事件執(zhí)行的函數扑媚,Boolean:true事件捕獲妥曲,false事件冒泡。
支持的瀏覽器:IE9钦购、FireFox,Safari褂萧,Chrome押桃,OPera
4、IE事件處理程序
添加事件:attachEvent(type,function)
移除事件:detachEvent(type,function)
IE8-只支持事件冒泡导犹,通過此方法的事件都會添加到冒泡階段唱凯。

三羡忘、事件對象
在觸發(fā)DOM上的某個事件時,會產生一個事件對象event磕昼。

  • DOM事件對象:
    兼容的DOM會將一個event對象傳入到事件處理程序中卷雕,無論指定事件處理成程序時使用什么方法(Dom0級、DOM2級)票从,都會傳入event對象漫雕。
屬性/ 方法 類型 讀/寫 說明
bubbles Boolean 只讀 表明事件是否冒泡
cancelable Boolean 只讀 表明是否可以取消事件的默認行為
currentTarget Element 只讀 其事件處理程序當前正在處理事件的那個元素
defaultPrevented Boolean 只讀 為true表明已經調用了preventDefault()方法
detail Integer 只讀 與事件相關的細節(jié)信息
eventPhase Integer 只讀 調用事件處理程序的階段,1捕獲階段峰鄙,2處于目標階段浸间,3冒泡階段
preventDefault() Function 只讀 取消事件的默認行為,如果cancelable為true吟榴,則可以使用
stopImmediatePropagation() Function 只讀 取消事件的進一步捕獲或冒泡魁蒜,同時阻止任何事件處理程序被調用
stopPropagation() Function 只讀 取消事件的進一步捕獲或冒泡,如果bubbels為true吩翻,則可以使用這個方法
target Element 只讀 事件的目標
trusted Blooean 只讀 為true表示事件是瀏覽器生成的兜看,為false表示事件是由開發(fā)人員通過js創(chuàng)建的
type String 只讀 被觸發(fā)的事件的類型
view AbstractView 只讀 與事件關聯(lián)的抽象視圖。等同于發(fā)生事件的window對象
  • IE中的事件對象
    在使用DOM0級方法添加事件處理程序時狭瞎,event作為window對象的一個屬性event=window.event
    如果事件處理程序是使用attachEvent()添加的细移,那么就會有一個event作為參數傳入事件處理程序函數中。
屬性/ 方法 類型 讀/寫 說明
cancelBubble Blooean 讀/寫 默認值為false脚作,但將其設置為true就可以取消事件冒泡葫哗,與DOM中stopPropagation()的方法作用相同
returnvalue Blooean 讀/寫 默認值為true,但將其設置為fasle球涛,就可以取消事件的默認行為劣针,與DOM中的preventDefault()方法的作用相同
srcElement Element 只讀 事件的目標,與DOM中的target屬性相同
type String 只讀 被觸發(fā)的事件類型

四亿扁、跨瀏覽器的事件處理程序以及事件對象

/**
跨瀏覽器事件處理程序
*/
var EventUtil={
    //事件處理程序
    addHandler:function(element,typo,handler){
        if(element.addEventListener){
            element.addEventListener(type,handler,false);//Dom2級事件監(jiān)聽
        }else if(element.attachEvent){
            element.attachEvent("on"+type,handler);//IE事件處理程序
        }else{                             
            element["on"+type]=handler;//DOM0級事件處理程序
        }
    },
    removeHandler:function(element,typo,handler){
        if(element.removeEventListener){
            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.stopPropagation){
            event.stopPropagation();
        }else{
            event.cancelBubble=true;
        }
    },
}

由于IE9以前不支持事件捕獲捺典,因此stopPropagation()只能用來阻止事件冒泡。
簡要的筆記从祝,先記到這里襟己,后面再繼續(xù)深入學習各種事件類型,加油k鼓啊G嬖 !

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末毒涧,一起剝皮案震驚了整個濱河市贮预,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖仿吞,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滑频,死亡現場離奇詭異,居然都是意外死亡唤冈,警方通過查閱死者的電腦和手機峡迷,發(fā)現死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來你虹,“玉大人绘搞,你說我怎么就攤上這事∈燮希” “怎么了看杭?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挟伙。 經常有香客問我楼雹,道長,這世上最難降的妖魔是什么尖阔? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任贮缅,我火速辦了婚禮,結果婚禮上介却,老公的妹妹穿的比我還像新娘谴供。我一直安慰自己,他們只是感情好齿坷,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布桂肌。 她就那樣靜靜地躺著,像睡著了一般永淌。 火紅的嫁衣襯著肌膚如雪崎场。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天遂蛀,我揣著相機與錄音谭跨,去河邊找鬼。 笑死李滴,一個胖子當著我的面吹牛螃宙,可吹牛的內容都是我干的。 我是一名探鬼主播所坯,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谆扎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芹助?” 一聲冷哼從身側響起燕酷,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤籍凝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后苗缩,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡声诸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年酱讶,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彼乌。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡泻肯,死狀恐怖,靈堂內的尸體忽然破棺而出慰照,到底是詐尸還是另有隱情灶挟,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布毒租,位于F島的核電站稚铣,受9級特大地震影響,放射性物質發(fā)生泄漏墅垮。R本人自食惡果不足惜惕医,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望算色。 院中可真熱鬧抬伺,春花似錦、人聲如沸灾梦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽若河。三九已至能岩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牡肉,已是汗流浹背捧灰。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留统锤,地道東北人毛俏。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像饲窿,于是被迫代替她去往敵國和親煌寇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內容

  • DOM0級和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別逾雄? DOM0級事件監(jiān)聽:用JavaScript指定事件處理程序...
    LeeoZz閱讀 379評論 0 1
  • 以下文章為轉載阀溶,對理解JavaScript中的事件處理機制很有幫助腻脏,淺顯易懂,特分享于此银锻。 什么是事件永品? 事件(E...
    jxyjxy閱讀 3,041評論 1 10
  • 本文主要談及問題: 關于編寫跨瀏覽器的事件處理函數和事件對象 關于編寫跨瀏覽器的事件處理函數和事件對象 為什么要編...
    JimmyChung閱讀 2,128評論 0 4
  • 1.事件代理 事件代理:為子元素添加監(jiān)聽器轉變?yōu)闉楦溉萜魈砑颖O(jiān)聽器,然后通過event.target判斷具體操作的...
    IT男的成長記錄閱讀 526評論 0 0
  • 大學之道在止于至善,在敬誠击纬,在虛懷若谷鼎姐,在廣結善緣,在志于求道更振! 欲止于至善炕桨,需讀《大學》,需悟修身之本肯腕,不知格物...
    弘二大師閱讀 1,013評論 0 4