事件(Event)

紅寶書閱讀筆記

事件

事件實現(xiàn)了JS與HTML之間的交互。

事件代表文檔或瀏覽器窗口中某個有意義的時刻。可以使用僅在事件發(fā)生時執(zhí)行的監(jiān)聽器(也叫處理程序)訂閱事件。在傳統(tǒng)軟件工程領(lǐng)域,這個模型叫“觀察者模式”,其能夠做到頁面行為(在 JavaScript 中定義)與頁面展示(在 HTML 和 CSS 中定義)的分離。

事件流

事件流描述了頁面接收事件的順序。

事件冒泡(IE事件)

從最具體的元素開始出發(fā),向上傳播至沒有那么具體的元素,即從內(nèi)向外,一直到document對象。

事件捕獲(網(wǎng)景事件)

從最不具體的元素傳播到最具體的元素,即從外向內(nèi),從document開始。

DOM事件流

DOM2 Events 規(guī)范規(guī)定事件流分為 3 個階段:事件捕獲、到達目標和事件冒泡。

事件捕獲最先發(fā)生,
為提前攔截事件提供了可能。然后,實際的目標元素接收到事件。最后一個階段是冒泡,最遲要在這個
階段響應事件。

DOM事件流認為事件處理是冒泡階段的一部分,而現(xiàn)代瀏覽器也都會在捕獲階段觸發(fā)目標事件,所以可以認為在事件目標上有兩個機會來處理事件。

event對象

在外部定義的事件監(jiān)聽器會創(chuàng)建一個函數(shù)來封裝屬性的值,這個函數(shù)的this指向當前事件的目標元素,這個函數(shù)有一個特殊的局部變量event,其中保存的是一個event對象。event對象包含了DOM觸發(fā)事件時的所有相關(guān)信息,包括指定元素、事件類型等。

event對象只在事件處理程序執(zhí)行期間存在,一旦執(zhí)行完畢,就會被銷毀。

事件監(jiān)聽器

addEventListener()removeEventListener()接收三個參數(shù):事件名、事件處理函數(shù)和一個表明調(diào)用階段的布爾值,true表示在捕獲階段調(diào)用事件處理程序,false表示在冒泡階段調(diào)用事件處理程序。

比起傳統(tǒng)的將事件監(jiān)聽器直接添加在指定元素上的方法,DOM2 Events規(guī)定的這兩個方法可以為同一個事件添加多個事件處理程序。

addEventListener()添加的事件處理程序只能用removeEventListener()在傳入相同的參數(shù)的條件下進行移除,所以其添加的匿名函數(shù)無法被移除。

大多數(shù)情況下,因為冒泡事件流比捕獲事件流具有更強的瀏覽器兼容性,通常會將事件處理程序注冊在事件的冒泡階段。除非需要在事件到達指定目標前攔截事件,其他情況下不會將事件處理程序注冊在事件的捕獲階段。

性能優(yōu)化

事件委托

在JS中,頁面的事件處理程序越多,頁面性能就越差。事件委托利用事件冒泡,可以只使用一個事件處理程序來處理頁面中所有的某一類型的事件。

比如,在document元素上添加click事件監(jiān)聽器,然后通過switch方法為不同的event執(zhí)行不同的操作,這樣做會比給每一個event的都注冊click事件監(jiān)聽器的性能更好。

清理事件處理程序

無用的事件處理程序會占用Web應用的內(nèi)存,在刪除指定元素/頁面卸載前應該先清理該元素/該頁面的事件處理程序,這樣可以確保內(nèi)存得到回收,指定元素/頁面也可以被安全清除。
btn.onclick = null; // 刪除事件處理程序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容