addEventListener的第三個(gè)參數(shù)到底該怎么設(shè)置

第三個(gè)參數(shù)可以設(shè)置啥?

官方文檔看,addEventListener 方法使用如下:

target.addEventListener(type, listener[, options]); 
target.addEventListener(type, listener[, useCapture]);

還有一個(gè)兼容性不好的使用方法就不提了,也不太常用。

主要關(guān)注下第三個(gè)參數(shù),可以設(shè)置為bool類型(useCapture)或者object類型(options)。

  • options包括三個(gè)布爾值選項(xiàng):

    • capture: 默認(rèn)值為false(即 使用事件冒泡). 是否使用事件捕獲;
    • once: 默認(rèn)值為false. 是否只調(diào)用一次,if true,會(huì)在調(diào)用后自動(dòng)銷毀listener
    • passive: if true, 意味著listener永遠(yuǎn)不遠(yuǎn)調(diào)用preventDefault方法,如果又確實(shí)調(diào)用了的話,瀏覽器只會(huì)console一個(gè)warning,而不會(huì)真的去執(zhí)行preventDefault方法。根據(jù)規(guī)范,默認(rèn)值為false. 但是chrome, Firefox等瀏覽器為了保證滾動(dòng)時(shí)的性能,在document-level nodes(Window, Document, Document.body)上針對(duì)touchstart和touchmove事件將passive默認(rèn)值改為了true, 保證了在頁面滾動(dòng)時(shí)不會(huì)因?yàn)樽远x事件中調(diào)用了preventDefault而阻塞頁面渲染。
  • useCapture: 默認(rèn)值為false(即 使用事件冒泡)。

如何與removeEventListener 方法合作?

removeEventListener的參數(shù)與addEventListener類似:

target.removeEventListener(type, listener[, options]);
target.removeEventListener(type, listener[, useCapture]);

在移除之前添加的監(jiān)聽事件時(shí),很顯然需要傳入同樣的type和listener,那第三個(gè)參數(shù)options和useCapture呢?

只會(huì)檢查addEventListener的useCapture或options中的capture值。

例如:

element.addEventListener("mousedown", handleMouseDown, { passive: true });
element.removeEventListener("mousedown", handleMouseDown, { passive: true });     // Succeeds
element.removeEventListener("mousedown", handleMouseDown, { capture: false });    // Succeeds
element.removeEventListener("mousedown", handleMouseDown, { capture: true });     // Fails
element.removeEventListener("mousedown", handleMouseDown, { passive: false });    // Succeeds
element.removeEventListener("mousedown", handleMouseDown, false);                 // Succeeds
element.removeEventListener("mousedown", handleMouseDown, true);                  // Fails

是否一定要與removeEventlister成對(duì)兒出現(xiàn)?

當(dāng)DOM元素與事件擁有不同的生命周期時(shí),倘若不remove掉eventListener就有可能導(dǎo)致內(nèi)存泄漏(保留或增加了不必要的內(nèi)存占用)。比如在單頁應(yīng)用中,切換了頁面后,原組件已經(jīng)卸載,但其注冊(cè)在document上的事件卻保留了下來,白白占用了內(nèi)存空間。所以removeEventlister與addEventListener成對(duì)兒出現(xiàn)是best practice,可以避免可能出現(xiàn)的內(nèi)存泄漏問題。

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

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