dom事件編程

"事件是一種異步編程的實現(xiàn)方式雨饺,本質(zhì)上是程序各個組成部分之間的通信荐吉。

1、EventTarget接口

dom的事件操作(監(jiān)聽和觸發(fā))蝗拿,都定義在這個接口上晾捏。

該接口有三個方法:

addEventListener:綁定事件的監(jiān)聽函數(shù)

removeEventListener:移除事件的監(jiān)聽函數(shù)

dispatchEvent:觸發(fā)事件

1.1、addEventListener

格式:target.addEventListener(type,listener[,useCapture]);

"useCapture":監(jiān)聽函數(shù)是否在捕獲階段觸發(fā)哀托。默認為false(監(jiān)聽函數(shù)在冒泡階段觸發(fā))粟瞬。

addEventListener方法可以給當前對象的同一事件,添加多個監(jiān)聽函數(shù)萤捆,執(zhí)行順序是先添加先執(zhí)行裙品。但是如果監(jiān)聽函數(shù)也是同一個,則只執(zhí)行一次俗或。

1.2市怎、removeEventListener()

removeEventListener方法用來移除addEventListener方法添加的事件監(jiān)聽函數(shù)。

1.3辛慰、dispatchEvent()

當前節(jié)點觸發(fā)指定事件区匠,從未觸發(fā)監(jiān)聽的函數(shù)。這個方法類似于jQuery中的trigger方法,主動觸發(fā)某個element上的監(jiān)聽方法驰弄。

溫馨提示:上面說到了可以使用腳本去觸發(fā)一個事件的發(fā)生麻汰,那如果要區(qū)分這個事件是用戶真實觸發(fā)還是腳本觸發(fā)該怎么辦呢?可以使用event對象下的 isTrusted 屬性戚篙。event.isTrusted:用戶觸發(fā)的事件返回true五鲫,腳本觸發(fā)的返回false。

2岔擂、監(jiān)聽函數(shù)

dom提供三種方式位喂,用來為事件綁定監(jiān)聽函數(shù)。

2.1乱灵、on-屬性

就是行內(nèi)點擊事件塑崖,<div onclick="myClick()">點我</div>

2.2、element節(jié)點的事件屬性

window.onload=doSomething;

div.onclick=function(event){console.log('觸發(fā)事件');};

使用這個方法指定的監(jiān)聽函數(shù)痛倚,只會在冒泡階段觸發(fā)规婆。

2.3、addEventListener方法

使用 html標簽 on-屬性蝉稳,違反了html和js代碼分離原則聋呢;使用 element節(jié)點的事件屬性 的缺點是,同一個事件只能定義一個監(jiān)聽函數(shù)颠区,也就是說削锰,如果定義兩次onclick屬性,后一次定義會覆蓋前一次毕莱。因此器贩,這兩種方法都不推薦使用。

推薦使用 addEventListener 有點如下:

①朋截、可以針對同一個事件蛹稍,添加多個監(jiān)聽函數(shù)。

②部服、能夠指定在哪個階段(捕獲階段還是冒泡階段)觸發(fā)回監(jiān)聽函數(shù)唆姐。

③、除了DOM節(jié)點廓八,還可以部署在window奉芦、XMLHttpRequest等對象上面剩瓶,等于統(tǒng)一了整個JavaScript的監(jiān)聽函數(shù)接口腊凶。

2.4乃沙、this對象的指向

使用addEventListener 觸發(fā)函數(shù)中的this指向 element對象矾芙。

使用on-屬性,觸發(fā)函數(shù)中的this不會指向觸發(fā)事件的元素節(jié)點劫拢。

3褐奥、事件傳播

3.1仰挣、事件傳播的三個階段

事件在dom之間傳播有三個階段:捕獲階段、目標階段伸蚯、冒泡階段

事件傳播的最上層對象是window摩渺,接著依次是document,html(document.documentElement)和body(document.dody)剂邮。也就是說摇幻,如果元素中有一個

元素,點擊該元素抗斤。事件的傳播順序囚企,在捕獲階段依次為window丈咐、document瑞眼、html、body棵逊、div伤疙,在冒泡階段依次為div、body辆影、html徒像、document、window蛙讥。

注意锯蛀,用戶點擊網(wǎng)頁的時候,瀏覽器總是假定click事件的目標節(jié)點次慢,就是點擊位置的嵌套最深的那個節(jié)點(嵌套在節(jié)點的節(jié)點)旁涤。所以,最底層那個節(jié)點的捕獲階段和冒泡階段迫像,都會顯示為target階段劈愚。

