事件模型

DOM事件流(不適用于IE8及以下版本IE)

“DOM2級事件”規(guī)定的事件流包括三個階段
當一個事件發(fā)生以后,它會在不同的DOM節(jié)點之間傳播(propagation)。這種傳播分成三個階段:

第一階段:從window對象傳導到目標節(jié)點,稱為“捕獲階段”(capture phase)。
第二階段:在目標節(jié)點上觸發(fā)趟章,稱為“目標階段”(target phase)。
第三階段:從目標節(jié)點傳導回window對象慎王,稱為“冒泡階段”(bubbling phase)蚓土。

綁定監(jiān)聽函數的方法

  1. HTML元素的on-屬性
//js中定義fun方法。
    <script type="text/javascript">
        function fun(){
            console.log(this)
        }
    </script>
<div id="test" onclick="fun()"></div>
//等同于 使用元素節(jié)點的setAttribute方法 設置相應的屬性赖淤。
document.getElementById("test").setAttribute('onclick', 'fun()')
//等效于
document.getElementById("test").onclick=function onclick(event) {
    fun()
}
  • 屬性值是可執(zhí)行的代碼蜀漆,而不是監(jiān)聽函數,所以要執(zhí)行函數咱旱,不要忘記加上一對圓括號确丢。
  • 事件觸發(fā)后" "中的代碼被執(zhí)行。定義好的fun函數被調用吐限。函數調用模式鲜侥,非嚴格模式fun函數中this指向window。
  • 使用這個方法指定的監(jiān)聽函數诸典,只會在冒泡階段觸發(fā)描函。
  • 若要訪問event對象。必須要這樣。在調用監(jiān)聽函數時間舀寓,一定要顯示傳入event對象

<div id="test" onclick="fun(event)"></div>

  1. Element節(jié)點的事件屬性
    Element節(jié)點有事件屬性胆数,同樣可以指定監(jiān)聽函數。
div.onclick = function(){ console.log(this)};
  • 事件觸發(fā)后執(zhí)行該元素節(jié)點的onclick方法基公。方法調用模式 幅慌, 函數中this指向該節(jié)點對象。
  • 使用這個方法指定的監(jiān)聽函數轰豆,只會在冒泡階段觸發(fā)胰伍。
  • 只能給元素節(jié)點和document節(jié)點指定監(jiān)聽函數,不能給文本節(jié)點指定監(jiān)聽函數酸休。
  1. 使用addEventListener方法也可以在骂租,定義一個特定事件的監(jiān)聽函數。
    addEventListener是推薦的指定監(jiān)聽函數的方法斑司。它有如下優(yōu)點:

可以針對同一個事件渗饮,添加多個監(jiān)聽函數。
能夠指定在哪個階段(捕獲階段還是冒泡階段)觸發(fā)監(jiān)聽函數,默認為false(只在冒泡階段被觸發(fā))宿刮。
除了DOM節(jié)點(所有DOM節(jié)點)互站,還可以部署在window、XMLHttpRequest等對象上面僵缺,等于統(tǒng)一了整個JavaScript的監(jiān)聽函數接口胡桃。

  • addEventListener 添加的方法只能用remoEventListener 移除
事件綁定時的this指向

以下寫法的this對都指向Element節(jié)點:

// JavaScript代碼
element.onclick = printelement.addEventListener('click', print, false)
element.onclick = function () {console.log(this.id);}
// HTML代碼
<element onclick="console.log(this.id)">

以下寫法的this,都指向全局對象磕潮。

// JavaScript代碼
element.onclick = function (){ doSomething() };
element.setAttribute('onclick', 'doSomething()');
// HTML代碼
<element onclick="doSomething()">

在監(jiān)聽函數中翠胰,currentTarget屬性實際上等同于this對象。

