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程序设计有所帮助。