關於冒泡的總結

看了網上的資料,終於能理解冒泡機制,現在寫下自己的一點心得,這裏邊也有從網上找的。

由於HTML中的對象都是層次結構,比如一個Table包含了多個TR,一個TR包含了多個TD,Bubble就是一個事件可以從子節點向所有父節點傳遞,比如鼠標點擊了一個TD,當前的event.srcElement就是這個TD,但是這種冒 泡機制使你可以從TR或者Table處截獲這個點擊事件,但是如果你event.cancelBubble,則就不能上傳事件。

冒泡的順序是由裏向外(div-->body-->html-->document-->window),不過一般把document當做根節點。阻止冒泡的函數可以這麼寫

function stopFunc(event){
	var evt = window.event||event;
	if(evt.stopPropagation){
		evt.stopPropagation();//火狐
	}else{
		evt.cancleBuble = true();//ie
	}
}
舉一個例子,如一個html結構如下:
<body>
   	<form action="test" name="searchFrm">
   		<input type="text" id="keyid" name="keyword" >
   		<input type="submit" value="搜索">
   		<div id="container"  οnmοusedοwn="stopFunc(event)" ></div>
   	
   	</form>
</body>
當想點擊<div>層以外的地方來隱藏這個<div>,那麼可以給根節點document綁定一個click事件,一點擊html就隱藏<div>。

document.documentElement.onclick = function() {
    
	document.getElementById('need_hide').style.display = 'none';

}
或者這樣寫也行

document.onclick = function(){ 
	document.getElementById("container").style.display = "none";
}
但是問題來了,現在就算點擊這個<div>也使其隱藏了,原因就在於<div>是document的子節點,當給根節點document添加onclick事件後,所有的子元素(div,body,html)都會添加這個事件,所以爲了避免這種結果,就需要在該元素被click時取消冒泡,添加stopFunc()方法。
若不取消冒泡,那麼在對<div>進行click時,就會進行冒泡傳遞,被document這個根節點接收click事件,根節點發生的情況就是隻要點擊根節點,包括它的子元素,這個<div>都會被隱藏。而這個<div>又屬於document,所以在點擊<div>本身時也會隱藏
相當於一個循環,根節點自動給它的子元素添加相同的事件,而子元素反過來又會發生冒泡來影響根節點,根節點又會對子元素本身產生影響,相互影響。

如果還想增加一個鏈接:<a href="#" id="btn_show">顯示層</a>,用它來控制該層顯示出來,那麼仍然需要在該鏈接被點擊時阻止冒泡事件的發生,加上以下代碼:

document.getElementById('btn_show').onclick = function(e) {
    
	document.getElementById('need_hide').style.display = 'block';

	stopPropagation(e);

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章