事件總結(jié)

DOM事件主要內(nèi)容

  • 事件流
  • 事件注冊(cè)
  • 事件對(duì)象
  • 事件分類
  • 事件代理

什么是DOM事件?

  • 事件是某個(gè)行為或者觸發(fā)恋谭,比如點(diǎn)擊于购、鼠標(biāo)移動(dòng)
  • 當(dāng)用戶點(diǎn)擊鼠標(biāo)時(shí)
  • 當(dāng)網(wǎng)頁已加載時(shí)
  • 當(dāng)圖像已加載時(shí)
  • 當(dāng)鼠標(biāo)移動(dòng)到元素上時(shí)
  • 當(dāng)用戶觸發(fā)按鍵時(shí)...

事件流

事件流
事件流
  • capture phase捕獲事件
    • 事件對(duì)象通過目標(biāo)的祖先從傳播窗口到目標(biāo)的父。這個(gè)階段也被稱為捕獲階段
  • target phase
    • DOM2級(jí)事件規(guī)定事件流包括三個(gè)階段,事件捕獲階段油挥,處于目標(biāo)階段稻扬,事件冒泡階段想诅,首先發(fā)生的是事件捕獲薄声,為截取事件提供機(jī)會(huì),然后是實(shí)際目標(biāo)接收事件破镰,最后是冒泡階段
  • bubble phase 冒泡
    • IE的事件冒泡:事件開始時(shí)由最具體的元素接收餐曼,然后逐級(jí)向上傳播到較為不具體的元素

參考資料: 事件流


事件注冊(cè)與觸發(fā)

在講述事件注冊(cè)之前,講一下前面的事件處理程序

  • HTML內(nèi)聯(lián)方式
    • 存在加載順序問題,如果事件處理程序在html代碼之后加載鲜漩,用戶可能在事件處理程序還未加載完成時(shí)就點(diǎn)擊按鈕之類的觸發(fā)事件源譬,存在時(shí)間差問題
    • 這樣書寫html代碼和JavaScript代碼緊密耦合,維護(hù)不方便
<input type="button" value="Click Here" onclick="alert('Clicked!');" />
  • JavaScript指定事件處理程序
    • 把一個(gè)方法賦值給一個(gè)元素的事件處理程序?qū)傩浴?/li>
    • 可以刪除事件處理程序宇整,只需把元素的onclick屬性賦為null即可
<input id="btnClick" type="button" value="Click Here" />

<script type="text/javascript">
    var btnClick = document.getElementById('btnClick');
    btnClick.onclick = function showMessage() {
        alert(this.id);
    };
</script>

事件注冊(cè)(DOM2事件處理程序)

  • eventTarget.addEventListener(type,listener[,useCapture])
    • 事件類型
    • 事件處理方法
    • 布爾參數(shù)瓶佳,如果是true表示在捕獲階段調(diào)用事件處理程序,如果是false鳞青,則是在事件冒泡階段處理
var elem = document.getElementById("div1")
var clickHandler = function(){
  //to do
}
elem.addEventListener('click',clickHandler,false)

取消事件注冊(cè)

  • eventTarget.removeEventListener(type,listener[,useCapture])
    • 事件類型
    • 事件處理方法
    • 布爾參數(shù)霸饲,如果是true表示在捕獲階段調(diào)用事件處理程序,如果是
elem.removeEventListener('click',clickHandler,false)
elem.onclick = null

事件觸發(fā)

  • eventTarget.dispatchEvent(type)
elem.dispatch("click")
瀏覽器兼容性(IE6 7 8)

事件注冊(cè)與取消

IE并不支持addEventListener和removeEventListener方法臂拓,而是實(shí)現(xiàn)了兩個(gè)類似的方法

  • attachEvent
  • detachEvent
    這兩個(gè)方法都接收兩個(gè)相同的參數(shù)
    • 事件處理程序名稱
    • 事件處理程序方法

事件觸發(fā)

  • fireEvent(e)

no capture沒有捕獲

兼容性

事件對(duì)象(共有的)

當(dāng)事件被觸發(fā)的時(shí)候,會(huì)調(diào)用事件處理函數(shù),在調(diào)用時(shí)間處理函數(shù)中,有一些信息,這些信息代表著事件的狀態(tài),這個(gè)就是事件對(duì)象

click為例

  • 屬性
    • type類型:例如點(diǎn)擊什么的...
    • target(srcElement IE低版本)目標(biāo)元素,點(diǎn)擊哪個(gè)就是那個(gè)
    • currentTarget:事件處理程序當(dāng)前處理元素
  • 方法
    • stopPropagation()取消事件進(jìn)一步捕獲或冒泡
    • preventDefault()取消事件默認(rèn)行為

阻止事件傳播(冒泡)

  • event.stopPropagation()W3C
  • event.cancelBubble=trueIE

默認(rèn)行為

  • event.preventDefault()W3C
  • event.returnValue = false IE

事件分類

事件種類

MouseEvent

事件類型 是否冒泡 元素 默認(rèn)事件 元素例子
click(點(diǎn)擊) Yes element focus/activation div
dbclick(雙擊) Yes element focus/activation div
mousedown Yes element drag/scroll text selection div
mousemove Yes element None div
mouseout鼠標(biāo)離開 Yes element None div
mouseover鼠標(biāo)移上去,進(jìn)入子元素也會(huì)觸發(fā) Yes element None div
mouseup Yes element context menu div
mouseenter鼠標(biāo)移上去 No element None div
mouseleave鼠標(biāo)離開 No element None div

MouseEvent對(duì)象

  • 屬性
    • clientX, clientY位置
    • screenX, screenY
    • ctrlKey,shiftKey,altKey,metaKey
    • button(0,1,2)鼠標(biāo)左鍵還是右鍵還是滾輪

