【前端|Javascript第4篇】详解Javascript的事件模型:小白也能轻松搞懂!

news2024/11/27 18:50:43

在这里插入图片描述
前言

在当今数字时代,前端技术正日益成为塑造用户体验的关键。而其中一个不可或缺的核心概念就是JavaScript的事件模型。或许你是刚踏入前端领域的小白,或者是希望深入了解事件模型的开发者,不论你的经验如何,本篇博客都将带你揭开事件模型的神秘面纱。


🚀 作者简介:程序员小豪,全栈工程师,热爱编程,曾就职于蔚来、腾讯,现就职于某互联网大厂,技术栈:Vue、React、Python、Java
🎈 本文收录于小豪的前端系列专栏,后续还会更新前端入门以及前端面试的一些相关文章,手把手带你从零学习前端到面试找工作,并如果有想进入前端领域工作的同学,这个前端专栏会对你有所帮助,欢迎关注起来呀
🌼 本人也会持续的去关注AIGC以及人工智能领域的一些动向并总结到博客中,大家感兴趣的可以关注一下我的人工智能专栏
🌊 云原生的入门学习系列,大家有兴趣的可以看一看

1.事件与事件流

javascript中的事件,可以理解就是在HTML文档或者浏览器中发生的一种交互操作,使得网页具备互动性, 常见的有加载事件、鼠标事件、自定义事件等

由于DOM是一个树结构,如果在父子节点绑定事件时候,当触发子节点的时候,就存在一个顺序问题,这就涉及到了事件流的概念

事件流都会经历三个阶段:

  • 事件捕获阶段(capture phase)
  • 处于目标阶段(target phase)
  • 事件冒泡阶段(bubbling phase)
    在这里插入图片描述
    事件冒泡是一种从下往上的传播方式,由最具体的元素(触发节点)然后逐渐向上传播到最不具体的那个节点,也就是DOM中最高层的父节点
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>事件冒泡</title>
    </head>
    <body>
        <button id="clickMe">按钮</button>
    </body>
</html>

然后,我们给button和它的父元素,加入点击事件

var button = document.getElementById('clickMe');

button.onclick = function() {
  console.log('1.Button');
};
document.body.onclick = function() {
  console.log('2.body');
};
document.onclick = function() {
  console.log('3.document');
};
window.onclick = function() {
  console.log('4.window');
};

最后得到的输出如下:
在这里插入图片描述
点击事件首先在button元素上发生,然后逐级向上传播

事件捕获与事件冒泡相反,事件最开始由不太具体的节点最早接受事件, 而最具体的节点(触发节点)最后接受事件

2. 事件模型

事件模型可以分为三种:

  • 原始事件模型(DOM0级)
  • 标准事件模型(DOM2级)
  • IE事件模型(基本不用)

原始事件模型

原始事件模型(DOM0级事件模型)是事件绑定的最简单方式,适用于那些想要快速添加事件监听的场景。这种模型有两种绑定方式:直接在HTML代码中绑定和通过JS代码绑定。让我们来看看它们的特点和应用。

HTML中直接绑定事件

<input type="button" onclick="fun()">

通过JS代码绑定事件

var btn = document.getElementById('btn');
btn.onclick = fun;

原始事件模型的特点:

  • 绑定速度快: 原始事件模型绑定速度非常快,但也可能因为绑定过于迅速,导致事件无法在页面完全加载时执行。
  • 仅支持冒泡: 原始事件模型只支持事件冒泡,不支持捕获。
  • 同类型事件只能绑定一次: 如果尝试为同一个元素绑定多个同类型事件,后绑定的事件会覆盖之前的事件。
<input type="button" id="btn" onclick="fun1()">

var btn = document.getElementById('btn');
btn.onclick = fun2;

对于上面的情况,尝试为同一个按钮绑定两个点击事件时,后绑定的事件会覆盖之前的事件。

要删除DOM0级事件处理程序,只需将对应的事件属性置为null即可。

btn.onclick = null;

标准事件模型

标准事件模型(DOM2级事件模型)是更加强大和灵活的事件处理方式。在标准事件模型中,一个事件共有三个阶段:捕获阶段、处理阶段和冒泡阶段。让我们深入了解标准事件模型的特点和使用方法。

事件捕获阶段、处理阶段和冒泡阶段

  • 事件捕获阶段: 事件从document向下传播到目标元素,检查经过的节点是否绑定了事件监听函数,如果有则执行。
  • 事件处理阶段: 事件到达目标元素,触发目标元素的监听函数。
  • 事件冒泡阶段: 事件从目标元素冒泡回document,依次检查经过的节点是否绑定了事件监听函数,如果有则执行。

在标准事件模型中,事件绑定和移除监听函数的方式如下:

addEventListener(eventType, handler, useCapture);
removeEventListener(eventType, handler, useCapture);

标准事件模型的特点:

  • 支持多个事件处理器: 在一个DOM元素上可以绑定多个事件处理器,它们不会相互冲突。
btn.addEventListener('click', showMessage1, false);
btn.addEventListener('click', showMessage2, false);
btn.addEventListener('click', showMessage3, false);
  • 执行时机: useCapture参数设置为true时,在捕获阶段执行监听函数;设置为false时,在冒泡阶段执行监听函数。

