zoukankan      html  css  js  c++  java
  • 事件对象

    1.1 > DOM中的事件对象

      1.1.1>兼容DOM的浏览器会将一个event对象传入到事件处理程序中。无论指定事件处理程序时使用什么方法(DOM0级或DOM2级),都会传入event对象。

        先来看看下面的实例 

    1  var btn = document.getElementById("myBtn");
    2  btn.onclick = function(event){
    3      alert(event.type); //click
    4  };
    5 
    6  btn.addEventListener("click",function(event){
    7      alert(event.type); //click
    8  },false);

      1.1.2>在通过html特性指定事件处理程序时,变量event中保存着event对象。请看下面的例子

    1  <button  onclick="alert(event.type);">点击</button> //click

      以这种方式提供event对象,可以让html特性事件处理程序与JavaScript函数执行相同的操作。

    event 对象包含于创建它的特定事件有关的属性和方法。触发的事件类型不一样,可用的属性和方法也不一样。

    注意其中几个重要的属性即可:

      

      eventPhase 确定事件当前处于事件流那个阶段 1 捕获阶段 2 目标对象上 3 冒泡阶段

      currentTarget  代表其事件处理程序当前正在处理事件的那个元素;

      target 事件的目标;

      stopPropagation()  阻止事件的进一步捕获或冒泡;

      preventDefault()  取消事件的默认行为;

      type 表示事件类型

    在事件处理函数中, this 始终与 currentTarget 相等,而target 则只包含事件的实际目标。

      1> 如果直接给实际目标添加事件的话,其三者是相等的

    1  var btn = document.getElementById("myBtn");
    2  btn.onclick = function(event){
    3      with(event){
    4          alert(currentTarget === this);
    5          alert(target === this);
    6      }
    7  };

      2> 如果事件给添加在父元素(例如 document.body)上的话,是不想等的 如下实例

    1  var btn = document.getElementById("myBtn");
    2  document.body.onclick = function(event){
    3      with(event){
    4          alert(currentTarget === this); //true
    5          alert(target === this); //false
    6      }
    7  };

    3> 当需要通过一个函数处理多个事件时,可以使用type属性。例如

     var btn = document.getElementById("myBtn");
     var handler =function(event){
         switch(event.type){
             case "click":
                 alert("Click");
                 break;
             case "mouseover":
                 alert("mouseover");
                 break;
             case "mouseout":
                 alert("mouseout");
                 break;
         }
     };
    
     btn.onclick = handler;
     btn.onmouseover = handler;
     btn.onmouseout= handler;

    4>   当某些时候我们需要阻止事件默认行为,可以使用 preventDefault()方法。例如  常见的链接的默认行为就是在被点击时会导航到其href特性指定的url。

      如果想阻止链接导航这一默认行为,那么通过链接的onclick 事件处理程序可以取消它,如下

    var link = document.getElementById("myLink");
    link.onclick = function(event){
       event.preventDefault();
    }

    注意:只有 cancelable(只读) 属性设置为true 的事件,才可以使用  preventDefault  来取消其默认行为。

    5>   当希望停止事件在DOM层次中传播,既取消进一步的事件捕获或冒泡。 例如 当一个按钮事件处理函数中添加stopPropagation()时,可以避免触发注册在docuemnt.body 上的事件处理程序,如下的例子所示

     1 var btn = document.getElementById("myBtn");
     2     btn.onclick = function(event){
     3         alert("btn"); // btn
     4         event.stopPropagation();
     5     };
     6     document.body.onclick = function(event){
     7      with(event){
     8         alert(currentTarget === this); 
     9         alert(target === this); 
    10     }
    11   };

    6>   eventPhase 属性 可以确定事件处于哪个事件流阶段 

     1     var btn = document.getElementById("myBtn");
     2     btn.onclick = function(event){
     3         alert(event.eventPhase); //2
     4     };
     5     document.body.addEventListener("click",function(event){
     6         alert(event.eventPhase);//1
     7     },true)
     8     document.body.onclick = function(event){
     9       alert(event.eventPhase);//3
    10     };    

    而当 eventPhase 等于 2 时,this、target 和 currentTarget 始终都是相等的。

    IE中的事件对象

      与访问DOM中event对象不同,要访问IE中的Event对象有几种不同的方式,取决于指定事件处理程序的方法。

      1>  在使用DOM0级方法添加事件程序时,event对象作为window对象的一个属性存在。 来看看下面的实例

    1 var btn = document.getElementById("myBtn");
    2 btn.onclick = function(){
    3     var event = window.event;
    4     alert(event.type); //click
    5 };

      2>    当事件处理程序通过使用attachEvent()添加的,那么就会有一个event对象作为参数传入事件处理函数中,如下所示

    1 var btn = document.getElementById("myBtn");
    2 btn.attachEvent("onclick",function(event){
    3     // var event = window.event;
    4     alert(event.type); //click
    5 });
    6     

      

     3>   如果通过HTML特性指定的时间处理程序,那么可以通过一个名叫event的变量来访问event对象(与dom中事件模型相同)。

     <button  onclick="alert(event.type);">点击</button> //click

      IE的event对象同样也包含与创建它的事件相关的属性和方法。其中很多属性和方法都有对应的或者相关的DOM属性和方法。但所有属性都会包含下表列的属性和方法。

      cancelBubble  boolean       读/写  默认值为false,但将其设置为true就可以取消事件冒泡(与DOM中的stopPropagation()方法作用相同)

      returnValue    boolean       读/写  默认值为true,但将其设置为false就可以取消事件的默认行为(与DOM中的preventDefault()方法的作用相同)

      srcElement     Element   只读   事件的目标对象

      type       String      只读  被触发的事件类型

      因为事件处理程序的作用域是根据指定它的方式来确定的,所以不能认为this会始终等于事件目标。姑 最好使用 event.srcElement 比较保险。 例如

    var btn = document.getElementById("myBtn");
    btn.onclick = function (){
    	alert(window.event.srcElement === this); // true  this == button
    };
    btn.attachEvent("onclick",function(event){
    	// var event = window.event;
    	alert(event.srcElement === this); //false  this== window
    });
    

       

     4 >    利用 returnValue 来实现取消事件默认行为,来看下面的实例  不过与 DOM不同的是,在此没有办法确定事件是否能被取消

    1 var myLink = document.getElementById("myLink");
    2 myLink.onclick = function (){
    3     // console.log(this.nodeName);
    4     window.event.returnValue = false;
    5 };

     5 >  利用 canceBubble属性来停止事件冒泡。 由于IE不支持事件捕获,因而只能取消事件冒泡; 但 stopPropagation()可以同时取消事件捕获和冒泡。

    1 var btn = document.getElementById("myBtn");
    2 btn.onclick = function (){
    3     alert("Clicked"); //Clicked
    4     window.event.cancelBubble = true;
    5 };
    6 document.body.attachEvent("onclick",function(event){
    7     alert(event.srcElement === this); 
    8 });

     6>  跨浏览器的事件对象

     1  var EventUtil = {
     2 
     3       addHandler:function(element,type,handler){
     4           if(element.addEventListener){
     5               element.addEventListener(type,handler,false);
     6           }else if(element.attachEvent){
     7               element.attachEvent("on"+type,handler);
     8           }else{
     9               element["on"+type] = handler;
    10           }
    11      },
    12      removeHandler:function(element,type,handler){
    13          if(element.removeEventListener){
    14              element.removeEventListener(type,handler,false);
    15          }else if(element.detachEvent){
    16              element.detachEvent("on"+type,handler);
    17          }else{
    18              element["on"+type] = null;
    19          }    
    20      },
    21      getEvent:function(event){
    22          return event?event:window.event;
    23      },
    24      getTarget:function(event){
    25          return event.target||event.srcElement;
    26      },
    27      preventDefault:function(event){
    28          if(event.preventDefault){
    29              event.preventDefault;
    30          }else{
    31              event.returnValue = false;
    32          }
    33      },
    34      stopPropagation:function(event){
    35          if(event.stopPropagation){
    36              event.stopPropagation();
    37          }else{
    38              event.cancelBubble = true;
    39          }
    40      }
    41 }

      

     

  • 相关阅读:
    字典的key都可以是什么
    groupby 的妙用(注意size和count)

    希尔排序
    TCP和UDP
    闭包(python)
    快速排序
    mysql t4模板_Model
    vue前端性能优化
    系统稳定性问题总结
  • 原文地址:https://www.cnblogs.com/czhyuwj/p/5679790.html
Copyright © 2011-2022 走看看