事件对象——DOM中的事件对象

书虫媛 2020-02-02

触发DOM上的交互事件会生成一个event对象,用以保存事件的信息。比如鼠标交互的事件会保存鼠标的位置,键盘交互的事件会保存键的值。

1.DOM0级和DOM2级事件处理程序在进行事件处理时都会有一个event对象传入。例如event.type会保存事件类型名称。

2.HTML事件处理程序中的变量event保存有event对象。

3.event对象的属性和方法:

1.bubbles。布尔值,用以表明事件是否冒泡。

2.cancelable。布尔值,用以表明是否可以取消事件的默认行为。通常和preventDefault()配合使用。

3.defaultPrevented。布尔值,值为true表明已经调用了preventDefault()。(DOM3新增)

4.trusted。布尔值,值为true表明事件是浏览器生成的,false表明是开发者通过js创建的。(DOM3新增)

5.currentTarget。Element,事件处理程序当前正在处理事件的那个元素,也就是说事件处理程序被添加的那个元素,即事件处理处理程序的this值的指向。

6.target。Element,事件的目标。

7.detail。与事件相关的细节信息。

8.eventPhase。调用事件处理程序的阶段。1表示捕获阶段,2表示处于目标阶段,3表示冒泡阶段。

9.preventDefault()。取消事件的默认行为,前提要求是cancelable值为true。

10.stopPropagation()。取消事件的进一步捕获或冒泡。前提要求bubbles值为true。

11.stopImmediatePropagation()。取消事件进一步冒泡,并阻止任何事件处理程序调用。(DOM3新增)。

12.type。事件类型。

4.event对象的target、currentTarget和元素的this关系。

event.currentTarget永远指的是事件处理程序执行环境所在作用域,即事件处理程序被添加到的那个元素。如果事件处理程序添加到目标元素,那么event.currentTarget与event.target与this彼此是全等关系。

如果事件处理程序没有被添加到目标元素上,比如被添加到body元素上,那么event.currentTarget与this是全等关系,它们都指向body元素,而event.target指向的是目标元素。

5.通过一个函数来处理多个事件

(在事件处理程序中利用switch判断event.type类型,对不同的事件类型赋予不同的处理方式,然后通过对目标元素添加DOM0级事件处理程序)

var btn=document,getElementById("btn");
var handler=(event)=>{
    switch(event.type){
        case "clcik":
            alert("clicked");
            break;
        case "mouseover":
            event.target.style.backgroundColor="red";
            break;
        case "mouseout":
            event.target.style.backgroundColor="";
            break;
    }
};
btn.onclick=handler;
btn.mouseover=handler;
btn.mouseout=handler;

6.阻止特定事件的默认行为

var link=document.getElementById("a");
link.onclick=(event)=>{  event.cancelable=true;
    event.preventDefault();
};

7.当目标元素的父元素上有事件处理程序时,通过event.stopPropagation()阻止目标元素事件冒泡。

var btn=document.getElementById("btn");
btn.onclick=(event)=>{
    //some code
    event.stopPropagation();
};//阻止事件冒泡,但处于目标阶段时仍会进行事件处理
document.body.onclick=(event)=>{
    //some code
};
//body上的事件处理程序不会被调用。

8.使用event.eventPhase属性查询事件流处于哪个阶段

btn.onclick=(event)=>{
    alert(event.eventPhase);//2,dom0级在处于目标阶段处理事件
};

btn.addEventListener("click",(event)=>{
   alert(event.eventPhase);//1 
},true);

btn.addEventListener("click",(event)=>{
       alert(event.eventPhase);//3
},false);

document.body.onclick=(event)=>{
  alert(event.eventPhase);//3  
}

相关推荐