从编程小白到全栈开发:了解事件机制

简介: 在上一篇文章中,我们初步了解了在HTML中处理用户操作的知识,最主要的,就是如何对指定的DOM元素添加事件监听以获取用户操作,并进行后续的处理。这里所使用到的这种基于事件的处理方式,其本质是一种消息传递机制,我们称之为事件机制。

在上一篇文章中,我们初步了解了在HTML中处理用户操作的知识,最主要的,就是如何对指定的DOM元素添加事件监听以获取用户操作,并进行后续的处理。这里所使用到的这种基于事件的处理方式,其本质是一种消息传递机制,我们称之为事件机制。

简介

在事件机制中,有3样最重要的东西:

  • 事件生产者
  • 事件对象
  • 事件消费者

事件生产者可以产生一系列的事件对象,然后事件对象携带着必要的信息,传递给事件消费者。

可以看出来,这是一种单向的消息传递模型,事件消息总是从生产者传递到消费者。那既然事件机制传递消息是单向的,那么如果两个对象间要通过事件机制实现双向通信,是否可能呢?这太简单了,把它们既作为生产者又作为消费者就行了:

这个理解起来应该不难吧?

接着呢,一个事件生产者所产生的事件,其实可以有多个消费者:

反之,一个事件消费者,也可以消费由多个生产者产生的事件:

好吧,我知道上面所描述的这些什么生产者啊消费者的概念,对于一个初学者来说,听起来还是有点迷糊,不太容易理解这套机制到底是怎样工作的。那我们来整一个通俗易懂的例子吧:

我家小区门口有闸机,需要刷卡才能进入。如果有陌生来访者,保安大哥就出现了,询问来访者去几栋、几零几室、户主是谁等信息,答对了才登记并放行。

这个例子中,有着和我们上面讲的概念一一对应的3个重要对象:

  • 事件生产者:陌生来访者
  • 事件:无卡访问
  • 事件消费者:保安大哥

保安大哥的职责,就是时刻监视着是否有陌生来访者产生了“无卡访问”事件,一旦产生,保安大哥就会立刻启动他应对这一事件的处理流程:询问并核对信息,答对后登记并放行。

这样一讲,是不是好理解多了?

事件冒泡

在讲事件冒泡这个有点抽象的概念之前,我还是想以保安大哥来举个例子。

虽然有陌生无卡访问者的来访,但是有些陌生无卡来访者的情况比较特殊,而保安大哥的权限还是比较小的,自己处理不了,这个时候,就需要通知他的上级----保安队长来处理,如果保安队长能处理,则他处理掉就完事儿了(或处理后同时上报给他的上级);如果他也仍然处理不了,就需要再通知他的上级----小区物业主管来处理......

这种将事件层层向上级通报的机制,就被形象的称作事件冒泡。

好,那么这个概念对应到我们的HTML DOM编程中来,具体会是个什么样子呢?我们先前已经明白了一个HTML文件对应一棵DOM树,DOM节点之间也有父子层级关系,所以当在一个子节点上触发一个事件,该事件也会随着DOM树的层级路径,由子节点向父节点进行层层传递,请看以下示例:

<div class="outer" onclick="outerClickHandler(event)">
    <div class="inner" onclick="innerClickHandler(event)">
        <button id="mybtn" onclick="buttonClickHandler(event)">点我试试</button>
    </div>
</div>

<script>
    function buttonClickHandler(event) {
        console.log('button clicked')
    }

    function innerClickHandler(event) {
        console.log('inner clicked')
    }

    function outerClickHandler(event) {
        console.log('outer clicked')
    }
</script>

以上代码中,我们创建了一个<button>按钮,这个按钮拥有一个class为inner的<div>父节点,还有一个class为outer的<div>祖父节点。这三个DOM元素上,都分别设置了onclick事件监听函数。我们来尝试点击以下<button>按钮,看看会有什么情况发生:

button clicked
inner clicked
outer clicked

我们的开发者工具控制台上,打印出了这样的三行结果。这个是我们预料之中的事情,因为事件冒泡在这里起了作用:

  • 当我们用鼠标在<button>按钮上点击的时候,一个click事件产生了,这个事件首先被<button>接收到并被事先设置好的click事件处理函数buttonClickHandler进行处理;
  • 接着,这个事件通过冒泡,上升传递到父节点inner上,inner节点接受到这个事件后,同样启动了它的click事件处理函数innerClickHandler进行处理;
  • 最后,事件继续上升,到达outer节点并被其click处理函数outerClickHandler进行处理。

那么这个click事件到这里就结束了,不再冒泡了么?不,它会继续冒泡,在它之上,至少还有<body><html>节点呢,一棵DOM树的根节点是<html>,事件冒泡到这里才会结束。

讲到这里,一定有反应快的朋友会问,有什么办法可以提前让冒泡结束?因为冒泡有时候也会带来副作用啊,会触发父节点上本来不希望触发的监听函数。这个当然是有办法来解决的!我们只要在不希望事件继续冒泡的时候,调用event对象的stopPropagation函数,即可使事件终止冒泡了。我们把上面的示例代码稍微改一下:

function buttonClickHandler(event) {
    console.log('button clicked')
    event.stopPropagation()
}

改动后,尝试点击<button>按钮,你会发现,打印结果中,只会出现一行结果了,inner和outer不再会接受到通过冒泡上来的click事件,所以它们的click事件处理函数不再会因为点击<button>按钮而被触发了:

button clicked

总结

事件机制是一种简单有效的消息传递机制,它不仅在前端的HTML DOM编程中被广泛使用,在服务端的JavaScript开发中也拥有极高的使用价值。合理的使用好事件机制,可以让你的代码架构变得更优雅。

多动手,勤思考。
欢迎关注一斤代码的系列课程《从编程小白到全栈开发》

目录
相关文章
|
7月前
|
小程序 前端开发 API
小程序全栈开发中的前后端分离实践
【4月更文挑战第12天】本文探讨了小程序全栈开发中的前后端分离实践,强调其能提升开发效率、代码可维护性和可扩展性。文中详细阐述了接口设计、数据交互、前端渲染、后端处理以及团队协作的重要性,并指出统一的API接口、使用前端框架和后端服务器是关键。通过这种模式,开发者能更高效地掌握小程序开发,打造高质量应用。
165 0
|
7月前
|
前端开发 JavaScript 数据可视化
2022年中高级前端需要学习的25种前端技术栈
2022年中高级前端需要学习的25种前端技术栈
158 0
2022年中高级前端需要学习的25种前端技术栈
|
负载均衡 网络协议 Dubbo
卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架
什么是RPC? 远程服务调用 官方:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想 通俗一点:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 市面上常见的rpc框架:dobbo,springCloud,gRPC...
|
机器学习/深度学习 人工智能 前端开发
前端已死?全栈当立?取法于中,仅得其下。
开篇明义,前端已死?根本就是扯淡。前端技术精微渊深,驳杂宽广,除了基础的 HTML、CSS 和 JavaScript 技术外,前端技术还涉及到许多其他相关技术和工具,比如前端框架、UI 库、自动化构建工具、代码管理工具等等。这些技术并没有死,反而生态圈愈发健壮,但为什么前端已死的论调甚嚣尘上?
前端已死?全栈当立?取法于中,仅得其下。
|
JavaScript 小程序 前端开发
小程序开发-第二章第五节小程序中的Promise-全栈工程师之路-中级篇
小程序开发-第二章第五节小程序中的Promise-全栈工程师之路-中级篇
178 0
小程序开发-第二章第五节小程序中的Promise-全栈工程师之路-中级篇
|
XML 前端开发 小程序
后端工程师入门安卓开发笔记(一)
我是daxia,一个做了8年多的后端开发,对前端一直仅限于Web页面开发,对移动端开发和小程序开发基本零基础; 有时候想做一些有意思的东西出来,用网页实现对手机支持现在是不理想,忙里偷闲学了学安卓,把一些我觉得是重点内容做一个笔记,也希望笔记对其他人有所帮助。
167 0
后端工程师入门安卓开发笔记(一)
|
前端开发 搜索推荐 安全
程序人生 - “全栈”这个概念坑害了多少开发者
程序人生 - “全栈”这个概念坑害了多少开发者
236 0
程序人生 - “全栈”这个概念坑害了多少开发者
|
设计模式 XML 人工智能
太牛了!Android开发高级工程师实战手写框架
导语 又到了金九银十的面试季,自己也不得不参与到这场战役中来,其实是从去年底就开始看,Android的好机会确实不太多,但也还好,3年+的android开发经历还是有一些面试机会的,不过确实不像几年前门槛那么低了,总的体会就是小的创业公司比较注重你的项目经历是否和自己的贴合,直接能过来独当一面。 大厂除了看中项目经历外,还比较注重你知识面的广度,是广度、深度和解决方案等多方面的考察,平时够工作要好好积累临时刷题只聊点皮毛估计是过不了关的。下面就总结一些大厂面试遇到必定会问的知识点,我把网络上讲解的最好的视频给大家整理出来了,各种风格的都有。
太牛了!Android开发高级工程师实战手写框架
|
前端开发 JavaScript HTML5
前端知识框架
一直都是很懒的人,懒得去写笔记,写文章,感觉应该是要有一些沉淀了。计划在简书上写一些技术相关的文章,先整理下前端相关的一些知识点吧,争取每周至少有一篇文章的产出 1.
1472 0
|
Web App开发 JavaScript 前端开发
java后台有必要学习前端知识吗 以及主流框架的各自主要功能
最近又巩固了些html,css,javaScript和jQuery的知识 回头看看之前写的html网页,真的是不忍直视 在这贴一下gitHub上我丑丑的界面 我的小说网站 为了包装一下连我自己都忍受不了的前端界面,于是...
3570 0