Javascript Event(事件)的傳播與冒泡
特性說(shuō)明和原理圖:

- 標(biāo)準(zhǔn)瀏覽器和Ie9+瀏覽器都支持事件的冒泡和捕獲,而IE8-瀏覽器只支持冒泡
- 標(biāo)準(zhǔn)和Ie9+瀏覽器用stopPropagation()或cancelBubble阻止事件傳播,而ie8-用e.cancelBubble屬性來(lái)阻冒泡,注意ie9不支持cancelBubble屬性(設(shè)置后不生效),但chrome、safari、opera、firefox都支持cancelBubble屬性。
- Ie8-用attachEvent為dom元素添加一個(gè)事件,但必須在事件名前加上on,此類事件只能在元素的冒泡階段。
- stopPropagatin()方法用于阻止事件的傳播,如果設(shè)置在捕獲階段,則目標(biāo)和冒泡階段不會(huì)被執(zhí)行;
- cancelBubble屬性只能阻止冒泡階段,對(duì)捕獲和目標(biāo)階段的事件不能阻止
- preventDefault()和window.event.returnValue用于標(biāo)準(zhǔn)瀏覽器和ie9+,都可以阻止默認(rèn)事件。ie8-可以用returnValue,preventDefault()。
示例代碼(ie8-示例不提供)
html代碼
<body class="body" >
<div class="log"></div>
<input type="text" id="inTxt" name="intxt" />
<div class="wrap">
<div class="cont">
<button type="button" class="button" id="btn">按鈕</button>
<select name="stopType" id="stopType">
<option value="1">StopPropagation</option>
<option value="2">cancelBubble</option>
</select>
<button type="button" class="button" id="btnReject">cont阻止捕獲或冒泡</button>
</div>
</div>
</body>
層級(jí)關(guān)系:body->wrap->cont->button,可以對(duì)照上面的原理
Js代碼
$(function(){
var $log = $('.log'),
$wrap = $('.wrap'),
$cont = $('.cont'),
$btn = document.getElementById('btn'),
$stopType = $('#stopType'),
$body = $('body'),
$inTxt = $('#inTxt'),
$btnReject = $('#btnReject');
var ePhase = ["","捕獲","目標(biāo)","冒泡"]
var setBorderColor = function( $dom, color, time,event){
$dom = $($dom);
$log.html($log.html() + $dom.attr('class') + '[' + ePhase[event.eventPhase] + ']' + '<br/>')
var timeIndex = window.setTimeout(function(){
$dom.css({
'borderColor': color,
'borderWidth': '4px'
});
}, time);
}
//捕獲
$body[0].addEventListener('click',function(event){
$log.html($log.html() + "-------------------<br>");
setBorderColor($body,'#0866ff ',0,event);
},true);
$wrap[0].addEventListener('click',function(event){
setBorderColor($wrap,'yellow',2000,event);
},true);
$cont[0].addEventListener('click',function(event){
event = event || window.event;
if( $stopType.val() == '1' ){
event.stopPropagation();
}else{
event.cancelBubble = true;
}
setBorderColor($cont,'green',1000,event);
},true);
$btn.addEventListener('click', function(event){
setBorderColor($btn,'red',0,event);
},true);
$btnReject[0].addEventListener('click',function(event){
setBorderColor($btnReject,'gray ',0,event);
},true);
//冒泡
$body[0].addEventListener('click',function(event){
setBorderColor($body,'#0866ff ',0,event);
},false);
$wrap[0].addEventListener('click',function(event){
setBorderColor($wrap,'yellow',2000,event);
},false);
$cont[0].addEventListener('click',function(event){
setBorderColor($cont,'green',1000,event);
},false);
$btn.addEventListener('click', function(event){
setBorderColor($btn,'red',0,event);
},false);
$btnReject[0].addEventListener('click',function(event){
setBorderColor($btnReject,'gray ',0,event);
},false);
//阻止默認(rèn)事件
$inTxt.keypress(function(event){
//event.preventDefault();
window.event.returnValue = false;
$body.append( String.fromCharCode( event.keyCode ));
});
});
- 實(shí)現(xiàn)一個(gè)完整的event流的Demo
- 在cont的捕獲事件處有阻止事件傳播的代碼
- 阻止默認(rèn)事件只用于驗(yàn)證
效果圖

應(yīng)用場(chǎng)景
- 捕獲階段的事件應(yīng)用場(chǎng)景較少,一般情況下都應(yīng)用在目標(biāo)和冒泡階段。
- 現(xiàn)階段w3c的標(biāo)準(zhǔn)事件已普遍受支持,如果不兼容ie8-瀏覽器可以廢棄一些兼容性代碼。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
關(guān)于JS中一維數(shù)組和二維數(shù)組互轉(zhuǎn)問(wèn)題
這篇文章主要介紹了js中一維數(shù)組和二維數(shù)組互轉(zhuǎn),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
JavaScript事件概念詳解(區(qū)分靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè))
這篇文章主要介紹了JavaScript事件(區(qū)分靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè))的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用JavaScript,感興趣的朋友可以了解下2021-02-02
JavaScript實(shí)現(xiàn)的一個(gè)倒計(jì)時(shí)的類
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的一個(gè)倒計(jì)時(shí)的類,本文直接給出demo代碼,需要的朋友可以參考下2015-03-03
用js寫(xiě)了一個(gè)類似php的print_r輸出換行功能
因?yàn)閜hp的print_r比較好用同時(shí)js卻沒(méi)有這個(gè)功能于是自己就寫(xiě)了一個(gè),感興趣的你可不要錯(cuò)過(guò)了哈,希望本文對(duì)你提高知識(shí)有所幫助2013-02-02
javascript動(dòng)畫(huà)效果打開(kāi)/關(guān)閉層
用javascript實(shí)現(xiàn)打開(kāi)層和關(guān)閉層的效果,原理不錯(cuò),學(xué)習(xí),記錄好2008-06-06
使用JavaScript實(shí)現(xiàn)連續(xù)滾動(dòng)字幕效果的方法
這篇文章主要介紹了使用JavaScript實(shí)現(xiàn)連續(xù)滾動(dòng)字幕效果的方法,文中給出了瀏覽器端運(yùn)行的示例腳本,需要的朋友可以參考下2015-07-07
對(duì)存在JavaScript隱式類型轉(zhuǎn)換的四種情況的總結(jié)(必看篇)
下面小編就為大家?guī)?lái)一篇對(duì)存在JavaScript隱式類型轉(zhuǎn)換的四種情況的總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
JavaScript面向?qū)ο蟪绦蛟O(shè)計(jì)教程
這篇文章主要介紹了JavaScript面向?qū)ο蟪绦蛟O(shè)計(jì)教程的相關(guān)資料,需要的朋友可以參考下2016-03-03

