Javascript高级编程学习笔记(59)—— 事件(3)事件对象

时间:2021-08-03 04:16:33

事件对象

在触发DOM‘事件时,会产生一个事件对象 event

该对象包含着所有与事件有关的信息

所有浏览器都支持 event 对象但是支持的方式有所不同

DOM事件对象

兼容DOM的浏览器会将event对象传入事件处理程序中

如下所示:

var btn = document.getElementByTagName("button")[0];

btn.onclick = function(event){
alert(event.type); //"click"
}

而通过HTML特性指定的事件处理程序,变量event保存着 event 对象

<input type = "button" value = "click" onclick = "alert(event.type)" />

event 对象包含与创建它的特定事件有关的方法和属性

如下表所示:

属性/方法 类型 读/写 说明
bubbles Boolean 只读 表明事件是否冒泡
cancelable Boolean 只读 表明是否可以取消事件的默认行为
currentTarget Element 只读 指向事件处理程序所处理事件的触发元素
defaultPrevent Boolean 只读 为true表示已经调用了preventDefault()方法
detail Integer 只读 与事件相关的细节信息
eventPhase Integer 只读 调用事件处理程序的阶段 1表示捕获阶段  2表示处于目标阶段 3表示冒泡阶段
preventDefault() Function 只读 取消事件的默认行为,当cancelable为 true 时才能使用该方法
stopImmediatePropagation() Function 只读 取消事件的进一步捕获或冒泡,针对同一事件的多个事件处理程序(即事件终止于当前事件处理程序不会继续,就算是同一个元素的同一个事件的不同事件处理程序也不会触发)
stopPropagation() Function 只读 取消事件的下一阶段的事件处理程序,但是当前阶段的不同事件处理程序都会触发
target Element 只读 事件的目标元素
trusted Boolean 只读 true表示事件是浏览器生成,false表示事件为JS创建
type String 只读 事件触发的类型
view AbstractView 只读 与事件关联的抽象视图,等同于发生事件的window对象

在事件处理程序的内部,this 始终等于 currentTarget 的值

而target只包含事件的实际目标

也就是说 this和current指向的是注册当前事件的元素,而target是当前事件的目标元素

这两者可能有一样的值,而在事件委托时我们将事件注册到目标元素的父元素上,这两者就不相同了

当我们需要通过一个函数处理多个事件的时候

可以使用type属性

如:

var btn = document.getElemntByTagName("button")[0]'
var handler = function(event){
switch(event.type){
case "click":
alert("clicked");
break;
case "mouseover":
alert("mouseover");
break;
case "mouseout":
alert("out");
break;
}
} btn.onclick = handle;
btn.onmouseover = handle;
btn.onmouseout = handle;

如果希望阻止事件的默认行为,可以使用 preventDefault() 方法

不过只有cancelable 属性为true 的事件才能阻止默认行为

而关于stopImmediatePropagation()和stopPropagation()的区别在于,前者让事件流停止在当前事件处理程序,而后者是让事件流停在当前事件流阶段

此外,只有在事件处理程序执行期间 event 对象才会存在,一旦执行完毕 event 对象就会销毁

IE中的事件对象

与访问DOM中的 event 对象不同,访问IE中的 event 有几种不同的方式,而方式取决于是如何注册事件处理程序的

当我们使用DOM0级的方式添加事件处理程序的时候 event 对象作为 window  的一个属性存在

而如果我们使用 attachEvent 方法添加事件处理程序,那么就和DOM一样 event 对象会作为一个参数传入事件处理程序

并且也可以使用 window.event来访问

而IE中的所有事件对象都会包含以下属性和方法:

属性/方法 类型 读/写 说明
cancelBubble Boolean 读/写 默认值为false,设置为true就可以取消冒泡
returnValue Boolean 读/写 默认值为true,设为法拉瑟可以取消事件的默认行为
srcElement Element 只读

事件目标与DOM中的 target 属性相同

type String 只读

被触发事件的类型

而IE中有一点比较重要,那就是事件处理程序的this指向和事件处理程序的指定方式有关,所以在使用时最好使用 event.srcElement 比较保险

跨浏览器事件对象

事件对象当然也有跨浏览器的实现方式

下方给出的是一个简略的初步实现:

function eventFunction(e){
var events;
events = e ? e : window.event;// event对象兼容
events.target = e.target || e.srcElement;// 目标元素兼容
events.preventDefault = e.preventDefault || function () {
events.returnValue = false;
};// 阻止默认事件兼容
events.stopPropagation = e.stopPropagation || function () {
events.cancelBubble = true;
};// 阻止冒泡兼容
}