JS中的事宜绑定,事宜捕捉,事宜冒泡以及事宜托付,兼容IE

事宜阶段

  • 事宜分为三个阶段: 事宜捕捉 –> 事宜目标 –> 事宜冒泡

事宜捕捉和冒泡

  • 事宜捕捉:事宜发作时(onclick,onmouseover……)起首发作在document上,然后顺次传递给body、……末了抵达目标节点(即事宜目标)。

  • 事宜冒泡:事宜抵达事宜目标以后不会完毕,会逐层向上冒泡,直至document对象,跟事宜捕捉相反

事宜

  1. onlick –>事宜冒泡,重写onlick会掩盖之前属性,没有兼容性问题

    el.onclik = null;   //解绑单击事宜,将onlick属性设为null即可
  2. addEventListener(event.type, handle, boolean); IE8及以下不支撑,属于DOM2级的要领,可增加多个要领不被掩盖

    //事宜范例没有on,false 示意在事宜第三阶段(冒泡)触发,true示意在事宜第一阶段(捕捉)触发。 假如handle是同一个要领,只实行一次。
    ele.addEventListener('click', function(){ }, false);  
    //解绑事宜,参数和绑定一样
    ele.removeEventListener(event.type, handle, boolean);
  3. attachEvent(event.type, handle ); IE特有,兼容IE8及以下,可增加多个事宜处置惩罚顺序,只支撑冒泡阶段

    //假如handle是同一个要领,绑定频频实行频频,这点和addEventListener差异,事宜范例要加on,比方onclick而不是click
    ele.attachEvent('onclick', function(){ }); 
    //解绑事宜,参数和绑定一样
    ele.detachEvent("onclick", function(){ });
  4. 默许事宜行动:href=””链接,submit表单提交等

    1. return false; 阻挠独享属性(经由过程on这类体式格局)绑定的事宜的默许事宜

      ele.onclick = function() {
       ……                         //你的代码
       return false;              //经由过程返回false值阻挠默许事宜行动
      };
    2. event.preventDefault( ); 阻挠经由过程 addEventListener( ) 增加的事宜的默许事宜

      element.addEventListener("click", function(e){
       var event = e || window.event;
       ……
       event.preventDefault( );      //阻挠默许事宜
      },false);
    3. event.returnValue = false; 阻挠经由过程 attachEvent( ) 增加的事宜的默许事宜

      element.attachEvent("onclick", function(e){
         var event = e || window.event;
         ……
         event.returnValue = false;       //阻挠默许事宜
      });

事宜封装

  • 接下来我们把事宜绑定以及事宜解绑封装成为一个函数,兼容浏览器

    // 事宜绑定
    function addEvent(element, eType, handle, bol) {
     if(element.addEventListener){           //假如支撑addEventListener
         element.addEventListener(eType, handle, bol);
     }else if(element.attachEvent){          //假如支撑attachEvent
         element.attachEvent("on"+eType, handle);
     }else{                                  //不然运用兼容的onclick绑定
         element["on"+eType] = handle;
     }
    }
    // 事宜解绑
    function removeEvent(element, eType, handle, bol) {
     if(element.addEventListener){
         element.removeEventListener(eType, handle, bol);
     }else if(element.attachEvent){
         element.detachEvent("on"+eType, handle);
     }else{
         element["on"+eType] = null;
     }
    }

事宜冒泡、事宜捕捉阻挠

event.stopPropagation( );    // 阻挠事宜的进一步流传,包含(冒泡,捕捉),无参数
event.cancelBubble = true;   // true 为阻挠冒泡

事宜托付(事宜代办)

  • 事宜托付:应用事宜冒泡的特征,将里层的事宜托付给外层事宜,依据event对象的属性举行事宜托付,改良机能。

  • 运用事宜托付可以防止对特定的每一个节点增加事宜监听器;事宜监听器是被增加到它们的父元素上。事宜监听器会剖析从子元素冒泡上来的事宜,找到是哪个子元素的事宜。

来个例子吧,假如要零丁点击table内里的td,一般做法是for轮回给每一个td绑定事宜,td少的话机能什么差异,td假如多了,就不行了,我们运用事宜托付:

 <!-- HTML -->
<table id="out" border="1" style="cursor: pointer;">
    <tr>
      <td>table01</td>
      <td>table02</td>
      <td>table03</td>
      <td>table04</td>
      <td>table05</td>
      <td>table06</td>
      <td>table07</td>
      <td>table08</td>
      <td>table09</td>
      <td>table10</td>
    </tr>
</table>

  // JS
  var out = document.getElementById("out");
  if(out.addEventListener){
      out.addEventListener("click",function(e){
          var e = e||window.event;
          //IE没有e.target,有e.srcElement
          var target = e.target||e.srcElement;
          //推断事宜目标是不是是td,是的话target即为目标节点td
          if(target.tagName.toLowerCase()=="td"){
              changeStyle(target);
              console.log(target.innerHTML);
          }
      },false);
  }else{
      out.attachEvent("onclick",function(e){
          var e = e||window.event;
          //IE没有e.target,有e.srcElement
          var target = e.target||e.srcElement;
          //推断事宜目标是不是是td,是的话target即为目标节点td
          if(target.tagName.toLowerCase()=="td"){
              changeStyle(target);
              console.log(target.innerHTML);
          }
      });
  };
};

  function changeStyle(ele){
      ele.innerHTML = "已点击"
      ele.style.background="#900";
      ele.style.color = "#fff"; 
  }        
    原文作者:小窝
    原文地址: https://segmentfault.com/a/1190000004484445
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