專題復習五锈拨、DOM API及事件監(jiān)聽

放自己用DOM寫的作品鏈接
寫于2017.08.07
一敛腌、關于DOM

  • 什么是DOM
    DOM是JavaScript操作網頁的接口祭饭,全稱為“文檔對象模型”(Document Object Model)瓮床。它的作用是將網頁轉為一個JavaScript對象盹舞,從而可以用腳本進行各種操作(比如增刪內容)。
    瀏覽器會根據DOM模型隘庄,將結構化文檔(比如HTML和XML)解析成一系列的節(jié)點踢步,再由這些節(jié)點組成一個樹狀結構(DOM Tree)。所有的節(jié)點和最終的樹狀結構丑掺,都有規(guī)范的對外接口获印。所以,DOM可以理解成網頁的編程接口街州。
    嚴格地說兼丰,DOM不屬于JavaScript玻孟,但是操作DOM是JavaScript最常見的任務,而JavaScript也是最常用于DOM操作的語言
  • DOM的節(jié)點
    DOM的最小組成單位叫做節(jié)點(node)地粪。文檔的樹形結構(DOM樹)取募,就是由各種不同類型的節(jié)點組成。每個節(jié)點可以看作是文檔樹的一片葉子蟆技。
    節(jié)點的類型有七種玩敏。
    *Document:整個文檔樹的頂層節(jié)點
    *DocumentType:doctype標簽(比如<!DOCTYPE html>)
    *Element:網頁的各種HTML標簽(比如<body>、<a>等)
    *Attribute:網頁元素的屬性(比如class="right")
    *Text:標簽之間或標簽包含的文本
    *Comment:注釋
    *DocumentFragment:文檔的片段
    DOM樹如下圖:

image.png

