js事件那些事

涵蓋知識點:
1、事件流翎猛,事件捕獲胖翰,事件冒泡概念
2、跨瀏覽器事件兼容解決方案(柯里化函數(shù)提前返回)
3切厘、標準事件對象event及ie事件對象常用屬性
4萨咳、ie中attatchEvent事件處理程序中this指向問題

一、事件流

1.ECMAScript標準事件流

標準事件流分為三個階段:事件捕獲階段迂卢,處于目標階段某弦,事件冒泡階段
下面是一段html代碼:

<html>
  <body>
    <div>
      <button>click me</button>
    </div>
  </body>
</html>

當(dāng)點擊button時,會觸發(fā)一個click事件而克,觸發(fā)事件會經(jīng)歷三個階段:
1.1.事件捕獲階段
事件捕獲階段的思想是不太具體的節(jié)點先接收到事件靶壮,最具體的節(jié)點最后接收到事件,這個階段做的事情是捕獲事件
此例中事件捕獲傳播順序為:
document, html, body, div, button
1.2.處于目標階段
實際目標接收到事件
1.3.事件冒泡階段
最后一個階段员萍,事件冒泡的順序是從最具體的節(jié)點到最不具體的節(jié)點腾降,這個階段對事件做出響應(yīng)
此例中事件冒泡傳播順序為
button, div, body, html, document

注意:所有的瀏覽器都會將事件冒泡到window對象
注意:雖然DOM事件流規(guī)定不能在事件捕獲階段涉及事件目標,但是ie9以及更高級的瀏覽器支持在事件捕獲階段觸發(fā)事件

2.IE事件流

ie8之前碎绎,ie的事件流只有冒泡階段螃壤,沒有捕獲階段

3.事件執(zhí)行順序

一般事件的執(zhí)行順序是:事件捕獲階段 ==>> 處于目標階段 ==>> 事件冒泡階段 ==>> 事件默認行為
事件默認行為最后執(zhí)行,為阻止事件的默認行為提供了機會

function handler (event) {
  const event = event || window.event
  if (event.preventDefault) {
    event.preventDefault() // 非ie瀏覽器阻止事件默認行為
  } else {
     event.returnValue = false // ie瀏覽器阻止事件默認行為
  }
}

二筋帖、DOM事件

1.DOM0級事件
// 添加事件
el.onclick = function () {
  // ...
}

// 刪除事件
el.onclick = null

DOM0級事件在冒泡階段執(zhí)行

2.DOM2級事件

DOM2級事件定義了兩個方法奸晴,用于綁定和刪除事件
1.1 addEventListener
addEventListener(type, handler, useCapture)
params: type // 要添加的事件類型
params: handler // 事件處理程序
params: useCapture // 是否在捕獲階段執(zhí)行
使用addEventListener方法的好處是可以添加多個函數(shù),并按添加順序執(zhí)行
2.2 removeEventListener
用于移除通過addEventListener添加的函數(shù)日麸,移除時的參數(shù)必須與添加的參數(shù)一致
removeEventListener(type, handler, useCapture)
使用addEventListener添加的事件必須通過removeEventListener移除

3.ie事件

ie8及ie8之前的版本不支持addEventListener, ie實現(xiàn)了 attachEvent和detachEvent方法添加和刪除事件
attachEvent(type, handler)
params: type //type需要加on
params: handler // 事件處理程序
需要注意的是:

el.attachEvent('onclick', function () {
  console.log(this == window) //這里的this 指向window寄啼,而不是指向el
})

為了避免這個問題,我們需要手動將this指向到el

function addEvent (el, type, handler) {
  el.attatchEvent('on' + type, function () {
    handler.apply(el, arguments) // 改變this指向
  })
}
4.跨瀏覽器的事件處理程序(利用柯里化提前返回的特性實現(xiàn))
// 添加事件
const addEvent = function (el, type, handler, isCapture) {
    if (window.addEventListener) {
      return function () {
        el.addEventListener(type, handler, isCapture)
      }
    } else if (window.attachEvent) {
      return function () {
        el.attachEvent('on' + type, handler)
      }
}()

// 刪除事件
const removeEvent = function (el, type, handler, isCupture) {
  if (window.addEventListener) {
    return function () {
      el.removeListener(type, handler, isCapture)
    }
  } else if (window.attachEvent) {
    return function () {
      el.detachEvent('on' + type, handler)
    }
  }
}

三代箭、事件對象

瀏覽器會為事件處理程序注入event對象墩划,常用的event對象的屬性有:
type // 事件類型
target // 事件的目標
currentTarget // 事件處理程序正在處理的元素
perventDefault() // 阻止事件默認行為
stopPropagation // 阻止事件冒泡

ie對象獨有的event屬性:
type // 事件類型
srcElement// 事件的目標
cancelBubble (Boolean) // 阻止事件默認行為
returnValue (Boolean) // 阻止事件冒泡

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嗡综,隨后出現(xiàn)的幾起案子乙帮,更是在濱河造成了極大的恐慌,老刑警劉巖极景,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件察净,死亡現(xiàn)場離奇詭異驾茴,居然都是意外死亡,警方通過查閱死者的電腦和手機氢卡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門沟涨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人异吻,你說我怎么就攤上這事∠才樱” “怎么了诀浪?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長延都。 經(jīng)常有香客問我雷猪,道長,這世上最難降的妖魔是什么晰房? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任求摇,我火速辦了婚禮,結(jié)果婚禮上殊者,老公的妹妹穿的比我還像新娘与境。我一直安慰自己,他們只是感情好猖吴,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布摔刁。 她就那樣靜靜地躺著,像睡著了一般海蔽。 火紅的嫁衣襯著肌膚如雪共屈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天党窜,我揣著相機與錄音拗引,去河邊找鬼。 笑死幌衣,一個胖子當(dāng)著我的面吹牛矾削,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泼掠,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼怔软,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了择镇?” 一聲冷哼從身側(cè)響起挡逼,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腻豌,沒想到半個月后家坎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘱能,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年虱疏,在試婚紗的時候發(fā)現(xiàn)自己被綠了惹骂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡做瞪,死狀恐怖对粪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情装蓬,我是刑警寧澤著拭,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站牍帚,受9級特大地震影響儡遮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜暗赶,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一鄙币、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹂随,春花似錦十嘿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浸锨,卻和暖如春唇聘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柱搜。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工迟郎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人聪蘸。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓宪肖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親健爬。 傳聞我的和親對象是個殘疾皇子控乾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

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

  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的蜕衡。 ??事件,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,495評論 1 11
  • 以下文章為轉(zhuǎn)載设拟,對理解JavaScript中的事件處理機制很有幫助慨仿,淺顯易懂久脯,特分享于此。 什么是事件镰吆? 事件(E...
    jxyjxy閱讀 3,037評論 1 10
  • 什么是事件: 我們可以簡單的把事件理解為瀏覽器的感知系統(tǒng)帘撰。比如說:他可以感覺到用戶是否點擊(click)了頁面、鼠...
    張松1366閱讀 6,794評論 1 6
  • JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的万皿。事件摧找,就是文檔或瀏覽器窗口中發(fā)生的一些特定的交互瞬...
    LemonnYan閱讀 681評論 0 4
  • 事件流 JavaScript與HTML之間的交互是通過事件實現(xiàn)的。事件牢硅,就是文檔或瀏覽器窗口中發(fā)生的一些特定的交互...
    DHFE閱讀 833評論 0 3