您的位置:首页 > Web前端 > JavaScript

JavaScript中的事件:事件对象

2012-12-23 10:52 309 查看
在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息。所有浏览器都支持event事件,但支持方式不同。

一、DOM中的事件对象

兼容DOM的浏览器会将一个event对象传入事件处理程序中,无论使用DOM0级或DOM2级。

event对象包含的部分属性或方法如下:

bubbles:表明事件是否冒泡。

cancelable:表明是否可以取消事件的默认行为。

currentTarget:其事件处理程序当前正在处理事件的那个元素。

defaulPrevented:为true表明已调用preventDefaul()。

eventPhase:调用事件处理程序的阶段。1为捕获,2为“处于目标”,3为冒泡。

preventDefaul():取消事件的默认行为。cancelable为true可用。

stopImmediatePropagation():取消事件的进一步捕获或冒泡。同时阻止任何事件处理程序被调用。

stopPropagation():取消事件的进一步捕获或冒泡。bubbles为true可用。

target:事件目标

在事件处理程序内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标。如果直接将事件处理程序指定给了目标元素,则这三者的值相同。如:

var btn=document.getElementById("myBtn");
btn.onclick=function(event){
alert(event.currentTarget===this);        //true
alert(event.target===this);               //true
};


如果事件处理程序存在于按钮的父节点中,那么这些值是不相同的。如:

document.body.onclick=function(event){
alert(event.currentTarget===document.body);       //true
alert(this===document.body);                                 //true
alert(event.target===document.getElementById(myBtn);  //true
};


上面的代码中,target元素等于按钮元素,是因为它是click事件的真正目标。由于按钮上事件处理程序,所以冒泡到document.body处理。

注意event对象只有在事件处理程序执行期间才存在,程序执行完就会被销毁。

二、IE中的事件对象

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

使用DOM0级时:event对象作为window对象的一个属性存在。

使用attachEvent()时:event对象作为参数传入事件处理程序函数中(同时也可以通过window对象来访问event对象,与DOM0级一样)。

看下面例子:

//DOM0级
var btn=document.getElementById("myBtn");
btn.onclick=function(){
var event=window.event;
alert(event.type);        //"click"
};

//attachEvent()
var btn=document.getElementById("myBtn");
btn.attachEvent("onclick",function(event){
alert(event.type);        //"click"
});


IE的event对象包含的部分属性方法如下:

cancelBubble:默认值为false,将其设为true就可以取消事件冒泡(与DOM中的stopPropagation()方法一样)。  

returnValue:默认值为true,将其设为false就可以取消事件的默认行为(与DOM中的preventDefault()方法一样)。

srcElement:事件的目标(与DOM中的target属性相同)。

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

三、跨浏览器的事件对象

var EventUtil={
addHandler:function(element,type,handler){
//代码
},
getEvent:function(event){
return event ? event : window.event;
},
getTarget:function(event){
return event.target || event.srcElement;
},
preventDefault:function(event){
if(event.preventDefault){
event.preventDefault();
}else{
event.returnValue=false;
}
},
removeHandler:function(element,type,handler){
//代码
},
stopPropagation:function(event){
if(eventstopPropagation){
event.stopPropagation();
}else{
event.cancelBubble=true;
}
}
};


btn.onclick=function(event){
event=EventUtil.getEvent(event);
};


以上代码,在兼容DOM的浏览器中,event变量只是简单地传入和返回。而在IE中,event参数是未定义的,因此就会返回window.event。将这一行代码添加到事件处理程序的开头,就可以确保随时都能使用event对象,而不用担心用户使用什么浏览器。

四、事件处理程序的作用域

在兼容DOM的浏览器中,事件处理程序中的this指向元素本身;

在IE中,使用DOM0级方法,this指向元素本身;而使用attachEvent(),则this===window。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: