事件对象

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 }

  

 

时间: 2024-10-04 13:40:43

事件对象的相关文章

事件对象(二)

冒泡和默认行为 如果在页面中重叠了多个元素,并且重叠的这些元素都绑定了同一个事件,那么就会出现冒泡问题. 例,html代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>事件对象</title> <script type="text/javascript" src="jquery-1.12.3.js&

javascript event(事件对象)详解

1. 事件对象 thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.45;vertical-align:top;border-top:1px solid #ddd}.table>thead

jQuery事件对象的属性和方法

jQuery事件对象的属性和方法 事件对象的属于与方法有很多,但是我们经常用的只有那么几个,这里我主要说下作用与区别 event.type:获取事件的类型 触发元素的事件类型 $("a").click(function(event) { alert(event.type); // "click"事件 }); event.pageX 和 event.pageY:获取鼠标当前相对于页面的坐标 通过这2个属性,可以确定元素在当前页面的坐标值,鼠标相对于文档的左边缘的位置(

jQuery事件对象的作用

jQuery事件对象的作用 事件中的Event对象容易被初学者忽略掉,可能大多时候初学者不知道怎么去用它,但有些时候它还是非常有用的 一个标准的"click"点击事件 $(elem).on("click",function(event){ event //事件对象 }) 在不同浏览器之间事件对象的获取, 以及事件对象的属性都有差异.jQuery根据 W3C 标准规范了事件对象,所以在jQuery事件回调方法中获取到的事件对象是经过兼容后处理过的一个标准的跨浏览器对象

JS-DOM2级事件对象跨浏览器处理(已封装)

1 var eventUill = { 2 //添加事件 3 addHander: 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 {

JS 事件(3)——事件对象

事件对象 在触发DOM节点上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息. DOM中的事件对象 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>事件对象</title> 6 </head> 7 <body> 8 <div id="box"&

JS 事件(4)——跨浏览器的事件对象

跨浏览器的事件对象详解 封装事件对象 1 var event_util = { 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" +

JS—事件对象

事件对象: 在触发DOM事件的时候都会产生一个对象 事件对象Event: 1)type:获取事件类型 2)target:获取事件目标 3)stopPropagation():阻止事件冒泡 4)preventDefault():阻止事件默认行为 <div id="div"> <button id="btn">按钮</button> <a href="www.baidu.com" id="aid&q

JavaScript的事件对象_鼠标事件

鼠标事件是 Web 上面最常用的一类事件,毕竟鼠标还是最主要的定位设备.那么通过事件对象可以获取到鼠标按钮信息和屏幕坐标获取等. 一.鼠标按钮 只有在主鼠标按钮被单击时(常规一般是鼠标左键)才会触发 click 事件,因此检测按钮的信息并不是必要的. 但对于 mousedown 和 mouseup 事件来说,则在其 event 对象存在一个 button 属性,表示按下或释放按钮. <script type="text/javascript"> window.onload

js跨浏览器事件对象、事件处理程序

项目中有时候会不用jquery这么好用的框架,需要自己封装一些事件对象和事件处理程序,像封装AJAX那样:这里面考虑最多的还是浏览器的兼容问题,原生js封装如下:var EventUtil={ //节点.事件名.事件处理函数 addHanler:function(element,type,handler){ if(element.addEventListener){ element.addEventListener(type,handler,false);//这里一个参数为false意为在事件冒