MouseEvent事件順序

順序

WheelEvent滾輪事件

事件類型 是否冒泡 元素 默認(rèn)事件 元素例子
wheel Yes element scroll or zoom document div

FocusEvent 元素獲得焦點(diǎn)和失去焦點(diǎn)

事件類型 是否冒泡 元素 默認(rèn)事件 元素例子
blur(失去焦點(diǎn)) No Window,element None window,input
focus(獲得焦點(diǎn)) No Window,element None window,input
focusin(即將獲得焦點(diǎn)) No Window,element None window,input
focunsout(即將失去焦點(diǎn)) No Window,element None window,input
  • 屬性
    • relatedTarget當(dāng)一個(gè)元素失去焦點(diǎn),另一個(gè)元素就會(huì)獲得焦點(diǎn)
事件類型 是否冒泡 元素 默認(rèn)事件 元素例子
beforeinput Yes Element Update DOM Element input
input Yes element None input

InputEvent 輸入事件(W3C)

事件類型 是否冒泡 元素 默認(rèn)事件 元素例子
beforeinput Yes Element Update DOM Element input
input Yes element None input
  • onpropertychange(ie)

KeyboardEvent鍵盤事件

事件類型 是否冒泡 元素 默認(rèn)事件 元素例子
keydown Yes Element input bulr/focus input
keyup按下去松開觸發(fā) Yes element None input
  • 屬性
    • key按下什么鍵,值是字符串
    • code
    • ctrlKey,shiftKey,altKey,metaKey
    • repeat持續(xù)按一個(gè)鍵

Event

事件類型 是否冒泡 元素 默認(rèn)事件 元素例子
load(事件加載) NO Window,document,element None window,image,iframe
unload(類似頁面退出) No Window,document,element None window
error(加載錯(cuò)誤) NO Window,element None window,image
select(input被選擇..) NO element None input,textarea
abort(esc) NO window,element None window,image
window對(duì)象 Image
load load
unload error
error abort
abort
<image alt = "photo" src = "www.baidu.com" onerror = "this.src = 'www.wangyi.com'"/>

UIEvent

事件類型 是否冒泡 元素 默認(rèn)事件 元素例子
resize(窗體大小) NO Window,element None window,iframe
scroll(頁面滾從) NO/Yes Document,element None document,div

事件代理

參考我寫的另一片文章 從onClick談事件代理和了解事件傳播機(jī)制

總結(jié)一下不能冒泡的事件:

  • mouseenter
  • mouseleave
  • blur
  • focus
  • focusin
  • focusout
  • load
  • unload
  • error
  • select
  • abort
  • resize
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厚脉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胶惰,更是在濱河造成了極大的恐慌傻工,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孵滞,死亡現(xiàn)場(chǎng)離奇詭異中捆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)坊饶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門泄伪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匿级,你說我怎么就攤上這事蟋滴∪咎” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵津函,是天一觀的道長肖粮。 經(jīng)常有香客問我,道長尔苦,這世上最難降的妖魔是什么涩馆? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮蕉堰,結(jié)果婚禮上凌净,老公的妹妹穿的比我還像新娘悲龟。我一直安慰自己屋讶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布须教。 她就那樣靜靜地躺著皿渗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轻腺。 梳的紋絲不亂的頭發(fā)上乐疆,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音贬养,去河邊找鬼挤土。 笑死,一個(gè)胖子當(dāng)著我的面吹牛误算,可吹牛的內(nèi)容都是我干的仰美。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼儿礼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼咖杂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚊夫,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤诉字,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后知纷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壤圃,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年琅轧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伍绳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹰晨,死狀恐怖墨叛,靈堂內(nèi)的尸體忽然破棺而出止毕,到底是詐尸還是另有隱情,我是刑警寧澤漠趁,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布扁凛,位于F島的核電站,受9級(jí)特大地震影響闯传,放射性物質(zhì)發(fā)生泄漏谨朝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一甥绿、第九天 我趴在偏房一處隱蔽的房頂上張望字币。 院中可真熱鬧,春花似錦共缕、人聲如沸洗出。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翩活。三九已至,卻和暖如春便贵,著一層夾襖步出監(jiān)牢的瞬間菠镇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工承璃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留利耍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓盔粹,卻偏偏與公主長得像隘梨,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玻佩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • JavaScript 程序采用了異步事件驅(qū)動(dòng)編程模型出嘹。在這種程序設(shè)計(jì)風(fēng)格下,當(dāng)文檔咬崔、瀏覽器税稼、元素或與之相關(guān)的對(duì)象發(fā)...
    劼哥stone閱讀 1,257評(píng)論 3 11
  • 什么是事件: 事件是交互體驗(yàn)的核心功能 一.事件冒泡: 當(dāng)一個(gè)事件發(fā)生時(shí),這個(gè)事件會(huì)從內(nèi)向外逐層傳遞垮斯。 二.為什么...
    輕描淡寫mua閱讀 519評(píng)論 0 0
  • 以下文章為轉(zhuǎn)載郎仆,對(duì)理解JavaScript中的事件處理機(jī)制很有幫助,淺顯易懂兜蠕,特分享于此扰肌。 什么是事件? 事件(E...
    jxyjxy閱讀 3,041評(píng)論 1 10
  • 什么是事件熊杨? JavaScript與HTML之間的交互是通過事件實(shí)現(xiàn)的曙旭。事件盗舰,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特定...
    LeeoZz閱讀 186評(píng)論 0 0
  • 是堅(jiān)決不了的可否與否 欲沉不沉的殘陽似夠不夠 皸裂開來的眼眸 摻和著你的影子佝僂 像風(fēng)衣的袋子不愁也愁 本是一紙的...
    FTHEG閱讀 256評(píng)論 0 0