具體DOM學習建議參考鏈接:http://javascript.ruanyifeng.com/#dom
二质礼、事件模型

  • 什么是事件
    事件是一種異步編程的實現方式旺聚,本質上是程序各個組成部分之間的通信。一般來講眶蕉,有一下特點:
    1砰粹、某某訂閱了/關注/監(jiān)聽了×××
    2、×××發(fā)生變化
    3造挽、某某得到通知
    體現在DOM機制里就是:用戶的操作發(fā)生變化碱璃,代碼得到通知

  • 事件EventTarget接口
    DOM的事件操作(監(jiān)聽和觸發(fā)),都定義在EventTarget接口饭入。Element節(jié)點嵌器、document節(jié)點和window對象,都部署了這個接口谐丢。此外爽航,XMLHttpRequest、AudioNode乾忱、AudioContext等瀏覽器內置對象讥珍,也部署了這個接口。
    該接口就是3個方法:
    1窄瘟、addEventListener:綁定事件的監(jiān)聽函數
    例:
    target.addEventListener(type, listener[, useCapture]);
    type:事件名稱衷佃,大小寫敏感。
    listener:監(jiān)聽函數寞肖。事件發(fā)生時纲酗,會調用該監(jiān)聽函數。
    useCapture:布爾值新蟆,默認為false(監(jiān)聽函數只在冒泡階段被觸發(fā))觅赊。true是在捕獲階段觸發(fā)
    addEventListener方法可以為當前對象的同一個事件,添加多個監(jiān)聽函數琼稻。這些函數按照添加順序觸發(fā)吮螺,即先添加先觸發(fā)。如果為同一個事件多次添加同一個監(jiān)聽函數,該函數只會執(zhí)行一次鸠补,多余的添加將自動被去除(不必使用removeEventListener方法手動去除)萝风。
    2、removeEventListener:移除事件的監(jiān)聽函數
    例:
    div.addEventListener('click', listener, false);
    removeEventListener方法移除的監(jiān)聽函數紫岩,必須與對應的addEventListener方法的參數完全一致规惰,而且必須在同一個元素節(jié)點,否則無效泉蝌。
    3歇万、dispatchEvent:觸發(fā)事件
    dispatchEvent方法在當前節(jié)點上觸發(fā)指定事件,從而觸發(fā)監(jiān)聽函數的執(zhí)行勋陪。該方法返回一個布爾值贪磺,只要有一個監(jiān)聽函數調用了Event.preventDefault(),則返回值為false诅愚,否則為true
    例:
    para.addEventListener('click', hello, false);
    var event = new Event('click');
    para.dispatchEvent(event);
    上面代碼在當前節(jié)點觸發(fā)了click事件

  • 3種綁定監(jiān)聽函數的方法
    1寒锚、HTML標簽的on-屬性
    例:元素標簽的屬性中,直接定義某些事件的監(jiān)聽代碼
    <body onload="doSomething()">
    <div onclick="console.log('觸發(fā)事件')">
    上面代碼為body節(jié)點的load事件违孝、div節(jié)點的click事件刹前,指定了監(jiān)聽函數。
    使用這個方法指定的監(jiān)聽函數雌桑,只會在冒泡階段觸發(fā)

    另外腮郊,Element元素節(jié)點的setAttribute方法,其實設置的也是這種效果筹燕。
    el.setAttribute('onclick', 'doSomething()');
    2、Element節(jié)點的事件屬性
    Element節(jié)點對象有事件屬性衅鹿,同樣可以指定監(jiān)聽函數撒踪。
    例:
    window.onload = doSomething;
    div.onclick = function(event){
    console.log('觸發(fā)事件');
    };
    使用這個方法指定的監(jiān)聽函數,只會在冒泡階段觸發(fā)大渤。
    3制妄、addEventListener方法
    window.addEventListener('load', doSomething, false);(詳解如上)
    總結:第一種“HTML標簽的on-屬性”,違反了HTML與JavaScript代碼相分離的原則泵三;第二種“Element節(jié)點的事件屬性”的缺點是耕捞,同一個事件只能定義一個監(jiān)聽函數,也就是說烫幕,如果定義兩次onclick屬性俺抽,后一次定義會覆蓋前一次。

  • 事件的捕獲與冒泡階段
    1较曼、操作系統最先知道用戶點擊了鼠標磷斧,瀏覽器次之
    2、child被點擊了,意味著parent也被點擊了
    3弛饭、那么如果同時監(jiān)聽了child和parent冕末,誰先通知我
    例子:如果對parent和child同時設置了監(jiān)聽,那么當我點擊child侣颂,誰先通知我
    捕獲階段:parent先通知档桃,child后通知(一般不用)
    冒泡階段:child先通知,parent后通知

  • e.target與e.currentTarget
    e.target代表你點擊的那個元素憔晒,而e.currentTarget代表你監(jiān)聽的那個元素藻肄,如果你處于捕獲或者冒泡階段,二者是不一樣的

  • 阻止默認事件
    document.querySelector("a").addEventListener('click',function(e){
    e.preventDefault()
    })
    這樣的話a就不會跳轉了丛晌。如果在父元素阻止默認事件仅炊,那a也不跳轉了,所以一般不建議這樣做

  • 停止冒泡
    e.stopPropagation( )(在子元素加入澎蛛,則不通知爸爸了抚垄,不會再向上傳播)

  • 事件委托
    由于事件會在冒泡階段向上傳播到父節(jié)點,因此可以把子節(jié)點的監(jiān)聽函數定義在父節(jié)點上谋逻,由父節(jié)點的監(jiān)聽函數統一處理多個子元素的事件呆馁。這種方法叫做事件委托
    例:
    HTML代碼:
    <ul>
    <li>選項1</li>
    <li>選項2</li>
    <li>選項3</li>
    <li>選項4</li>
    </ul>
    JS代碼:
    var ul =document.querySelector('ul')
    function fn(e){
    if(e.target.tagName ==="LI"){
    console.log("ok")(如果li里面裹一層span,點擊span就不能執(zhí)行監(jiān)聽函數)
    }
    }
    ul.addEventListener('click',fn)
    優(yōu)化執(zhí)行函數:
    function fn(e){
    var el = e.target
    while(el.tagName !=="LI"){
    el =el.parentNode(向上遍歷父元素)
    }
    if(el){
    console.log('yes')
    }
    }
    但是實際上我只需要遍歷到我監(jiān)聽的元素就可以了毁兆,如果直到遍歷到監(jiān)聽的元素還沒有的話浙滤,就認為沒有了
    例:
    HTML代碼:
    <div>
    <p>我是<span>p</span></p>
    <hi>我是<span>h1</span></hi>
    </div>
    JS代碼:
    var div =document.querySelector('div')
    function fn(e){
    var el = e.target
    while(el.tagName !=="H1"){
    el =el.parentNode(向上遍歷父元素)
    if(el===div){
    el=null
    break;
    }
    }
    if(el){
    console.log('yes')
    }
    }
    div.addEventListener('click',fn(e))

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市气堕,隨后出現的幾起案子纺腊,更是在濱河造成了極大的恐慌,老刑警劉巖茎芭,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揖膜,死亡現場離奇詭異,居然都是意外死亡梅桩,警方通過查閱死者的電腦和手機壹粟,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宿百,“玉大人趁仙,你說我怎么就攤上這事】岩常” “怎么了雀费?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長痊焊。 經常有香客問我坐儿,道長律胀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任貌矿,我火速辦了婚禮炭菌,結果婚禮上,老公的妹妹穿的比我還像新娘逛漫。我一直安慰自己谅畅,他們只是感情好滑蚯,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布应民。 她就那樣靜靜地躺著但校,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枷踏。 梳的紋絲不亂的頭發(fā)上菩暗,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音旭蠕,去河邊找鬼停团。 笑死,一個胖子當著我的面吹牛掏熬,可吹牛的內容都是我干的佑稠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼旗芬,長吁一口氣:“原來是場噩夢啊……” “哼舌胶!你這毒婦竟也來了?” 一聲冷哼從身側響起疮丛,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤幔嫂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后誊薄,有當地人在樹林里發(fā)現了一具尸體婉烟,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年暇屋,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洞辣。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡咐刨,死狀恐怖,靈堂內的尸體忽然破棺而出扬霜,到底是詐尸還是另有隱情定鸟,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布著瓶,位于F島的核電站联予,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜沸久,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一季眷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卷胯,春花似錦子刮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至担钮,卻和暖如春橱赠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背箫津。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工狭姨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲤嫡。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓送挑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親暖眼。 傳聞我的和親對象是個殘疾皇子惕耕,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容

  • 事件是一種異步編程的實現方式,本質上是程序各個組成部分之間的通信诫肠。DOM支持大量的事件司澎,本節(jié)介紹DOM的事件編程。...
    周花花啊閱讀 592評論 0 3
  • 題目1: DOM0 事件和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別栋豫? Dom0級Dom0級事件處理程序是將一個函數...
    QQQQQCY閱讀 316評論 0 0
  • 問答 一丧鸯、dom對象的innerText和innerHTML有什么區(qū)別蛤铜? innerTextinnerText是一...
    婷樓沐熙閱讀 398評論 0 0
  • 導讀:本文是teren對DOM事件知識點所做的進一步整理,整理資料主要參考DOM事件簡介和饑人谷課件丛肢,如果對DOM...
    犯迷糊的小羊閱讀 4,014評論 1 5
  • 中廳花正怒围肥,香滿院,游人不歸蝶常舞蜂怎,誰解其中味穆刻?黃花斗霜綴清秋,敢與時令爭杠步!花如此氢伟,我輩豈能屈榜轿?高朋滿座,美酒佳肴...
    你就是我心中的棉花糖閱讀 183評論 1 0