1. 程式人生 > >Javascript高級編程學習筆記(57)—— 事件(1)事件流

Javascript高級編程學習筆記(57)—— 事件(1)事件流

向上 發生 什麽 div window document 描述 實現 窗口

事件

JS與HTML的交互是通過事件實現的

而事件指的就是:文檔或瀏覽器窗口特定的交互瞬間

可以通過偵聽器來預定事件,以便在事件發生時執行相應的代碼

這種模式也是設計模式中的觀察者模式

事件流

有了事件,也就有了事件流的概念

事件流故名思意:也就是事件的流向,所以事件流描述的是從頁面中接收事件的順序

雖然事件流描述的都是事件的流向,但是事件流在當時的兩個最大的瀏覽器廠商的提出中卻是兩個差不多完全相反的事件流概念

一是IE的冒泡事件流,二是Netscape的捕獲事件流

事件冒泡

即事件開始時由最具體的元素(也就是文檔中層次最深的元素)接收,然後逐級向上傳播到較為不具體的節點

以下方的HTML代碼舉例:

<!DOCTYPE html>
<html>
    <head>
        <title> lhy <title>
    <head>
    <body>
        <div id="myDiv"> Click me</div>
    <body>
<html>

如果我們點擊div元素

那麽這個點擊事件將會按照以下順序傳播

  1. <div>
  2. <body>
  3. <html>
  4. document

基本上所有的現代瀏覽器都支持冒泡事件流,有區別的地方僅僅在於冒泡到什麽地方為止

一般來說主流的高級瀏覽器冒泡都會傳遞到window才停止

事件捕獲

Netscape 團隊提出的另一種事件流叫事件捕獲

事件捕獲的概念與事件冒泡的概念相反:即事件先發生在不太具體的元素,然後向下傳遞到較為具體的元素

仍以剛才上方的HTML為例,那麽事件的觸發順序為:

  1. document
  2. <html>
  3. <body>
  4. <div>

雖然DOM2級事件規範要求事件應該從document開始傳播

但是實現了事件捕獲的瀏覽器基本上都是從window開始傳播的

需要註意的是,事件捕獲老版本瀏覽器不支持,但是事件冒泡沒有這一限制

DOM事件流

“DOM2級事件”規定事件流包括三個階段:

  1. 事件捕獲階段
  2. 處於目標階段
  3. 事件冒泡階段

同樣以上方的HTML代碼為例,DOM事件流的觸發順序如下:

  1. document
  2. <html>
  3. <body>
  4. <div>
  5. <body>
  6. <html>
  7. document

上述過程中 1~3 是事件捕獲階段,4是處於目標階段,5~7是事件冒泡階段

在DOM2級規範中,處於目標階段應屬於冒泡階段

但實際上在瀏覽器的實現中在捕獲階段和冒泡階段都會觸發目標元素的事件

所以我們有兩個機會在目標對象上操作事件

Javascript高級編程學習筆記(57)—— 事件(1)事件流