IE8及以下版本自脯,事件對象不作為參數傳遞之景,而是通過window對象的event屬性讀取,并且事件對象的target屬性叫做srcElement屬性膏潮。所以锻狗,以前獲取事件信息,往往要寫成下面這樣戏罢。

     var actualEvent = event || window.event;
     var actualTarget = actualEvent.target || actualEvent.srcElement;
     //...
}```
  其他瀏覽器中事件對象會作為參傳遞屋谭,同時會將值賦給window.event
#####preventDefault():
preventDefault方法取消瀏覽器對當前事件的默認行為,比如點擊鏈接 后龟糕,瀏覽器跳轉到指定頁面,或者按一下空格鍵悔耘,頁面向下滾動一段距離讲岁。該方法生效的前提是,事件的cancelable屬性為true,如果為false缓艳,則調用該方法沒有任何效果校摩。
#####event.stopPropagation():
stopPropagation方法阻止事件在DOM中繼續(xù)傳播,防止再觸發(fā)定義在別的節(jié)點上的監(jiān)聽函數阶淘,但是不包括在當前節(jié)點上新定義的事件監(jiān)聽函數衙吩。

function stopEvent(e) {
e.stopPropagation();
}
el.addEventListener('click', stopEvent, false);


將上面函數指定為監(jiān)聽函數,會阻止事件進一步冒泡到el節(jié)點的父節(jié)點溪窒。
#####event.cancelBubble=true;
event.cancelBubble=true 阻止事件冒泡坤塞。不同于event.stopPropagation() 它阻止的只是冒泡階段的事件傳遞,
關于阻止事件傳遞澈蚌,一直有如下謬論:
>event.cancelBubble=true用于ie的阻止冒泡事件摹芙,
event.stopPropagation()用于firefox和chrome等其他瀏覽器。

ie9及以上版本IE宛瞄,和其他瀏覽器(chrome Firefox safari opera Edge)中都可以用event.cancelBubble=true浮禾;取消事件冒泡。除此之外份汗,這些瀏覽量器相對于低版本IE 還有了event.stopPropagation()方法 用于阻止事件在DOM中繼續(xù)傳播包括捕獲和冒泡盈电。

#####event.stopImmediatePropagation()
stopImmediatePropagation
方法阻止同一個事件的其他監(jiān)聽函數被調用。
如果同一個節(jié)點對于同一個事件指定了多個監(jiān)聽函數杯活,這些函數會根據添加的順序依次調用匆帚。只要其中有一個監(jiān)聽函數調用了stopImmediatePropagation方法,其他的監(jiān)聽函數就不會再執(zhí)行了轩猩。

function l1(e){
e.stopImmediatePropagation();
}
function l2(e){
console.log('hello world');
}el.addEventListener('click', l1, false);
el.addEventListener('click', l2, false);

上面代碼在el節(jié)點上卷扮,為click事件添加了兩個監(jiān)聽函數l1和l2。由于l1調用了stopImmediatePropagation方法均践,所以l2不會被調用晤锹。
#####return false 
可以同時取消事件冒泡和默認事件
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市彤委,隨后出現的幾起案子鞭铆,更是在濱河造成了極大的恐慌,老刑警劉巖焦影,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件车遂,死亡現場離奇詭異,居然都是意外死亡斯辰,警方通過查閱死者的電腦和手機舶担,發(fā)現死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彬呻,“玉大人衣陶,你說我怎么就攤上這事柄瑰。” “怎么了剪况?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵教沾,是天一觀的道長。 經常有香客問我译断,道長授翻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任孙咪,我火速辦了婚禮堪唐,結果婚禮上,老公的妹妹穿的比我還像新娘该贾。我一直安慰自己羔杨,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布杨蛋。 她就那樣靜靜地躺著兜材,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逞力。 梳的紋絲不亂的頭發(fā)上曙寡,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音寇荧,去河邊找鬼举庶。 笑死,一個胖子當著我的面吹牛揩抡,可吹牛的內容都是我干的户侥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼峦嗤,長吁一口氣:“原來是場噩夢啊……” “哼蕊唐!你這毒婦竟也來了?” 一聲冷哼從身側響起烁设,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤替梨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后装黑,有當地人在樹林里發(fā)現了一具尸體副瀑,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年恋谭,在試婚紗的時候發(fā)現自己被綠了糠睡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡疚颊,死狀恐怖铜幽,靈堂內的尸體忽然破棺而出滞谢,到底是詐尸還是另有隱情串稀,我是刑警寧澤除抛,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站母截,受9級特大地震影響到忽,放射性物質發(fā)生泄漏。R本人自食惡果不足惜清寇,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一喘漏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧华烟,春花似錦翩迈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喂链,卻和暖如春返十,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椭微。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工洞坑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝇率。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓迟杂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親本慕。 傳聞我的和親對象是個殘疾皇子排拷,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容