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,此類(lèi)事件只能在元素的冒泡階段。
- 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)文章
js es6系列教程 - 新的類(lèi)語(yǔ)法實(shí)戰(zhàn)選項(xiàng)卡(詳解)
下面小編就為大家?guī)?lái)一篇js es6系列教程 - 新的類(lèi)語(yǔ)法實(shí)戰(zhàn)選項(xiàng)卡(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09原生JS實(shí)現(xiàn)移動(dòng)端web輪播圖詳解(結(jié)合Tween算法造輪子)
在做移動(dòng)端開(kāi)發(fā)的時(shí)候,必不可少的是輪播圖,下面這篇文章主要給大家介紹了關(guān)于利用純JS實(shí)現(xiàn)移動(dòng)端web輪播圖的相關(guān)資料,重要的是結(jié)合Tween算法造輪子,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-09-09JavaScript遍歷數(shù)組和對(duì)象的元素簡(jiǎn)單操作示例
這篇文章主要介紹了JavaScript遍歷數(shù)組和對(duì)象的元素簡(jiǎn)單操作,結(jié)合實(shí)例形式分析了javascript數(shù)組與對(duì)象元素遍歷相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-07-07JS上傳圖片前實(shí)現(xiàn)圖片預(yù)覽效果的方法
這篇文章主要介紹了JS上傳圖片前實(shí)現(xiàn)圖片預(yù)覽效果的方法,涉及javascript操作圖片的技巧,需要的朋友可以參考下2015-03-03