资讯专栏INFORMATION COLUMN

JavaScript 事件——“事件对象”的注意要点

xuexiangjys / 422人阅读

摘要:在触发上的某个事件时,会产生一个事件对象。中的事件对象兼容的浏览器会将一个对象传入到事件处理程序中。返回布尔值,指示事件是否可拥可取消的默认动作。立即停止事件在层次中的传播,即取消进一步的事件捕获或冒泡。

在触发DOM上的某个事件时,会产生一个事件对象event。

DOM中的事件对象

兼容DOM的浏览器会将一个event对象传入到事件处理程序中。event对象包含与创建它的特定事件有关的属性和方法。除法的事件类型不一样,可用的属性方法就不一样。不过,所有的事件都会有下表列出的成员。

下面列出了 2 级 DOM 事件标准定义的属性:

bubbles: 返回布尔值,指示事件是否是起泡事件类型。

cancelable: 返回布尔值,指示事件是否可拥可取消的默认动作。

currentTarget: 返回其事件监听器触发该事件的元素。

eventPhase: 返回事件传播的当前阶段。

target: 返回触发此事件的元素(事件的目标节点)。

timeStamp: 返回事件生成的日期和时间。

type: 返回当前 Event 对象表示的事件的名称。

下面列出了 2 级 DOM 事件标准定义的方法。IE 的事件模型不支持这些方法:

initEvent(): 初始化新创建的 Event 对象的属性。

preventDefault(): 通知浏览器不要执行与事件关联的默认动作。

stopPropagation(): 不再派发事件。

thistargetcurrentTarget

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

var btn = document.querySelector("#btn");
btn.onclick=function () {
    console.log(event.currentTarget === this); //true
    console.log(event.target === this); //true
}

由于click事件的目标是btn按钮,所以这三个值是相等的。如果事件处理程序在按钮的父节点(document.body)中,那么这些值则不相同。如:

var btn = document.querySelector("#btn");
document.body.onclick=function () {
    console.log(event.currentTarget === document.body); //true
    console.log(this === document.body); //true
    console.log(event.target === btn); //true 因为btn没有注册事件处理程序,所以该click事件就冒泡到了document.body
}

在这里,this和currentTarget都是document.body,因为事件处理程序是注册到这个元素上的。但是target元素却等于按钮元素,因为它是click事件的真正目标。由于按钮并没有注册事件处理程序,结果click事件就冒泡到了document.body,在那里事件才能得到处理。

type

在需要通过一个函数处理多个事件时,可以使用type属性。如:

//获取按钮
var btn = document.querySelector("#btn");
//设置多个事件
var handler = function() {
//检测事件的类型
    switch (event.type) {
        case "click":
            console.log("i click it");
            break;
        case "mouseover":
            console.log("i enter it");
            break;
        case "mouseout":
            console.log("i leave it");
            break;
    }
}
//给响应的事件赋值
btn.onclick = handler;
btn.onmouseover = handler;
btn.onmouseout = handler;
preventDefault()

要阻止特定事件的默认行为,可以使用该方法。如:

var aTags = document.getElementsByTagName("a");
for (var i = 0; i < aTags.length; i++) {
    var currentATag = aTags[i];
    currentATag.onclick = function() {
        event.preventDefault();
    }
};

以上代码即屏蔽了网页上全部的a标签超链接功能。要注意的是,只有cancelable属性设置为true的事件,才可以使用preventDefault()来取消其默认行为。

stopPropagation()

立即停止事件在DOM层次中的传播,即取消进一步的事件捕获或冒泡。例如,直接添加到一个按钮的事件处理程序可以调用该方法,从而避免触发注册在document.body上面的事件处理程序。如:

var btn = document.getElementById("btn");
btn.onclick = function () {
    console.log("btn clicked");
    // event.stopPropagation();
};
window.onclick = function () {
    console.log("clicked");
};
//单击一下的结果:
//btn clicked
//clicked

又如:

var btn = document.getElementById("btn");
btn.onclick = function () {
    console.log("btn clicked");
    event.stopPropagation();
};
window.onclick = function () {
    console.log("clicked");
};
//单击一下的结果:
//btn clicked
eventPhase

该属性用来确定事件当前正位于事件流的哪个阶段。

如果是捕获阶段则等于1;

如果是目标对象阶段则等于2;

如果是冒泡阶段则等于3;

如:

var btn = document.getElementById("btn");

document.body.addEventListener("click", function() {
    console.log("bodyListener" + event.eventPhase);
}, true) //捕获阶段

btn.onclick = function() {
    console.log("btn" + event.eventPhase);
} //目标对象阶段,实际上属于冒泡阶段(在btn上)

document.body.onclick = function() {
    console.log("body" + event.eventPhase);
} //冒泡阶段(在body上)

又如:

var btn = document.getElementById("btn");

document.body.addEventListener("click", function() {
    console.log(event.eventPhase); //1
    console.log(event.currentTarget); //HTMLBodyElement
}, true);

btn.addEventListener("click", function() {
    console.log(event.eventPhase); //2
    console.log(event.currentTarget); //HTMLInputElement
});

document.body.addEventListener("click", function() {
    console.log(event.eventPhase); //3
    console.log(event.currentTarget); //HTMLBodyElement
});

流程大概是:

document.body 捕获阶段 --> btn 目标对象阶段 --> document.body 冒泡阶段

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78475.html

相关文章

  • JavaScript 事件——“事件流和事件处理程序”注意要点

    摘要:事件流级事件规定的事件流包括三个阶段事件捕获阶段处于目标阶段和事件冒泡阶段。事件处理程序的名字以开头,如等。如使用级方法指定的事件处理程序被认为是元素的方法。 事件流 事件流描述的是从页面中接收事件的顺序。IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流。 事件冒泡 即事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点。如: ...

    Amio 评论0 收藏0
  • JavaScript 事件——“模拟事件注意要点

    DOM中的事件模拟 三个步骤: 首先通过document.createEvent()方法创建event对象,接收一个参数,即表示要创建的事件类型的字符串: UIEvents(DOM3中的UIEvent)鼠标和键盘事件; MouseEvents(DOM3中的MouseEvent)鼠标事件; MutationEvents(DOM3中的MutationEvent)变动事件; HTMLEvents(没有...

    BakerJ 评论0 收藏0
  • JavaScript 事件——“事件类型”中“设备事件”和“触摸与手势事件注意要点

    摘要:对象不包含任何信息事件事件,该事件已被移除,应该使用事件但是事件仍然是实验性的事件,目前有部分浏览器暂时不支持。每个触摸事件的对象都提供了在鼠标事件中常见的属性。 设备事件 orientationchange事件 该事件的window.orientation属性中包含3个值:0表示肖像模式、90表示左旋转的横向模式、-90表示右旋转的横向模式。event对象不包含任何信息: wind...

    Ethan815 评论0 收藏0
  • JavaScript 事件——“事件类型”中“HTML5事件注意要点

    摘要:因为该事件属于鼠标事件,所以其事件对象中包含与光标位置有关的所有属性。事件和属性该事件在页面显示时触发,虽然这个事件的目标是,但是必须将其事件处理程序添加到。事件该事件以便在的参数列表及中号后面的所有字符串发生变化时通知开发人员。 contextmenu事件 该事件用以表示何时应该显示上下文菜单,以便开发者取消默认的上下文菜单,转而提供自定义的菜单。 因为该事件属于鼠标事件,所以其事...

    rozbo 评论0 收藏0

发表评论

0条评论

xuexiangjys

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<