Js冒泡事件詳解及阻止示例
更新時(shí)間:2014年03月21日 16:10:01 作者:
如果某元素定義了事件A,如click事件,如果觸發(fā)了事件之后,沒(méi)有阻止冒泡事件,那么事件將向父級(jí)元素傳播
Js冒泡機(jī)制是指如果某元素定義了事件A,如click事件,如果觸發(fā)了事件之后,沒(méi)有阻止冒泡事件,那么事件將向父級(jí)元素傳播,觸發(fā)父類的click函數(shù)。
如下例所示:
<html>
<script type="text/javascript" src="jquery-1.7.1.js"></script>
<script>
function ialertdouble(e) {
alert('innerdouble');
stopBubble(e);
}
function ialertthree(e) {
alert('innerthree');
stopBubbleDouble(e);
}
function stopBubble(e) {
var evt = e||window.event;
evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡
}
function stopBubbleDouble(e) {
var evt = e||window.event;
evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡
evt.preventDefault();//阻止瀏覽器默認(rèn)行為,這樣鏈接就不會(huì)跳轉(zhuǎn)
}
$(function() {
//方法一
//$('#jquerytest').click(function(event) {
// alert('innerfour');
// event.stopPropagation();
// event.preventDefault();
//});
//方法二
$('#jquerytest').click(function() {
alert('innerfour');
return false;
});
});
</script>
<div onclick="alert('without');">without
<div onclick="alert('middle');">middle
<div onclick="alert('inner');">inner</div>
<div onclick="ialertdouble(event)">innerdouble</div>
<p><a onclick="ialertthree(event)">innerthree</a></p>
<p id='jquerytest'><a >innerfour</a></p>
</div>
</div>
</html>
當(dāng)你點(diǎn)擊inner的時(shí)候,會(huì)依次彈出‘inner',‘middle'和‘without'。這就是事件冒泡。
從直觀上來(lái)看,也是這樣的,因?yàn)樽罾飳拥膮^(qū)域是在父級(jí)節(jié)點(diǎn)中的,點(diǎn)擊了子級(jí)節(jié)點(diǎn)的區(qū)域,其實(shí)也是點(diǎn)擊了父級(jí)節(jié)點(diǎn)的區(qū)域,所以事件會(huì)傳播起來(lái)。
其實(shí),很多的時(shí)候,我們并不想事件冒泡,因?yàn)檫@樣會(huì)同時(shí)觸發(fā)幾個(gè)事件。
接下來(lái):我們點(diǎn)擊innerdouble。就會(huì)發(fā)現(xiàn)她并沒(méi)有冒泡,因?yàn)樗谡{(diào)用的方法ialertdouble()中調(diào)用了stopBubble()方法,方法通過(guò)判斷瀏覽器類型(Ie通過(guò)cancleBubble() 、firefox通過(guò)stopProgation())來(lái)阻止冒泡。
但如果是鏈接的話,我們會(huì)發(fā)現(xiàn)她也會(huì)阻止冒泡,但是會(huì)跳轉(zhuǎn),這就是瀏覽器的默認(rèn)行為。需要借助preventDefault()方法來(lái)阻止。具體可以查看ialertthree()。
目前主流的都是借助jquery來(lái)綁定click事件的,這樣的話,就簡(jiǎn)單多了。
我們可以在點(diǎn)擊事件時(shí)傳入?yún)?shù)event,然后直接
event.stopPropagation();
event.preventDefault(); //沒(méi)有鏈接不需要加這個(gè)。
這樣就可以了。
框架就是好,其實(shí)還有更簡(jiǎn)單的,在事件處理程序中返回false,這是對(duì)在事件對(duì)象上同時(shí)調(diào)用stopPropagation()和preventDefault()的一種簡(jiǎn)寫(xiě)方式。
【詳細(xì)代碼見(jiàn)上面,記得載入jquery.js?!?
其實(shí)也還可以在每個(gè)click事件中加入判斷:
$('#id').click(function(event){
if(event.target==this){
//do something
}
})
解析:事件處理程序中的變量event保存著事件對(duì)象。而event.target屬性保存著發(fā)生事件的目標(biāo)元素。這個(gè)屬性是DOM API中規(guī)定的,但是沒(méi)有被所有瀏覽器實(shí)現(xiàn) 。jQuery對(duì)這個(gè)事件對(duì)象進(jìn)行了必要的擴(kuò)展,從而在任何瀏覽器中都能夠使用這個(gè)屬性。通過(guò).target,可以確定DOM中首先接收到事件的元素(即實(shí)際被單擊的元素)。而且,我們知道this引用的是處理事件的DOM元素,所以可以編寫(xiě)以上代碼。
不過(guò)推薦使用return false,Jquery綁定事件的話。
如下例所示:
復(fù)制代碼 代碼如下:
<html>
<script type="text/javascript" src="jquery-1.7.1.js"></script>
<script>
function ialertdouble(e) {
alert('innerdouble');
stopBubble(e);
}
function ialertthree(e) {
alert('innerthree');
stopBubbleDouble(e);
}
function stopBubble(e) {
var evt = e||window.event;
evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡
}
function stopBubbleDouble(e) {
var evt = e||window.event;
evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡
evt.preventDefault();//阻止瀏覽器默認(rèn)行為,這樣鏈接就不會(huì)跳轉(zhuǎn)
}
$(function() {
//方法一
//$('#jquerytest').click(function(event) {
// alert('innerfour');
// event.stopPropagation();
// event.preventDefault();
//});
//方法二
$('#jquerytest').click(function() {
alert('innerfour');
return false;
});
});
</script>
<div onclick="alert('without');">without
<div onclick="alert('middle');">middle
<div onclick="alert('inner');">inner</div>
<div onclick="ialertdouble(event)">innerdouble</div>
<p><a onclick="ialertthree(event)">innerthree</a></p>
<p id='jquerytest'><a >innerfour</a></p>
</div>
</div>
</html>
當(dāng)你點(diǎn)擊inner的時(shí)候,會(huì)依次彈出‘inner',‘middle'和‘without'。這就是事件冒泡。
從直觀上來(lái)看,也是這樣的,因?yàn)樽罾飳拥膮^(qū)域是在父級(jí)節(jié)點(diǎn)中的,點(diǎn)擊了子級(jí)節(jié)點(diǎn)的區(qū)域,其實(shí)也是點(diǎn)擊了父級(jí)節(jié)點(diǎn)的區(qū)域,所以事件會(huì)傳播起來(lái)。
其實(shí),很多的時(shí)候,我們并不想事件冒泡,因?yàn)檫@樣會(huì)同時(shí)觸發(fā)幾個(gè)事件。
接下來(lái):我們點(diǎn)擊innerdouble。就會(huì)發(fā)現(xiàn)她并沒(méi)有冒泡,因?yàn)樗谡{(diào)用的方法ialertdouble()中調(diào)用了stopBubble()方法,方法通過(guò)判斷瀏覽器類型(Ie通過(guò)cancleBubble() 、firefox通過(guò)stopProgation())來(lái)阻止冒泡。
但如果是鏈接的話,我們會(huì)發(fā)現(xiàn)她也會(huì)阻止冒泡,但是會(huì)跳轉(zhuǎn),這就是瀏覽器的默認(rèn)行為。需要借助preventDefault()方法來(lái)阻止。具體可以查看ialertthree()。
目前主流的都是借助jquery來(lái)綁定click事件的,這樣的話,就簡(jiǎn)單多了。
我們可以在點(diǎn)擊事件時(shí)傳入?yún)?shù)event,然后直接
event.stopPropagation();
event.preventDefault(); //沒(méi)有鏈接不需要加這個(gè)。
這樣就可以了。
框架就是好,其實(shí)還有更簡(jiǎn)單的,在事件處理程序中返回false,這是對(duì)在事件對(duì)象上同時(shí)調(diào)用stopPropagation()和preventDefault()的一種簡(jiǎn)寫(xiě)方式。
【詳細(xì)代碼見(jiàn)上面,記得載入jquery.js?!?
其實(shí)也還可以在每個(gè)click事件中加入判斷:
復(fù)制代碼 代碼如下:
$('#id').click(function(event){
if(event.target==this){
//do something
}
})
解析:事件處理程序中的變量event保存著事件對(duì)象。而event.target屬性保存著發(fā)生事件的目標(biāo)元素。這個(gè)屬性是DOM API中規(guī)定的,但是沒(méi)有被所有瀏覽器實(shí)現(xiàn) 。jQuery對(duì)這個(gè)事件對(duì)象進(jìn)行了必要的擴(kuò)展,從而在任何瀏覽器中都能夠使用這個(gè)屬性。通過(guò).target,可以確定DOM中首先接收到事件的元素(即實(shí)際被單擊的元素)。而且,我們知道this引用的是處理事件的DOM元素,所以可以編寫(xiě)以上代碼。
不過(guò)推薦使用return false,Jquery綁定事件的話。
您可能感興趣的文章:
- 深入分析js的冒泡事件
- js阻止默認(rèn)事件與js阻止事件冒泡示例分享 js阻止冒泡事件
- JS阻止冒泡事件以及默認(rèn)事件發(fā)生的簡(jiǎn)單方法
- JS冒泡事件的快速解決方法
- Js 冒泡事件阻止實(shí)現(xiàn)代碼
- 關(guān)于IE瀏覽器以及Firefox下的javascript冒泡事件的響應(yīng)層級(jí)
- js 冒泡事件與事件監(jiān)聽(tīng)使用分析
- javaScript 事件綁定、事件冒泡、事件捕獲和事件執(zhí)行順序整理總結(jié)
- js事件冒泡、事件捕獲和阻止默認(rèn)事件詳解
- javascript事件冒泡和事件捕獲詳解
- js事件監(jiān)聽(tīng)機(jī)制(事件捕獲)總結(jié)
- js之事件冒泡和事件捕獲詳細(xì)介紹
- JS冒泡事件與事件捕獲實(shí)例詳解
相關(guān)文章
JS判斷、校驗(yàn)MAC地址的2個(gè)實(shí)例
這篇文章主要介紹了JS判斷、校驗(yàn)MAC地址的2個(gè)實(shí)例,需要的朋友可以參考下2014-05-05
JS實(shí)現(xiàn)瀏覽器點(diǎn)擊下載圖片功能案例分析【親測(cè)有效】
這篇文章主要介紹了JS實(shí)現(xiàn)瀏覽器點(diǎn)擊下載圖片功能,對(duì)比分析了同源與不同源兩種解決方案,并以實(shí)際案例形式分析了不同源情況下針對(duì)文件點(diǎn)擊下載的具體實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2023-04-04
極酷的javascirpt,讓你隨意編輯任何網(wǎng)頁(yè)
極酷的javascirpt,讓你隨意編輯任何網(wǎng)頁(yè)...2007-02-02
直接拿來(lái)用的頁(yè)面跳轉(zhuǎn)進(jìn)度條JS實(shí)現(xiàn)
這篇文章主要為大家分享了一款直接拿來(lái)用的頁(yè)面跳轉(zhuǎn)進(jìn)度條,由javascript實(shí)現(xiàn),可以直接跳轉(zhuǎn)到相應(yīng)頁(yè)面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
JavaScript實(shí)現(xiàn)GriwView單列全選(自寫(xiě)代碼)
在 GridView 里有一系列的 Checkbox ,要實(shí)現(xiàn)對(duì)其全選或全不選,二網(wǎng)上的都不否和要求,于是我自己寫(xiě)了JavaScript 代碼,貼出來(lái)供大家參考2013-05-05