通过以下例子,我们可以更好地理解事件处理阶段的执行时机:

<div id='div'>
    <p id='p'>
        <span id='span'>点击我!</span>
    </p >
</div>

设置点击事件:

var div = document.getElementById('div');
var p = document.getElementById('p');

function onClickFn (event) {
    var tagName = event.currentTarget.tagName;
    var phase = event.eventPhase;
    console.log(tagName, phase);
}

div.addEventListener('click', onClickFn, false);
p.addEventListener('click', onClickFn, false);

点击"点击我!"后,输出如下:

P 3
DIV 3

我们可以看到,pdiv都在冒泡阶段响应了事件,由于冒泡的特性,内部的p先于外层的div作出了响应。

如果我们将useCapture参数改为true

div.addEventListener('click', onClickFn, true);
p.addEventListener('click', onClickFn, true);

输出如下:

DIV 1
P 1

两者在捕获阶段响应事件,因此div会先于p作出响应。

IE事件模型

IE事件模型共有两个过程:

  • 事件处理阶段:事件到达目标元素, 触发目标元素的监听函数。
  • 事件冒泡阶段:事件从目标元素冒泡到document, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行

事件绑定监听函数的方式如下:

attachEvent(eventType, handler)

事件移除监听函数的方式如下:

detachEvent(eventType, handler)

举个例子:

var btn = document.getElementById('.btn');
btn.attachEvent(‘onclick’, showMessage);
btn.detachEvent(‘onclick’, showMessage);

总结

在本篇博客中,我们一起探索了JavaScript事件模型的四大概念:事件与事件流、原始事件模型、标准事件模型、IE事件模型。JavaScript是一门非常强大且广泛应用的编程语言。掌握了这些基本的语法和概念,你已经具备了入门JavaScript编程的基础。未来,你将能够创建更加交互性的网页,实现更多惊艳的动态效果,甚至搭建出属于自己的Web应用。但这只是一个开始,还有许多更深入的主题等待你去探索。
后续我们这个前端专栏还会讲述作用域、事件模型、内置对象、垃圾回收、js算法技巧、Vue入门实战、React实战、前端面试题等等文章,如果您感兴趣的话,欢迎点赞三连并关注我以及我的前端专栏,我们下期文章再见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/875484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iTOP-STM32MP157开发板Linux Misc驱动编写实验程序(运行测试)

启动 STM32MP157 开发板&#xff0c;我们通过 nfs 挂载共享文件目录&#xff0c;我们进入到共享目录&#xff0c;加载驱动模块如 图所示&#xff1a; insmod misc.ko 驱动加载成功后&#xff0c;输入以下命令&#xff0c;查看注册的设备节点是否存在&#xff0c;如下图所示&a…

NSI45030AT1G LED驱动器方案为汽车外部及内部照明恒流稳流器(CCR)方案

关于线性恒流调节器&#xff08;CCR&#xff09;&#xff1a;是一种用于控制电流的稳定输出。它通常由一个功率晶体管和一个参考电流源组成。CCR的工作原理是通过不断调节功率晶体管的导通时间来维持输出电流的恒定。当输出电流超过设定值时&#xff0c;CCR会减少功率晶体管的导…

激战本地生活:抖音美团打得火热,小红书也来“搅局”?怎么开通小红书本地生活服务商呢?

小红书也来本地生活赛道“横插一脚”了。 上线面向本地生活的交易合作服务平台、推出面向达人的探店内容扶持计划、“0押金、0佣金、流量扶持” 激励更多商家入场......在已经硝烟弥漫的申请cmxyci本地生活赛道&#xff0c;小红书开始放大招。 据了解&#xff0c;小红书是在今年…

sift-1M数据集的读取及ES插入数据

sift是检查ann近邻召回率的标准数据集,ann可以选择faiss,milvus等库或者方法;sift数据分为query和base,以及label(groundtruth)数据。本文采用sift-1M进行解读,且看如下: 1、sift-1m数据集 官方链接地址:Evaluation of Approximate nearest neighbors: large datase…

嵌入式微控制器架构为AI演进

如果您将IoT与AI相结合会得到什么&#xff1f;AIoT是简单的答案&#xff0c;但由于神经网络技术的进步&#xff0c;使机器学习不再局限于超级计算机的世界&#xff0c;因此您还将获得嵌入式微控制器的巨大新应用领域。如今&#xff0c;智能手机应用处理器可以&#xff08;并且确…

UML 类图的画法

1.类图的画法 类 整体是个矩形&#xff0c;第一层类名&#xff0c;第二层属性&#xff0c;第三层方法。 &#xff1a;public- : private# : protected空格: 默认的default 对应的类写法。 public class Student {public String name;public Integer age;protected I…

kubernetes集群(k8s)之安装部署Calico 网络

目录 安装部署Calico 网络 &#xff08;一&#xff09;环境准备 &#xff08;二&#xff09;部署docker环境 &#xff08;三&#xff09;部署kubernetes集群 &#xff08;四&#xff09;部署Calico网络插件 安装部署Calico 网络 &#xff08;一&#xff09;环境准备 IP地…

