(1)冒泡型事件:事件按照從最特定的事件目標到最不特定的事件目標(document物件)的順序觸發。
ie 5.5: div -> body -> document
ie 6.0: div -> body -> html -> document
mozilla 1.0: div -> body -> html -> document -> window
(2)捕獲型事件(event capturing):事件從最不精確的物件(document 物件)開始觸發,然後到最精確(也可以在視窗級別捕獲事件,不過必須由開發人員特別指定)。
(3)dom事件流:同時支援兩種事件模型:捕獲型事件和冒泡型事件,但是,捕獲型事件先發生。兩種事件流會觸及dom中的所有物件,從document物件開始,也在document物件結束。
dom事件模型最獨特的性質是,文字節點也觸發事件(在ie中不會)。
支援w3c標準的瀏覽器在新增事件時用addeventlistener(event,fn,usecapture)方法,基中第3個引數usecapture是乙個boolean值,用來設定事件是在事件捕獲時執行,還是事件冒泡時執行。而不相容w3c的瀏覽器(ie)用attachevent()方法,此方法沒有相關設定,不過ie的事件模型預設是在事件冒泡時執行的,也就是在usecapture等於false的時候執行,所以把在處理事件時把usecapture設定為false是比較安全,也實現相容瀏覽器的效果。
事件捕獲階段:事件從最上一級標籤開始往下查詢,直到捕獲到事件目標(target)。
事件冒泡階段:事件從事件目標(target)開始,往上冒泡直到頁面的最上一級標籤。
假設乙個元素div,它有乙個下級元素p。
元素這兩個元素都繫結了click事件,如果使用者點選了p,它在div和p上都觸發了click事件,那這兩個事件處理程式哪個先執行呢?事件順序是什麼?
兩種模型
以前,netscape和microsoft是不同的實現方式。
netscape中,div先觸發,這就叫做事件捕獲。
microsoft中,p先觸發,這就叫做事件冒泡。
兩種事件處理順序剛好相反。ie只支援事件冒泡,mozilla, opera 7 和 konqueror兩種都支援,舊版本的opera's 和 icab兩種都不支援 。
事件捕獲
當你使用事件捕獲時,父級元素先觸發,子級元素後觸發,即div先觸發,p後觸發。
事件冒泡
當你使用事件冒泡時,子級元素先觸發,父級元素後觸發,即p先觸發,div後觸發。
w3c模型
w3c模型是將兩者進行中和,在w3c模型中,任何事件發生時,先從頂層開始進行事件捕獲,直到事件觸發到達了事件源元素。然後,再從事件源往上進行事件冒泡,直到到達document。
程式設計師可以自己選擇繫結事件時採用事件捕獲還是事件冒泡,方法就是繫結事件時通過addeventlistener函式,它有三個引數,第三個引數若是true,則表示採用事件捕獲,若是false,則表示採用事件冒泡。
ele.addeventlistener('click',dosomething2,true)
true=捕獲
false=冒泡
傳統繫結事件方式
在乙個支援w3c dom的瀏覽器中,像這樣一般的繫結事件方式,是採用的事件冒泡方式。
ele.onclick = dosomething2
ie瀏覽器
如上面所說,ie只支援事件冒泡,不支援事件捕獲,它也不支援addeventlistener函式,不會用第三個引數來表示是冒泡還是捕獲,它提供了另乙個函式attachevent。
ele.attachevent("onclick", dosomething2);
附:事件冒泡(的過程):事件從發生的目標(event.srcelement||event.target)開始,沿著文件逐層向上冒泡,到document為止。
事件的傳播是可以阻止的:
• 在w3c中,使用stoppropagation()方法
• 在ie下設定cancelbubble = true;
在捕獲的過程中stoppropagation();後,後面的冒泡過程也不會發生了~
3.阻止事件的預設行為,例如click 後的跳轉~
• 在w3c中,使用preventdefault()方法;
• 在ie下設定window.event.returnvalue = false;
4.哇,終於寫完了,一邊測試一邊寫的額,不是所有的事件都能冒泡,例如:blur、focus、load、unload,(這個是從別人的文章裡摘過來的,我沒測試)。
阻止事件冒泡的通用函式
function stopbubble(e)else
}
Js冒泡事件和捕獲事件
js中冒泡事件和捕獲事件 冒泡事件 冒泡事件是從裡向外,即是從被繫結元素開始一直向外到達頁面的所有祖先元素都會被觸發,這 一過程被稱為事件冒泡。這個事件從原始元素開始一直冒泡到dom樹的最上層 捕獲事件 捕獲事件是從頁面的最上層到被繫結元素都會觸發。ie只支援事件冒泡,不支援事件捕獲 冒泡事件和捕獲...
JS事件冒泡 事件捕獲和事件委託
如上圖所示 事件冒泡 結構上從內到外 如上圖所示 事件捕獲 結構上從外到內 使用addeventlistener 方法指定事件是否在捕獲或冒泡階段執行 element.addeventlistener event,function,usecapture usecapture 可選。布林值,指定事件是...
Js事件捕獲和冒泡
昨天有個面試官問我的問題,他直接問我兩個div巢狀,都有click事件,單擊的時候先彈出子div還是父div。完全不知所以然。過後經過查詢資料後,很是慚愧。原來他問的就是關於js捕獲和冒泡的。我查詢了一些資料 事件捕獲 父 子 當你使用事件捕獲時,父級元素先觸發,子級元素後觸發,即div先觸發,p後...