如果希望事件到某個節(jié)點為止,不再傳播闻妓,可以使用事件對象的stopPropagation方法菌羽。

4、自定義事件和事件模擬

除了瀏覽器預定義的那些事件由缆,用戶還可以自定義事件注祖,然后手動觸發(fā)。

這種方式IE不支持均唉。

5氓轰、事件冒泡

e.preventDefault(); // 只阻止事件的默認行為,但不能阻止事件往上冒泡浸卦。

window.event.returnValue = false; //IE中阻止函數(shù)器默認動作的方式?


e.stopPropagation(); // 可以阻止事件冒泡

e.cancelBubble = true; // IE下阻止事件冒泡

比較暴力的方式有:

return false; // 阻止事件冒泡

擴展:

e.stopImmediatePropagatio() //同一節(jié)點添加多個點擊事件時署鸡,使用這個API可以控制后續(xù) handle是否執(zhí)行

Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree.

比如一個 div 添加?addEventListener? click事件,添加兩次,當我們點擊這個div時靴庆,這兩個監(jiān)聽事件都會執(zhí)行时捌,那能不能控制在第一個監(jiān)聽回調(diào)函數(shù),控制第二個回調(diào)函數(shù)不執(zhí)行呢炉抒?可以奢讨。在第一個回調(diào)函數(shù)執(zhí)行?e.stopImmediatePropagatio() ,第二個函數(shù)就不會執(zhí)行了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焰薄,一起剝皮案震驚了整個濱河市拿诸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塞茅,老刑警劉巖亩码,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異野瘦,居然都是意外死亡描沟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門鞭光,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吏廉,“玉大人,你說我怎么就攤上這事惰许∠玻” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵汹买,是天一觀的道長佩伤。 經(jīng)常有香客問我,道長卦睹,這世上最難降的妖魔是什么畦戒? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮结序,結(jié)果婚禮上障斋,老公的妹妹穿的比我還像新娘。我一直安慰自己徐鹤,他們只是感情好垃环,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著返敬,像睡著了一般遂庄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劲赠,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天涛目,我揣著相機與錄音秸谢,去河邊找鬼。 笑死霹肝,一個胖子當著我的面吹牛估蹄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沫换,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼臭蚁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了讯赏?” 一聲冷哼從身側(cè)響起垮兑,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漱挎,沒想到半個月后系枪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡识樱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年嗤无,在試婚紗的時候發(fā)現(xiàn)自己被綠了震束。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怜庸。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖垢村,靈堂內(nèi)的尸體忽然破棺而出割疾,到底是詐尸還是另有隱情,我是刑警寧澤嘉栓,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布宏榕,位于F島的核電站,受9級特大地震影響侵佃,放射性物質(zhì)發(fā)生泄漏麻昼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一馋辈、第九天 我趴在偏房一處隱蔽的房頂上張望抚芦。 院中可真熱鬧,春花似錦迈螟、人聲如沸叉抡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褥民。三九已至,卻和暖如春洗搂,著一層夾襖步出監(jiān)牢的瞬間消返,已是汗流浹背载弄。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撵颊,地道東北人侦锯。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像秦驯,于是被迫代替她去往敵國和親尺碰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

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

  • 事件是一種異步編程的實現(xiàn)方式译隘,本質(zhì)上是程序各個組成部分之間的通信亲桥。DOM支持大量的事件,本節(jié)介紹DOM的事件編程固耘。...
    周花花啊閱讀 593評論 0 3
  • 以下文章為轉(zhuǎn)載题篷,對理解JavaScript中的事件處理機制很有幫助,淺顯易懂厅目,特分享于此番枚。 什么是事件? 事件(E...
    jxyjxy閱讀 3,035評論 1 10
  • 導讀:本文是teren對DOM事件知識點所做的進一步整理损敷,整理資料主要參考DOM事件簡介和饑人谷課件葫笼,如果對DOM...
    犯迷糊的小羊閱讀 4,023評論 1 5
  • 一路星、問答 1. dom對象的innerText和innerHTML有什么區(qū)別? innerHTML: 也就是從對象...
    饑人谷_羅偉恩閱讀 596評論 0 2
  • “你好诱桂,我在夢中見過你” “噗~”夏夢馳差點將嘴里的酒噴出來洋丐。她一早就注意到了易小年,也看到了易小年往這邊走過來挥等,...
    偶米豆腐閱讀 235評論 0 1