淺談dom事件

第三篇博客,又來了一個深奧的問題DOM
DOM事件,可以說是DOM模型中一個重中之重的問題。
衆多的click,touch,mouseover…..等等都是dom事件的一部分,但是他們是怎麼執行的呢,執行的順序又是什麼。
這裏就要說第一個概念DOM事件級別,DOM0,DOM2,DOM3.(有的童鞋會問了,爲什麼沒有DOM1?1級DOM標準中並沒有定義事件相關的內容,所以沒有所謂的1級DOM事件模型,所有沒有所謂的DOM1事件)。下面來看三種代碼

DOM0 :  element.onclick=function(){}
DOM2 :  element.addEventListener('click',function(){},false)
DOM3 :  element.addEventListener('keyup',function(){},false)

DOM2和DOM3的主要區別是:DOM3在DOM2的基礎上加了很多新的事件, 而且DOM3的事件名字基本都用了“駝峯”寫法, 區別不是非常大。

Internet Explorer 8 及更早IE版本不支持 addEventListener() 方法,,Opera 7.0 及 Opera 更早版本也不支持。 但是,對於這些不支持該函數的瀏覽器,你可以使用 attachEvent() 方法來添加事件

addEventListener(,,false)中的false是指事件冒泡或者事件捕獲下面會講到。

然而dom級別只有這麼多內容,他是怎麼一步步獲取的呢,這裏就引入了一個概念dom事件模型,事件捕獲和事件冒泡,舉個栗子你們吃了就明白了:

比如說有一個button按鈕,你可以把它看成一條魚,事件捕獲就是撒下一個大網 ,然後網慢慢縮小來捕這條魚,所以他是從上到下從父元素到子元素依次尋找事件,而事件冒泡恰恰相反,就是這個魚吐了個泡泡,這個泡泡離水面越近就越大,就變成了事件冒泡。

從dom事件模型也大概可以看出另一個概念 dom事件流,但是能一五一十一字不落的描述dom事件流的人大概寥寥無幾吧,首先dom事件流的三個階段,事件捕獲→目標階段→事件冒泡,具體是怎麼發生的呢?
事件捕獲的開頭到底是什麼,有人說是body,還有人說是html,仔細考慮一下,這不僅僅只是依靠html文檔上,它主要是由瀏覽器獲取你的點擊,鍵盤等,所以他的開頭是window,然後下一步就是document也就是html,接下來就跟你們想的一樣從body->…..到目標然後事件冒泡再回到window。

那麼說道window又一個問題出現了,瀏覽器是如何獲取你的點擊事件呢?答案就是event,事件的狀態。
那麼你們對

 event.preventDefault()
 event.stopPropagation()
 event.stopImmediatePropagation()
 event.currenttarget()
 event.target()

瞭解多少呢?

event.preventDefault(),這個大概瞭解的可能多一下,阻止默認行文,比如說a標籤默認的href跳轉等等

event.stopPropagation(),這個用到的可能也是比較多,這就是阻止事件冒泡的寫法,如果你不想子元素的事件再冒泡到父元素,最好加上這句代碼。

下面難題來了 event.stopImmediatePropagation() 很多人 ???excuse me?what's this?沒見過啊,沒關係我告訴你。你假設一個button綁定了a事件,b事件,c事件。那這裏寫代碼片麼你點擊button之後a.b.c會依次執行,那麼你想讓a執行完之後不執行b,c怎麼辦呢?答案就是在a事件中加入event.stopImmediatePropagation() 這一句代碼

event.currenttarget()
event.target(),這兩個看起來很相似對吧,其實他們區別在一個概念,事件委託or事件註冊?什麼 你不知道?
好吧,如果說有一個2000行的ul列表,你想給每個li添加相同的事件,你如果用循環for…給每個li就太慢了吧,這時候你就需要事件委託,將子元素事件委託給父元素,所以event.currenttarget就是事件所綁定的元素,event.target就是事件所執行的元素。

好了其實到這裏,DOM事件就說的差不多了,如果本文有錯請指正
QQ1817169988
微信15562997968 (老哥們不要電話轟炸我還是個孩子)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章