溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Javascript Event(事件)的傳播與冒泡

發(fā)布時(shí)間:2020-10-06 18:02:06 來(lái)源:腳本之家 閱讀:137 作者:小龍女先生 欄目:web開發(fā)

特性說(shuō)明和原理圖:

Javascript Event(事件)的傳播與冒泡

  • 標(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 ));
    });
  });
  1. 實(shí)現(xiàn)一個(gè)完整的event流的Demo
  2. 在cont的捕獲事件處有阻止事件傳播的代碼
  3. 阻止默認(rèn)事件只用于驗(yàn)證

效果圖

Javascript Event(事件)的傳播與冒泡

應(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í)也希望多多支持億速云!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI