JavaScript事件对象深入详解
本文实例讲述了JavaScript事件对象。分享给大家供大家参考,具体如下:
触发DOM上的事件时,会生成一个事件对象event,它包含着所有与事件有关的信息,诸如导致事件的元素、事件的类型以及其他与特定事件相关的信息。所有的浏览器都支持event对象,但支持的方式不同。
1DOM中的事件对象
兼容DOM的浏览器会将event对象传入事件处理程序(DOM0级与DOM2级都支持):
varbtn=document.getElementById("myBtn");
btn.onclick=function(event){
console.log(event.type);//"click"
};
btn.addEventListener("click",function(event){
console.log(event.type);//"click",false
};
event.type保存的是被触发的事件类型。
通过HTML属性指定事件处理程序时,event中保存的是event对象:
event对象包含着创建它的特定事件相关的属性和方法,所以可能每个特定事件都有自己所特有的属性和方法,不过所有事件都会有这些属性和方法:
在事件处理程序内部,this始终等于currentTarget,而target等于事件的实际目标。如果直接将事件处理程序指定给目标元素,那么这三个值相等:
varbtn=document.getElementById("myBtn"); btn.onclick=function(event){ console.log(event.currentTarget===this);//true console.log(event.target===this);//true }
如果事件处理程序指定到按钮的父节点上,那么它们是不同的:
document.body.onclick=function(event){ console.log(event.currentTarget===document.body);//true console.log(this===document.body);//true console.log(event.target===document.getElementById("myBtn"));//true }
如果需要通过一个函数来处理多个事件,那么可以使用type属性:
varbtn=document.getElementById("myBtn"); varhandler=function(event){ switch(event.type){ case"click": console.log("Clicked"); break; case"mouseover": event.target.style.backgroundColor="red"; break; case"mouseout": event.target.style.backgroundColor=""; break; } }; btn.onclick=handler; btn.onmouseover=handler; btn.onmouseout=handler;
使用preventDefault()方法来阻止特定事件的默认行为:
点我 varlink=document.getElementById("myLink"); link.onclick=function(event){ event.preventDefault(); }
注意:只有cancelable属性值为true的事件,才可以使用preventDefault()阻止特定事件的默认行为!
stopPropagation()会立即阻止事件在DOM层次的传播。比如这里在按钮事件中调用stopPropagation(),来避免触发注册在document.body上的事件处理程序:
varbtn=document.getElementById("myBtn"); btn.onclick=function(event){ console.log("Clicked"); event.stopPropagation(); }; document.body.onclick=function(event){ console.log("Bodyclicked"); };
eventPhase属性,可以确定事件当前正处于事件流的哪一个阶段:
varbtn=document.getElementById("myBtn"); btn.onclick=function(event){ console.log(event.eventPhase);//2 }; document.body.addEventListener("click",function(event){ console.log(event.eventPhase);//1 },true);//true表示捕获阶段 document.body.onclick=function(event){ console.log(event.eventPhase);//3 };
注意:只有在事件处理程序执行期间,event对象才会存在;一旦事件处理程序执行结束,event对象就会被销毁!
2IE中的事件对象
在使用DOM0级方法添加事件处理程序时,event对象是作为window对象的一个属性存在:
varbtn=document.getElementById("myBtn");
btn.onclick=function(){
varevent=window.event;
console.log(event.type);//"click"
};
如果是通过HTML属性指定的事件处理程序,也跟DOM一样,可以通过event变量来访问event对象。
IE的event对象也包含着创建它的特定事件相关的属性和方法,所以可能每个特定事件都有自己所特有的属性和方法,不过所有事件都会有这些属性和方法:
因为事件处理程序的作用域是根据它指定的方式来确定的,所以最好是使用event.srcElement来得到事件的目标比较靠谱:
点我 varbtn=document.getElementById("myBtn"); btn.onclick=function(){ console.log(window.event.srcElement===this);//true }; btn.attachEvent("onclick",function(event){ console.log(event.srcElement===this);//false });
将returnValue设置为false,就能阻止默认行为:
点我 varlink=document.getElementById("myLink"); link.onclick=function(){ window.event.returnValue=false; }
与DOM不同的是,这里没有办法确定事件是否能被取消。
因为IE不支持事件捕获,所以只能取消事件冒泡:
varbtn=document.getElementById("myBtn"); btn.onclick=function(){ console.log("Clicked"); window.event.cancelBubble=true; }; document.body.onclick=function(event){ console.log("Bodyclicked"); };
3跨浏览器的事件对象
我们把之前的EventUtil对象进行增强:
varEventUtil={
...
/**
*返回对event对象的引用
*@paramevent
*@returns{*}
*/
getEvent:function(event){
returnevent?event:window.event;
},
/**
*返回事件的目标
*@paramevent
*@returns{*|elem|Object}
*/
getTarget:function(event){
returnevent.target||event.srcElement;
},
/**
*取消事件默认行为
*@paramevent
*/
preventDefault:function(event){
if(event.preventDefault){
event.preventDefault();
}else{
event.returnValue=false;
}
},
/**
*阻止事件流
*@paramevent
*/
stopPropagation:function(event){
if(event.stopPropagation){
event.stopPropagation();
}else{
event.cancelBubble=true;
}
}
}
这样使用:
点我 varbtn=document.getElementById("myBtn"); btn.onclick=function(event){ event=EventUtil.getEvent(event);//确保所有浏览器都能使用event对象 vartarget=EventUtil.getTarget(event); console.log(target); }
取消事件默认行为:
点我 varlink=document.getElementById("myLink"); link.onclick=function(event){ event=EventUtil.getEvent(event); EventUtil.preventDefault(event); }
阻止事件传播:
点我 varbtn=document.getElementById("myBtn"); btn.onclick=function(event){ console.log("Clicked"); event=EventUtil.getEvent(event); EventUtil.stopPropagation(event); }; document.body.onclick=function(event){ console.log("Bodyclicked"); };
因为IE不支持事件捕获,所以EventUtil的stopPropagation()的方法只能阻止事件冒泡。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript事件相关操作与技巧大全》、《JavaScript页面元素操作技巧总结》、《JavaScript操作DOM技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。