javascript中的事件机制

本文详细介绍了JavaScript中的事件机制,包括事件流的概念、不同类型的事件绑定方法及其区别、事件对象的属性与方法、事件委托的原理及优缺点。并对比了Chrome与IE浏览器中事件机制的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.事件

javascript与html页面之间的交互是通过事件实现的。事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。事件是可以被 JavaScript 侦测到的行为,比如我们要实现下面的效果就需要绑定相应的事件:
  • 鼠标点击
  • 页面或图像载入
  • 鼠标悬浮于页面的某个热点之上
  • 在表单中选取输入框
  • 确认表单
  • 键盘按键
下面主要从事件流,事件绑定,事件对象以及事件委托四个方面来总结一下js中的事件机制。

二.事件流

事件流描述的是从页面中接受事件的顺序,事件发生时会在元素节点与根节点之间按照特定的顺序传播,路径所经过的所有节点都会收到该事件。
下面这个图清晰地展示了事件流的过程:

这里写图片描述

其中1~5描述的是事件捕获过程,5~6描述的是目标过程,6~10描述的是冒泡过程。
捕获阶段:事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件。首先window会捕获到事件,之后会是document,body,之后body中的dom会一层一层捕获到目标元素。即从dom树的根到叶子。
目标阶段:真正的触发元素会发生两次事件,一次捕获,一次冒泡。
冒泡阶段:事件开始时由最具体的元素接受,然后逐级向上传播到较为不具体的节点。由具体元素一层一层冒泡到window,类似于捕获阶段的逆过程。即从dom树的叶子到根。

三.事件绑定

事件绑定(用click事件举例)有这么几种方法:
1.嵌入绑定形式
<div onclick="clickEvent()"></div>
2.js中利用dom直接绑定
element.onclick = function(){
    ...
}
3.利用addEventListener绑定
element.addEventListener('click',function(){
    ...
},false);
元素直接绑定和addEventListener的区别:
1.onclick只有冒泡过程,而addEventListener既可以有冒泡过程也可以有捕获的过程。addEventListener接受三个参数,第一个为事件,第二个为执行的函数,第三个为选择冒泡还是捕获的过程(默认为false冒泡,true为捕获)。
2.重复绑定。比如直接绑定两个onclick事件,第一个事件将会被第二个覆盖。而addEventListener可以重复绑定相同事件,并且都可以得到执行。
另:不管是直接绑定还是addEventListener都有一个好处是里面的this都指向当前对象。

四.事件对象

在触发dom上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件有关的信息。包括导致事件的元素,事件的类型以及其他与特定事件相关的信息。常见的事件对象成员有以下几个:
属性/方法类型读/写说明
bubblesBoolean只读表示事件是否冒泡
cancelableBoolean只读表明是否可以取消事件的默认行为
currentTargetElement只读其事件处理程序当前正在处理事件的那个元素
defaultPreventedBoolean只读为true表示已经调用了preventDefault
detailInteger只读与事件相关的细节信息
eventPhaseInteger只读调用事件处理程序的阶段:1表示捕获阶段,2表示“处于目标”,3表示冒泡阶段
preventDefault()Function只读取消事件的默认行为。如果cancelable是true,则可以使用这个方法
stopImmediatePropagationFunction只读取消事件的默认行为。如果cancelable是true,则可以使用这个方法
stopPropagation()Function只读取消事件的进一步捕获或冒泡。如果bubbles为true,则可以使用这个方法
targetElement只读事件的目标
trustedBoolean只读为true表示事件是浏览器生成的。为false表示事件是由开发人员通过javascript创建的
typeString只读被触发的事件类型
viewAbstractView只读与事件关联的抽象视图。等同于发生时间的window对象

五.事件委托

利用冒泡的原理,把事件加到父级上,触发执行效果。当网页中需要触发事件的对象比较多的时候,为了避免内存泄漏,我们把事件委托到其父对象上,借助事件冒泡机制,可以将事件委托到body,document等元素上,这样等于一个页面就只有一个事件触发,避免直接把事件添加到多个对象上。
举一个小例子:
点击li弹出对应的innerHTML的值,就减少了给每一个li绑定事件的操作。
<body>
    <ul>
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
        <li>555</li>
    </ul>
    <script type="text/javascript">
    document.body.onclick = function (event) {
        if(event.target.tagName === 'LI'){
            alert(event.target.innerHTML);
        }

    };
    </script>
</body>
优点:
  • 可以大量节省内存占用,减少事件注册。
  • 可以方便地动态添加和修改元素,不需要因为元素的改动而修改事件绑定。
  • JavaScript和DOM节点之间的关联变少了,这样也就减少了因循环引用而带来的内存泄漏发生的概率。
缺点:
  • 不是所有的事件都能冒泡的(blur、focus、load和unload)。

六.chrome与ie事件机制的对比

1.事件流
IE:目标过程->冒泡过程
chrome:捕获过程->目标过程->冒泡过程
2.绑定事件
IE: attachEvent()
chrome:addEventListener()
3.事件对象
IE:event.srcElement
chrome:event.target
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值