關於jQuery與JS的阻止冒泡與阻止默認事件處理


  隨着接觸jQery與JS越多,發現自己有時會對兩者的用法有混淆。這不,今天做一個事件處理的時候就發現問題了。

  在之前的腦海里,只有preventDefault(阻止默認事件)、stopPropagation(阻止冒泡)這兩個事件的概念,但是具體到針對某一個要做兼容處理的時候還是不確定js和jQuery用到他們時的區別。於是,就開始查資料,結果發現網上也是層次不齊,不是很能解決我的疑惑,於是自己動手寫代碼去實踐。

  首先簡單介紹下默認事件與冒泡事件概念:

    1. 默認事件:指瀏覽器的默認動作。比如a鏈接指定了跳轉地址,設置阻止默認事件后,它就不能進行跳轉了。
    2. 冒泡事件:指事件從原始元素開始一直冒泡到DOM樹的最上層。比如子元素和父元素都注冊了點擊事件,如果沒有阻止冒泡事件,那么當點擊子元素時,父元素上的注冊事件也會發生。

     首先,用jQuery做了如下實驗:

<!DOCTYPE html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>默認事件與冒泡事件</title>
</head>
<body>
	<div id="box">
		<a href="http://www.baidu.com" id="testLink">百度</a>
	</div> 
	<script src="mod/jquery-1.7.1.min.js"></script>
	<script type="text/javascript"> 
		function stopDefault( e ) { 
		    e.preventDefault()
		} 
		function stopPropagation( e ) { 
		  e.stopPropagation()
		} 
		$('#testLink').on('click',function(e) { 
		   console.log('我的鏈接地址是:' + this.href + ', 但是我不會跳轉。'); 
		   stopDefault(e); 
		   stopPropagation(e); 
		})
		$('#box').on('click',function(e) { 
		   console.log('我是外面的盒子'); 
		})
	</script>
</body>
</html>

  以上沒有做任何兼容處理,在ie7及以上瀏覽器中均運行成功(即都成功的阻止了冒泡事件與默認事件)。且注意的一點是事件”e“也不需要做e = event || window.event處理。

  然后我又在基本語法不變的情況下用JS做實驗,代碼如下:

<!DOCTYPE html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>默認事件與冒泡事件</title>
</head>
<body>
	<div id="box">
		<a href="http://www.baidu.com" id="testLink">百度</a>
	</div> 
	<script type="text/javascript"> 
		var e,
			oBox = document.getElementById('box'),
			oLink = document.getElementById('testLink');
		function stopDefault( e ) { 
		    e.preventDefault()
		} 
		function stopPropagation( e ) { 
			e.stopPropagation()
		} 
		oLink.onclick = function(e) { 
		   console.log('我的鏈接地址是:' + this.href + ', 但是我不會跳轉。'); 
		   stopDefault(e); 
		   stopPropagation(e); 
		}
		oBox.onclick = function(e) { 
		   console.log('我是外面的盒子'); 
		}
	</script>
</body>
</html>

  發現總是報錯:,經過改良,加上兼容處理,代碼如下:

<!DOCTYPE html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>默認事件與冒泡事件</title>
</head>
<body>
	<div id="box">
		<a href="http://www.baidu.com" id="testLink">百度</a>
	</div> 
	<script type="text/javascript"> 
		var oBox = document.getElementById('box'),
			oLink = document.getElementById('testLink');
		function stopDefault( e ) { 
		    if (e && e.preventDefault) {
		    	e.preventDefault();
		    }else{
		    	e.returnValue = false;
		    }
		} 
		function stopPropagation( e ) { 
			if (e.stopPropagation) {
				e.stopPropagation()
			} else{
				e.cancelBubble = true;
			};
		} 
		oLink.onclick = function(event) { 
			var e = event || window.event
		    console.log('我的鏈接地址是:' + this.href + ', 但是我不會跳轉。'); 
		    stopDefault(e); 
		    stopPropagation(e); 
		}
		oBox.onclick = function() { 			
		    console.log('我是外面的盒子'); 
		}
	</script>
</body>
</html>

  結果ie7及以上也都成功了。特別注意要處理event兼容,不然也會報錯。

     以上實驗,終於理清了我腦海里的不明確,希望大家以此為鑒,碰到不清楚的問題自己實踐一遍。加強記憶的同時也能收獲一些意外的知識。加油!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM