補(bǔ)基礎(chǔ)==b 事件流

一、

  • 事件:文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互空間,如點(diǎn)擊事件,鼠標(biāo)移動(dòng)事件等。
  • 事件流:從頁(yè)面中接收事件的順序。
    事件流有事件冒泡流事件捕獲流兩種。
    IE的事件流是事件冒泡流,從最具體的元素接收,逐級(jí)向上傳播到較為不具體的元素
    事件捕獲流:從不具體的元素傳播到具體的元素。
    (將事件處理程序添加到事件流的冒泡階段,可以最大限度地兼容各種瀏覽器)

二、

  • 添加事件處理程序的三種方法:addEventListeneron+事件名attachEvent
  • addEventListener 是添加DOM2級(jí)事件處理程序的方法
    可以添加多個(gè)事件處理程序,按照添加的順序執(zhí)行
element.addEventListener(event,callback,true/false);
inner.addEventListener('click',function(e){
//code here;
},true);
(刪除事件處理程序:
element.removeEventListener()
)
  • on+事件名 是添加DOM0級(jí)事件處理程序的方法
    不可以用來(lái)添加多個(gè)事件處理程序
element.onclick = function(e) {
//code here;
}
(刪除事件處理程序:
element.onclick=null
)
  • attachEventIE6-IE10 添加事件處理程序的方法
    可以添加多個(gè)事件處理程序,按照添加的順序反向執(zhí)行
    attachEvent()方法注冊(cè)的事件處理程序,會(huì)在全局作用域中運(yùn)行,因此函數(shù)中的this等于window
element.attachEvent('onclick',function(e){
//code here;
}
(刪除事件處理程序:
detachEvent()
)

三、

  • DOM2級(jí)事件規(guī)定的事件流包括三個(gè)階段:事件捕獲階段處于目標(biāo)階段事件冒泡階段
  • addEventListener 注冊(cè)為 true 的事件處理程序在捕獲階段發(fā)生,
    addEventListener 注冊(cè)為 false 或者 on+事件名 的事件處理程序在 冒泡 階段發(fā)生,
    attachEvent 注冊(cè)的事件處理程序在冒泡階段發(fā)生。
  • DOM事件流中,實(shí)際的目標(biāo)在捕獲階段不會(huì)接收到事件,處于目標(biāo)階段,事件在目標(biāo)上發(fā)生并當(dāng)做冒泡階段的一部分,作為冒泡階段的起點(diǎn),然后一直向上傳播。
  • IE9、Safari、Chrome、firefox和Opera9.5及更高版本都會(huì)在捕獲階段觸發(fā)事件對(duì)象上的事件,結(jié)果就有兩個(gè)機(jī)會(huì)在目標(biāo)對(duì)象上操作事件,而且當(dāng)處于目標(biāo)階段的時(shí)候,目標(biāo)的捕獲事件處理程序和目標(biāo)的冒泡事件處理程序?qū)δ繕?biāo)而言都是事件處理程序,事件處理程序按照代碼書寫順序(即綁定順序)發(fā)生,而不是先發(fā)生目標(biāo)的捕獲事件處理程序再發(fā)生冒泡處理程序(注意是對(duì)于目標(biāo)而言)。

四、

  • e: 在IE中通過(guò)DOM0級(jí)添加的事件處理程序中,e是作為全局對(duì)象,可通過(guò)window.event獲得;在IE中通過(guò)attachEvent 方法添加的事件處理程序,event需要作為參數(shù)傳入。
  • e.target :指向最初觸發(fā)事件的 DOM 元素。
    e.currentTarget: 指向正在進(jìn)行的事件處理程序所綁定的元素。
    e.srcElement: IE6-8沒(méi)有e.target屬性而是e.srcElement;
  • this 在事件處理函數(shù)內(nèi)部代表事件的目標(biāo)元素,等同于e.currentTarget
  • e.type 被觸發(fā)的事件類型

五、

  • 阻止事件冒泡
    stopPropagation()取消事件的進(jìn)一步捕獲冒泡
    IE中使用cancelBubble = true;
  • preventDefault()阻止特定事件的默認(rèn)行為cancelable屬性設(shè)置為true才可以使用;
    IE中使用returnValue = false

六、

  • 影響頁(yè)面性能:
    事件處理程序的數(shù)量關(guān)系到頁(yè)面的整體運(yùn)行性能
    原因
    1.每個(gè)事件處理程序都是函數(shù),函數(shù)都是對(duì)象,會(huì)占用內(nèi)存,內(nèi)存中對(duì)象越多,性能就越差。
    2.必須事先指定所有事件處理程序而導(dǎo)致DOM的訪問(wèn)次數(shù),會(huì)延遲整個(gè)頁(yè)面的交互就緒時(shí)間。
    解決方案
    1.事件委托(限制連接建立的數(shù)量)
    在DOM樹上盡量最高的層次添加一個(gè)事件處理程序,根據(jù)觸發(fā)事件的目標(biāo)的屬性執(zhí)行相應(yīng)的代碼。
    2.內(nèi)存中留有的過(guò)時(shí)不用的空事件處理程序占用頁(yè)面內(nèi)存也會(huì)影響性能。
    解決:移除事件處理程序,確保內(nèi)存可以被再次利用:
    空事件處理程序的產(chǎn)生
    1.移除帶有事件處理程序的元素時(shí)(如removeChild和使用innerHTML替換),元素和事件處理程序都保留在內(nèi)存中,沒(méi)有被當(dāng)做垃圾回收,因此需要手工移除事件處理程序。
    2:卸載頁(yè)面的時(shí)候。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • JavaScript 程序采用了異步事件驅(qū)動(dòng)編程模型。在這種程序設(shè)計(jì)風(fēng)格下,當(dāng)文檔、瀏覽器、元素或與之相關(guān)的對(duì)象發(fā)...
    劼哥stone閱讀 1,280評(píng)論 3 11
  • 事件 JavaScript和HTML的交互是通過(guò)事件實(shí)現(xiàn)的。JavaScript采用異步事件驅(qū)動(dòng)編程模型,當(dāng)文檔、...
    徐國(guó)軍_plus閱讀 605評(píng)論 0 2
  • 一、問(wèn)答 1. dom對(duì)象的innerText和innerHTML有什么區(qū)別? innerHTML: 也就是從對(duì)象...
    饑人谷_羅偉恩閱讀 644評(píng)論 0 2
  • 本章內(nèi)容 理解事件流 使用事件處理程序 不同的事件類型 JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)...
    悶油瓶小張閱讀 293評(píng)論 0 0
  • 以下文章為轉(zhuǎn)載,對(duì)理解JavaScript中的事件處理機(jī)制很有幫助,淺顯易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy閱讀 3,075評(píng)論 1 10