首先聲明,當(dāng)目標(biāo)對(duì)象是window對(duì)象或其他一些單獨(dú)對(duì)象,eg:XMLHttpRequest時(shí),就沒事件傳播啥事了,瀏覽器直接通過調(diào)用對(duì)象上的程序響應(yīng)事件。而我們所說的事件傳播是發(fā)生在事件目標(biāo)是文檔或文檔元素的時(shí)候。
事件傳播也就是我們平時(shí)說的事件流,分三個(gè)階段:第一階段發(fā)生在目標(biāo)處理程序調(diào)用之前,就是我們通常說的"捕獲”階段;第二階段是目標(biāo)對(duì)象本身的處理程序調(diào)用;第三階段就是冒泡階段。我們平時(shí)關(guān)注的就是第二和第三階段——事件捕獲和事件冒泡。
事件冒泡
調(diào)用在目標(biāo)元素上注冊(cè)的事件處理函數(shù)后,大部分事件會(huì)“冒泡”到DOM樹根,我們可以想象,就想一條魚在水底喘了口氣,然后氣泡一直往上一直往上,直到到了水面。。給一個(gè)文檔元素加各事件,然后這個(gè)事件會(huì)傳給它的父級(jí)以及父級(jí)的父級(jí)。。傳給body、傳給document、傳給window。這樣自有它的妙用,比如我們遇到一個(gè)有大量單獨(dú)文檔元素的東西,每個(gè)單獨(dú)文檔元素都要加事件名稱一樣的事件,不太可能一個(gè)個(gè)加吧,多浪費(fèi)時(shí)間,這時(shí)候在它們共同的祖先元素上注冊(cè)一個(gè)處理程序來處理所有的事件。比如可以在form元素上注冊(cè)change事件,就不用再每個(gè)元素上注冊(cè)了。
代碼如下: