首页 > 其他分享 >事件委托原理及应用(必学知识点总结)

事件委托原理及应用(必学知识点总结)

时间:2022-12-20 19:56:43浏览次数:65  
标签:知识点 console 委托 必学 Element 冒泡 addEventListener document 事件

目录

事件委托与事件对象


事件冒泡与事件捕获

事件流:用于描述页面接收事件的顺序。以下是事件流的两种不同方案:

事件冒泡:事件由最具体的元素逐级向上传递到最不具体的元素

事件捕获:事件由最不具体的元素逐级向下传递到最具体的元素

以上的两种事件流方案是截然相反的,分别由IE开发团队和Netscape开发团队提出。


添加事件处理的方法

HTML事件处理程序:利用特定HTML标签的事件属性(<input>)。代码如下:

<input type="button" value="测试" onclick="test()">
<script>
let test = () => { // 利用标签属性添加事件
    console.log('已被点击')
}
</script>

DOM0事件处理程序:利用DOM节点自带的事件属性。代码如下:

<input type="button" value="测试" id="test">
<script>
let test = document.querySelector('#test')
test.onclick = () => { // 利用onlick属性添加事件
    console.log('已被点击')
}
</script>

DOM2事件处理程序(推荐):利用DOM节点(继承自EventTarget)的添加事件监听器方法。代码如下:

<input type="button" value="测试" id="test">
<script>
let test = document.querySelector('#test')
test.addEventListener('click', ()=>{ // 利用添加事件监听器方法
    console.log('已被点击')
})
</script>

说明:在网页DOM编程中的继承关系:EventTarget <= Node <= Element。因此上面的test变量拥有addEventListener方法


DOM2 Events事件流

捕获阶段Document => Element html => Element body => Element div

冒泡阶段Element div => Element body => Element html => Document

我们首先了解EventTarget.addEventListener(type, listener, options)这个方法的一些内部参数:

type:监听事件的类型

listener:接收一个回调函数,事件触发后会执行。

options:里面有比较多的可选项参数,这里我们利用capture(布尔值:默认为false)这个参数。表示监听的事件在捕获阶段会触发listener执行。

接下来我们利用上面的方法还原上面DOM2事件流的捕获阶段与冒泡阶段,如下:

<div style="cursor: pointer">我是一个事件,请点击验证</div>
<script>
// 捕获阶段
document.addEventListener("click", () => {
    console.log("捕获阶段1:Document") // document
}, true)
document.documentElement.addEventListener("click", () => {
    console.log("捕获阶段2:Element html") // html
}, true)
document.body.addEventListener("click", () => {
    console.log("捕获阶段3:Element body") // body
}, true)
document.querySelector("div").addEventListener("click", () => {
    console.log("捕获阶段4:Element div") // div
}, true)
// 冒泡阶段
document.querySelector("div").addEventListener("click", () => {
    console.log("冒泡阶段4:Element div") // div
}, false)
document.body.addEventListener("click", () => {
    console.log("冒泡阶段5:Element body") // body
}, false)
document.documentElement.addEventListener("click", () => {
    console.log("冒泡阶段6:Element html") // html
}, false)
document.addEventListener("click", () => {
    console.log("冒泡阶段7:Document") // document
}, false)
</script>

很明显,上面的代码验证了网页的事件触发会存在DOM2事件流这一执行过程。我们点击了事件,这个事件经历了由捕获阶段再到冒泡阶段的传递。


事件对象常用属性和方法

方法属性 说明
Event.target 只读 对事件原始目标的引用。
Event.type 只读 事件的类型,不区分大小写。
event.preventDefault 取消默认事件(如果该事件可取消)。
event.stopPropagation 停止冒泡,阻止事件在 DOM 中继续冒泡。

其中Event.target最为常用,具体指代触发了相应事件的Node节点目标。


事件委托的应用(实现hover悬停变色效果)

需求:实现一个列表,鼠标进入或离开都会使列表子元素的背景颜色改变。

如果没有事件委托,我们一般实现这个需求应该这样做。如下:

<div class="list" style="height: 400px; width: 400px;">
    <ul style="list-style: none; text-align: center;">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
</div>
<script>
let list = document.querySelectorAll('.list > ul > li');
// 遍历DOM集合,给每个li添加事件
list.forEach(element => {
    element.addEventListener('mouseover', () => {
        element.style.backgroundColor = 'green';
    })
    element.addEventListener('mouseout', () => {
        element.style.backgroundColor = '';
    })
});
</script>

我们遍历每个li元素并为其添加鼠标移入与移出事件。目前总共添加了八个事件处理程序。

注意:在JavaScript中,事件处理程序的数量会影响页面的整体性能。

因此对上述实现方式我们有必要采取措施优化。利用事件委托优化如下:

// 点击li元素后会通过事件冒泡机制触发ul添加的click事件。
<div class="list" style="height: 400px; width: 400px;">
    <ul style="list-style: none; text-align: center;">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
</div>
<script>
let list = document.querySelector('.list > ul');
// 直接给ul父元素添加事件即可
list.addEventListener('mouseover', (event) => {
    if (event.target.nodeName.toLowerCase() === 'li') {
        event.target.style.backgroundColor = 'green';
    }
})
list.addEventListener('mouseout', (event) => {
    if (event.target.nodeName.toLowerCase() === 'li') {
        event.target.style.backgroundColor = '';
    }
})
</script>

我们只给list元素添加了两个事件,同样实现了需求。如果采用原始方式,我们一共给这些li元素添加了八个事件。利用事件委托的方式进行网页性能的优化,其效果不言而喻。


参考

MDN-Event

JavaScript高级程序设计(第4版)

标签:知识点,console,委托,必学,Element,冒泡,addEventListener,document,事件
From: https://www.cnblogs.com/chscript/p/16994968.html

相关文章

  • JS值和类型(必学知识点总结)
    目录值和类型八种数据类型原始值和引用值访问对象的方式相等与全等运算符typeof和instanceof深拷贝与浅拷贝值和类型八种数据类型undefined、null、boolean、number......
  • JS闭包和作用域(必学知识点总结)
    目录闭包和作用域变量声明变量和函数的声明提升作用域和作用域链执行上下文闭包垃圾回收机制闭包和作用域变量声明var声明特点在使用var声明变量时,变量会被自动添......
  • iOS监听模式系列之关于delegate(代理,委托)的学习
    其次,我简单的总结了一下自己用到的委托的作用有两个,一个是传值,一个是传事件。1.所谓传值经常用在b类要把自己的一个数据或者对象传给a类,让a类去展示或者处理。(切......
  • 根据分析查看相关知识点分析iOS 三种录制视频方式
    这篇文章讨论了关于如何配置视频捕获管线(pipeline)和最大限度地利用硬件性能的一些不同选择。这里有个使用了不同管线的样例app,可以在​​ GitHub​​查看。 第一......
  • 委托实质
    1.委托是方法指针;2.委托是一个类,当对其进行实例化的时候,要将引用方法作为它的构造方法的参数。 添加event关键字保护委托:在外的赋值都会报错。 classFileUploader......
  • 委托声明
    Action:无返回值,可以包含16种参数;Func:有返回值,也可以包含16种参数,一共17种;Predicate:表示定义一组条件并判断参数是否符合条件。 classProgram{dele......
  • 【CANN训练营第三季】昇腾AI入门课知识点整理和汇总
    【CANN训练营第三季】昇腾AI入门课知识点整理和汇总CANN提供的昇腾语言计算接口是:AscendCL。 昇腾目前支持以下AI深度学习框架:昇思MindSpore、TensorFlow、PytorchCANN包含......
  • 计算机视觉知识点汇总
    ​​ARM优化​​​​CPU硬件基础​​​​数字图像处理​​​​深度学习基础知识​​​​矩阵乘优化​​​​经典卷积网络​​​​神经网络量化与压缩​​​​模型剪枝​​......
  • 关于c语言指针还有二级指针的一些知识点理解
    二级指针:指向指针的指针;例如**p,这里p就是一个二级指针,假设p就是指向了一个指针q,q又指向了一个变量a;看下图:对二级指针进行一级解引用是指向指针的地址,在这里*ppa的值......
  • C# 中的委托和事件==》observer
    引言委托和事件在.NetFramework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,......