混淆矩阵、F1score详解

混淆矩阵&#xff08;Confusion Matrix&#xff09; TP&#xff08;True Positives)&#xff1a;真正例&#xff0c;预测为正例而且实际上也是正例&#xff1b; FP&#xff08;False Positives)&#xff1a;假正例&#xff0c;预测为正例然而实际上却是负例&#xff1b; FN&…

九五从零开始的运维之路(其三十一)

文章目录 前言一、什么是计划任务1.一次性任务2.周期性任务&#xff08;一&#xff09;在/etc/crontab文件中写入计划任务&#xff08;二&#xff09;使用crontab命令编辑计划任务 二、用户提权1.什么是用户提权2.su与su -3.sudo提权 总结 前言 本篇将简述的内容&#xff1a;L…

1+X 综合布线系统安装与维护职业技能等级证书实训室建设方案

一、1X 综合布线系统安装与维护职业技能等级证书建设方案系统概述 "1X 综合布线系统安装与维护职业技能等级证书系统"是中国职业教育改革的一项举措&#xff0c;旨在为综合布线系统安装与维护领域的从业人员提供职业技能评价和认证的体系。 该证书系统采用了"…

浪涌保护器中SPD防雷模块的主要应用方案

浪涌保护器&#xff08;Surge Protective Device&#xff0c;SPD&#xff09;是一种用于限制瞬态过电压和导引泄放电涌电流的非线性防护器件&#xff0c;用以保护耐压水平低的电器或电子系统免遭雷击及雷击电磁脉冲或操作过电压的损害。SPD可以将过电压泄放到地线或限制过电压到…

如何高效地进行事件降噪

在事件处理方面&#xff0c;一般我们会遇到两个痛点&#xff0c;一个是告警事件太多&#xff0c;被过度打扰&#xff0c;另一个是重要告警疏漏&#xff0c;无法闭环处理。 告警太多的常见原因 最常见的原因&#xff0c;是告警规则设置得不合理。比如很多规则触发了告警之后&a…

5.内置构造函数

在JavaScript中最主要的数据类型有6种: 1.基本数据类型: 字符串、数值、布尔、undefined、 null 2.引用类型&#xff1a;对象 但是&#xff0c;我们会发现有些特殊情况: //普通字符串 const str andy console.1og(str.length) // 4其实字符串、数值、布尔、等基本类型也都有…

【MySQL--->表的操作】

文章目录 [TOC](文章目录) 一、创建表二、查看表三、修改表四、删除表drop table 表名; ![在这里插入图片描述](https://img-blog.csdnimg.cn/15227b8335364d41bd01b4b4dd83ee55.png) 一、创建表 语句格式:create table 表名(列名 类型,…)字符集 校验规则 存储引擎;字符集和校…

一盏茶的时间,带你轻松上手Pinia

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4da; 前言 &#x1f4d8; 创建 Pinia &#x1f4d8; Option Store &#x1f4d8; Pinia 提供多种选项配…

JavaEE——网络编程(UDP套接字编程)

文章目录 一、简单理解Socket 套接字二、UDP 数据报套接字编程三、编写简单的 UDP 版本服务器客户端1. 编写 UDP 版本的回显服务器回显服务器整体代码罗列 2. 编写 UDP 版本的回显客户端回显客户端整体代码罗列 四、总结与代码运行结果解释 一、简单理解Socket 套接字 概念&am…

实践-传统深度学习

简介与安装 2 训练自己的数据集整体流程3 数据加载与预处理4 搭建网络模型5 学习率对结果的影响6 Drop-out操作7 权重初始化方法对比8 初始化标准差对结果的影响9 正则化对结果的影响10 加载模型进行测试 TensorFlow&#xff1a;每一步都需要自己做。 Keras&#xff1a;做起来更…

Redis_缓存2_缓存删除和淘汰策略

14.5 缓存数据的删除和替换 14.5.1 过期数据 可以使用ttl查看key的状态。已过期的数据&#xff0c;redis并未马上删除。优先去执行读写数据操作&#xff0c;删除操作延后执行。 14.5.2 删除策略 redis中每一个value对应一个内存地址&#xff0c;在expires&#xff0c;一个内…

关于海外应用ASO优化的一些热知识

应用程序市场挤满了人&#xff0c;我们不能依靠运气来帮助应用程序在全球应用市场上被发现&#xff0c;其中大约有 500 万个应用程序争夺相同的客户。ASO是应用营销活动的重要组成部分&#xff0c;其目的是提高应用程序在Google Play Store和Apple App Store中的可见度。 1、为…

怎么截取视频制成GIF?教你简单的GIF制作方法

怎么将一段视频截取片段制作成GIF动图呢&#xff1f;很多小伙伴在看到一段视频中的搞笑片段&#xff0c;想要将其制作成GIF表情包来在社交平台上发送、交流&#xff0c;那样会非常有趣&#xff0c;GIF动图能够很好的表达我们的情绪&#xff0c;因此该怎么制作呢&#xff1f;教大…