Js冒泡事件詳解及阻止示例
更新時(shí)間:2014年03月21日 16:10:01 作者:
如果某元素定義了事件A,如click事件,如果觸發(fā)了事件之后,沒有阻止冒泡事件,那么事件將向父級元素傳播
Js冒泡機(jī)制是指如果某元素定義了事件A,如click事件,如果觸發(fā)了事件之后,沒有阻止冒泡事件,那么事件將向父級元素傳播,觸發(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)行為,這樣鏈接就不會跳轉(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í)候,會依次彈出‘inner',‘middle'和‘without'。這就是事件冒泡。
從直觀上來看,也是這樣的,因?yàn)樽罾飳拥膮^(qū)域是在父級節(jié)點(diǎn)中的,點(diǎn)擊了子級節(jié)點(diǎn)的區(qū)域,其實(shí)也是點(diǎn)擊了父級節(jié)點(diǎn)的區(qū)域,所以事件會傳播起來。
其實(shí),很多的時(shí)候,我們并不想事件冒泡,因?yàn)檫@樣會同時(shí)觸發(fā)幾個(gè)事件。
接下來:我們點(diǎn)擊innerdouble。就會發(fā)現(xiàn)她并沒有冒泡,因?yàn)樗谡{(diào)用的方法ialertdouble()中調(diào)用了stopBubble()方法,方法通過判斷瀏覽器類型(Ie通過cancleBubble() 、firefox通過stopProgation())來阻止冒泡。
但如果是鏈接的話,我們會發(fā)現(xiàn)她也會阻止冒泡,但是會跳轉(zhuǎn),這就是瀏覽器的默認(rèn)行為。需要借助preventDefault()方法來阻止。具體可以查看ialertthree()。
目前主流的都是借助jquery來綁定click事件的,這樣的話,就簡單多了。
我們可以在點(diǎn)擊事件時(shí)傳入?yún)?shù)event,然后直接
event.stopPropagation();
event.preventDefault(); //沒有鏈接不需要加這個(gè)。
這樣就可以了。
框架就是好,其實(shí)還有更簡單的,在事件處理程序中返回false,這是對在事件對象上同時(shí)調(diào)用stopPropagation()和preventDefault()的一種簡寫方式。
【詳細(xì)代碼見上面,記得載入jquery.js?!?
其實(shí)也還可以在每個(gè)click事件中加入判斷:
$('#id').click(function(event){
if(event.target==this){
//do something
}
})
解析:事件處理程序中的變量event保存著事件對象。而event.target屬性保存著發(fā)生事件的目標(biāo)元素。這個(gè)屬性是DOM API中規(guī)定的,但是沒有被所有瀏覽器實(shí)現(xiàn) 。jQuery對這個(gè)事件對象進(jìn)行了必要的擴(kuò)展,從而在任何瀏覽器中都能夠使用這個(gè)屬性。通過.target,可以確定DOM中首先接收到事件的元素(即實(shí)際被單擊的元素)。而且,我們知道this引用的是處理事件的DOM元素,所以可以編寫以上代碼。
不過推薦使用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)行為,這樣鏈接就不會跳轉(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í)候,會依次彈出‘inner',‘middle'和‘without'。這就是事件冒泡。
從直觀上來看,也是這樣的,因?yàn)樽罾飳拥膮^(qū)域是在父級節(jié)點(diǎn)中的,點(diǎn)擊了子級節(jié)點(diǎn)的區(qū)域,其實(shí)也是點(diǎn)擊了父級節(jié)點(diǎn)的區(qū)域,所以事件會傳播起來。
其實(shí),很多的時(shí)候,我們并不想事件冒泡,因?yàn)檫@樣會同時(shí)觸發(fā)幾個(gè)事件。
接下來:我們點(diǎn)擊innerdouble。就會發(fā)現(xiàn)她并沒有冒泡,因?yàn)樗谡{(diào)用的方法ialertdouble()中調(diào)用了stopBubble()方法,方法通過判斷瀏覽器類型(Ie通過cancleBubble() 、firefox通過stopProgation())來阻止冒泡。
但如果是鏈接的話,我們會發(fā)現(xiàn)她也會阻止冒泡,但是會跳轉(zhuǎn),這就是瀏覽器的默認(rèn)行為。需要借助preventDefault()方法來阻止。具體可以查看ialertthree()。
目前主流的都是借助jquery來綁定click事件的,這樣的話,就簡單多了。
我們可以在點(diǎn)擊事件時(shí)傳入?yún)?shù)event,然后直接
event.stopPropagation();
event.preventDefault(); //沒有鏈接不需要加這個(gè)。
這樣就可以了。
框架就是好,其實(shí)還有更簡單的,在事件處理程序中返回false,這是對在事件對象上同時(shí)調(diào)用stopPropagation()和preventDefault()的一種簡寫方式。
【詳細(xì)代碼見上面,記得載入jquery.js?!?
其實(shí)也還可以在每個(gè)click事件中加入判斷:
復(fù)制代碼 代碼如下:
$('#id').click(function(event){
if(event.target==this){
//do something
}
})
解析:事件處理程序中的變量event保存著事件對象。而event.target屬性保存著發(fā)生事件的目標(biāo)元素。這個(gè)屬性是DOM API中規(guī)定的,但是沒有被所有瀏覽器實(shí)現(xiàn) 。jQuery對這個(gè)事件對象進(jìn)行了必要的擴(kuò)展,從而在任何瀏覽器中都能夠使用這個(gè)屬性。通過.target,可以確定DOM中首先接收到事件的元素(即實(shí)際被單擊的元素)。而且,我們知道this引用的是處理事件的DOM元素,所以可以編寫以上代碼。
不過推薦使用return false,Jquery綁定事件的話。
您可能感興趣的文章:
- 深入分析js的冒泡事件
- js阻止默認(rèn)事件與js阻止事件冒泡示例分享 js阻止冒泡事件
- JS阻止冒泡事件以及默認(rèn)事件發(fā)生的簡單方法
- JS冒泡事件的快速解決方法
- Js 冒泡事件阻止實(shí)現(xiàn)代碼
- 關(guān)于IE瀏覽器以及Firefox下的javascript冒泡事件的響應(yīng)層級
- js 冒泡事件與事件監(jiān)聽使用分析
- javaScript 事件綁定、事件冒泡、事件捕獲和事件執(zhí)行順序整理總結(jié)
- js事件冒泡、事件捕獲和阻止默認(rèn)事件詳解
- javascript事件冒泡和事件捕獲詳解
- js事件監(jiān)聽機(jī)制(事件捕獲)總結(jié)
- js之事件冒泡和事件捕獲詳細(xì)介紹
- JS冒泡事件與事件捕獲實(shí)例詳解
相關(guān)文章
實(shí)用Javascript調(diào)試技巧分享(小結(jié))
這篇文章主要介紹了實(shí)用Javascript調(diào)試技巧分享(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06js實(shí)現(xiàn)class樣式的修改、添加及刪除的方法
這篇文章主要介紹了js實(shí)現(xiàn)class樣式的修改、添加及刪除的方法,主要通過修改標(biāo)簽的className來實(shí)現(xiàn)這一功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-01-01js實(shí)現(xiàn)按鈕控制圖片360度翻轉(zhuǎn)特效的方法
這篇文章主要介紹了js實(shí)現(xiàn)按鈕控制圖片360度翻轉(zhuǎn)特效的方法,涉及HTML5中canvas方法的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02詳解基于Vue cli生成的Vue項(xiàng)目的webpack4升級
這篇文章主要介紹了詳解基于Vue cli生成的Vue項(xiàng)目的webpack4升級,本文將詳細(xì)介紹從webpack3到webpack4的升級過程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06微信小程序使用wx.chooseLocation開發(fā)地圖怎么做
這篇文章主要介紹了微信小程序使用wx.chooseLocation開發(fā)地圖流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12JavaScript 中有關(guān)數(shù)組對象的方法(詳解)
下面小編就為大家?guī)硪黄狫avaScript 中有關(guān)數(shù)組對象的方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08深入理解JavaScript系列(6) 強(qiáng)大的原型和原型鏈
JavaScript 不包含傳統(tǒng)的類繼承模型,而是使用 prototypal 原型模型2012-01-01