隨着接觸jQery與JS越多,發現自己有時會對兩者的用法有混淆。這不,今天做一個事件處理的時候就發現問題了。
在之前的腦海里,只有preventDefault(阻止默認事件)、stopPropagation(阻止冒泡)這兩個事件的概念,但是具體到針對某一個要做兼容處理的時候還是不確定js和jQuery用到他們時的區別。於是,就開始查資料,結果發現網上也是層次不齊,不是很能解決我的疑惑,於是自己動手寫代碼去實踐。
首先簡單介紹下默認事件與冒泡事件概念:
-
- 默認事件:指瀏覽器的默認動作。比如a鏈接指定了跳轉地址,設置阻止默認事件后,它就不能進行跳轉了。
- 冒泡事件:指事件從原始元素開始一直冒泡到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兼容,不然也會報錯。
以上實驗,終於理清了我腦海里的不明確,希望大家以此為鑒,碰到不清楚的問題自己實踐一遍。加強記憶的同時也能收獲一些意外的知識。加油!
