事件傳播是什麼?
>>讓我們從事件傳播開始。這是事件冒泡和事件捕獲的毯子術語。考慮構建鏈接圖像列表的典型標記,例如:
單擊圖像不僅會為相應的IMG元素生成單擊事件,而且還為父母A,祖父li等,依此類推。窗口對象。
圖像是事件目標,是點擊發起的最內向元素。事件目標以及其祖先,從其父對像到窗口對象,在DOM樹中形成一個分支。例如,在圖像庫中,該分支將由節點組成:img,a,li,ul,身體,html,文檔,窗口。
請注意,窗口實際上不是DOM節點,而是實現EventTarget接口,因此,為簡單起見,我們正在處理它,就像它是文檔對象的父節點。請記住,可以在同一事件類型的節點上註冊幾個聽眾。當傳播到達一個這樣的節點時,聽眾按照註冊的順序被調用。這個分支很重要,因為它是事件傳播(或流動)的路徑。此傳播是為給定事件類型調用所有偵聽器的過程,該過程附在分支上的節點上。每個偵聽器都會使用一個事件對象來調用,該事件對象收集與事件相關的信息(稍後再詳細介紹)。
>
>還應注意,分支確定是靜態的,也就是說,它是在事件的初始派遣時建立的。事件處理期間發生的樹修改將被忽略。從窗口到事件目標和背部,
傳播是雙向的。這種傳播可以分為三個階段:
從窗口到事件目標父:這是
捕獲階段在此階段,只有
捕獲器如果省略了此參數,則其默認值為false,並且偵聽器不是捕獲者。 >因此,在此階段,只有在從窗口到事件目標母體的路徑上找到的捕獲者。
事件目標階段<span><span><span><ul</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> ... <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span><span><span><span></ul</span>></span> </span>在此階段,在事件目標上註冊的所有聽眾都將被調用,而不管其捕獲標誌的價值如何。
事件冒泡階段
在事件起泡階段,
只能調用非主體。也就是說,只有在AddeventListener()的第三個參數()的第三個參數中註冊為false的偵聽器:>目標
階段之後停止。>事件冒泡並不是每種事件發生的。在傳播過程中,聽眾有可能通過閱讀事件對象的布爾布爾屬性來知道事件是否會冒出氣泡。
在以下圖中的W3C uievents規範的下圖中說明了三個事件流階段。
。
>版權所有©2016 World Wide Web財團(麻省理工學院,Ercim,Keio,Beihang)。
>我已經提到了事件對象的.bubbles屬性。該對象提供的其他許多屬性可供聽眾使用,以訪問相對於傳播的信息。
>>請參閱codepen上的sitepoint(@sitepoint)的筆JMXDPZ。
>甚至可以單擊框外:在這種情況下,事件目標將是主體或HTML元素,具體取決於單擊屏幕位置。>停止繁殖
通過調用事件對象的停止propagation方法,可以在任何偵聽器中停止事件傳播。這意味著不會調用遵循當前目標的傳播路徑上的節點上註冊的所有聽眾。相反,當前目標上附加的所有其他剩下的聽眾仍將接收事件。>我們可以使用以前的演示的簡單叉子檢查此行為,只需在一個偵聽器中插入對stoppropagation()的調用即可。在這裡,我們將這位新的聽眾備份為捕獲者,訪問了在窗口上註冊的回調列表:
>>停止立即繁殖
>如其名稱所示,stopMediatiatiatiatiatiatiatiatiatiatiatepropagation將剎車直接扔進剎車,甚至阻止了當前聽眾的兄弟姐妹接收事件。我們可以看到最後一支筆的最小變化:
<span><span><span><ul</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> ... <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span><span><span><span></ul</span>></span> </span>
<span><span><span><ul</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> ... <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span><span><span><span></ul</span>></span> </span>
>現在,日誌表中什麼都沒輸出,C1和C2窗口捕獲者都沒有行,因為在執行新偵聽器之後,傳播停止。
>可以通過在偵聽器中調用事件對象的另一種方法,e.preventdefault來避免執行此類默認操作。
結論
參考
>常見問題(常見問題解答)有關javaScript中的事件冒泡的問題 當事件冒泡和事件捕獲之間的主要區別是什麼?元素已經為該事件註冊了一個句柄。主要區別在於事件相對於DOM樹的傳播方向。在發生冒泡的情況下,該活動首先觸發了最深的目標元素,然後彈出父母。另一方面,事件捕獲涉及事件從其父母開始。使用stoppropagation()方法冒泡。該方法防止了捕獲和冒泡階段中當前事件的進一步傳播。這是一個示例:
element.AddeventListener('click',function(event){>
> javascript中事件傳播的默認行為是什麼?這意味著默認情況下,事件將從目標元素開始,並起泡到文檔的根。但是,您可以將AddeventListener()方法與usecapture參數設置為true更改此行為,這將啟用事件捕獲。
>>我如何檢查事件是否在冒泡?
> stoppropagation()和stopimmediatiatepropagation()? )方法用於停止事件的傳播。不同之處在於,stoppropagation()阻止事件冒泡事件鏈,而stopimmediatiatepropagation()則阻止了同一事件的其他聽眾被稱為。
以上是事件在JavaScript中冒泡?事件傳播解釋了的詳細內容。更多資訊請關注PHP中文網其他相關文章!