浏览器知识点整理(二)事件机制

前端实习八股整理-浏览器原理 服务器端收到后,确认加密的方法,发送一个随机数和自己的数字证书。3.DNS解析:(获取域名的IP地址)首先判断本地服务器缓存是否有该域名的IP,然后向本地DNS服务器发起请求,缓存里也没有的话向根域名服务器发起请求,获得顶级域名服务器的地址后再发起请求,获得权威域名服务器后再发起请求得到IP,本地DNS服务器把IP返回给用户。,但是会带上 If-Modifed-Since,If-None-Match,这就意味着服务器会对文件检查新鲜度,返回结果可能是 304,也有可能是 200。 阅读详情

认识Dom

(Document Object Model),W3C 制定的标准接口规范,是一种处理 HTML 和 XML 文件的标准 API。它把文档作为一个树形结构,树的每个结点表示了一个 HTML 标签或标签内的文本项.

DOM 树结构精确地描述了 HTML 文档中标签间的相互关联性。将 HTML 或 XML 文档转化为 DOM 树的过程称为解析(parse)

可以试着在浏览器把一个 DOM 节点输出来看一下:

let body = document.body;
for (var key in obj) {
    console.log(`属性:${key},值:${body[key]}`)
}

这个节点有很多属性,其中 onclick 的默认值是 null,当把 onclick 赋予一个函数,就可以作为一个事件函数存在。我们可以通过给对应的属性绑定事件来修改、添加和删除DOM 树的结点和内容。

image.png

DOM 元素的查找

通过 JavaScript 查找 DOM 元素有以下几种方法:

  • 通过 id 查找 DOM 元素
  • 通过标签名查找 DOM 元素
  • 通过类名查找 DOM 元素
  • 通过 CSS 选择器查找 DOM 元素
// 通过 id 查找 DOM 元素
let id = document.getElementById("id"); // 查找 id="id" 的元素
// 通过标签名查找 DOM 元素
let p = document.getElementsByTagName("p"); // 查找所有 <p> 元素
// 通过类名查找 DOM 元素
let cls = document.getElementsByClassName("cls"); // 返回包含 class="cls" 的所有元素的列表
// 通过 CSS 选择器查找 DOM 元素
let pCls = document.querySelectorAll("p.cls"); // 返回 class="cls" 的所有 <p> 元素列表

事件注册

我们一般使用 addEventListener 来注册事件,它接受三个参数:

  • 处理的事件名称,如点击事件 click;
  • 事件处理程序,即要绑定的函数体;
  • 指定是在事件冒泡还是事件捕获阶段处理参数,可以是布尔值,也可以是对象
    • true 则作为捕获事件处理;
    • false 则作为冒泡事件处理(默认)。

第三个参数是对象时,可以使用以下几个属性:

  • capture:布尔值,和第三个参数作为布尔值时作用一样
  • once:布尔值,值为 true 表示该回调只会调用一次,调用后会移除监听
  • passive:布尔值,表示永远不会调用 preventDefault

一般来说,我们可以通过使用 stopPropagation 来阻止事件的进一步传播,即阻止事件冒泡。

// stopPropagation() 可以阻止捕获和冒泡
e.stopPropagation(); 
// stopImmediatePropagation() 也可以阻止捕获和冒泡,但主要作用是阻止监听同一事件的其他事件监听器被调用
e.stopImmediatePropagation(); 

事件触发三阶段

  • 事件捕获阶段:window 往事件触发处传播,遇到注册的捕获事件会触发
  • 处于目标阶段:传播到事件触发处时触发注册的事件
  • 事件冒泡阶段:从事件触发处往 window 传播,遇到注册的冒泡事件会触发

首先发生的是事件捕获为截获事件提供机会,然后的是实际的目标接收事件,最后一个阶段是事件冒泡阶段,可以在这个阶段对事件做出响应。 如图:

image.png

假设在 DOM 结构里面有 text 的这样一个标签,给这个标签绑定了一个点击事件,那么在点击这个标签的时候是怎么执行事件的呢?

  • 首先是事件捕获阶段,会通过 window、document、body、div、text 这样的顺序一直往下捕获事件。
  • 然后是处于目标阶段,到 text 标签处触发绑定的点击事件。
  • 最后是事件冒泡阶段,事件是在冒泡阶段做出响应的。冒泡阶段通过 text 、div、body、document、window 这样的顺序往上冒泡,假如在 div 或者 body 上面也绑定了对应的 onclick 事件,那么会按顺序触发响应。

事件触发一般来说会按照上面的顺序进行,但是也会有特例,如果给一个 body 中的子节点同时注册冒泡和捕获事件,事件触发会按照注册的顺序执行。

感谢@dayTimeAffect的指出,以上说法不够严谨,在火狐和360浏览器是按照注册的顺序执行,但是在谷歌上面是按照先捕获后冒泡的顺序执行的(测试了火狐、360、谷歌、Edge四款浏览器),也就是说这个注册的顺序不同在不同的浏览器会有不同的表现,要注意区分。所以建议注册按照先捕获再冒泡的顺序来。

// 经测试,在火狐(Firefox 81.0)、360(版本12.2)浏览器是按照注册顺序执行的
// 即先打印“冒泡事件”再打印“捕获事件”

// 在谷歌(Chrome 90.0)、Edge(和谷歌同内核)浏览器是按照先捕获再冒泡的顺序执行的,
// 即先打印“捕获事件”再打印“冒泡事件”
var el = document.getElementById('el');
// 第三个参数为 false 即为冒泡事件
el.addEventListener('click', event => {
  console.log('冒泡事件')
}, false);
// 第三个参数为 true 即为捕获事件
el.addEventListener('click', event => {
  console.log('捕获事件')
}, true)

事件代理

事件代理是指利用事件冒泡,只指定一个事件处理程序来管理某一类型的所有事件。

如果一个节点中的子节点是动态生成的,那么子节点需要注册事件的话可以注册在父节点上。

<ul id="proxy">
  <li>主页</li>
  <li>文章</li>
  <li>公告</li>
  <li>简介</li>
</ul>

事件代理:

let proxy = document.querySelector('#proxy')
proxy.addEventListener('click', (event) => {
  let target = event.target; // 当前点击的元素
  if (target.nodeName.toLowerCase() == 'li') {
    console.log('click:' + target.innerHTML);
  }
})

这种方式相较于直接给目标注册事件来说,有以下优点:

  • 可以减少内存占用,减少事件注册
  • 不需要给子节点注销事件

总结

  • DOM 是一个树形结构,树的每个结点表示了一个 HTML 标签或标签内的文本项。
  • 可以通过 addEventListener 来注册事件。
  • 事件触发有三个阶段,分别是事件捕获阶段、处于目标阶段、事件冒泡阶段。
  • 通过利用事件冒泡来实现事件代理,可以提高性能。

 

 

建议收藏 | Web前端面试知识点目录整理 金九银十,又到了一年一度的跳槽季,相信大家都在准备自己的面试笔记,我也针对自己工作中所掌握或了解的一些东西做了一个目录总结,方便自己复习。 这里暂且放一个我的面试知识点目录,大家有兴趣可以自己根据目录去扩展。基本功考察 一、关于Html 1、html语义化标签的理解、结构化的理解;能否写出简洁的html结构;SEO优化。 2、h5中新增的属性,如自定义属性data、类名className等;新增... 阅读详情

相关推荐

前端性能优化(二)——浏览器缓存机制

浏览器缓存就是浏览器根据 url 第一次访问网站之后,将网站的 html、css、js、图片等文件复制一份保留到浏览器中,当你二次访问这个 url 的网站时,如果网站没有明确表示有更新时,浏览器直接在缓存中查找内容,不会再次请求网页内容,只有网页明确表示有更新时,浏览器才会向服务器发起网路请求,再次下载网页。对于网站运营者或者访问网页的用户,带宽就代表着 money ,过多的消耗带宽,我们服务器配置就得升级,使用浏览器缓存之后,就会减少网络流量,降低运营成本。含有完整的过期时间控制头信息,并在有效期内。

afsdfrsg的博客 1518

JavaScript中的事件流(冒泡和捕获)

本文主要介绍JavaScript中事件流,其中主要介绍事件冒泡和事件捕获。

modao的博客 198

4D毫米波雷达点云可视化实战:从CANFD原始数据到Matplotlib三维动态图

本文详细介绍了4D毫米波雷达点云可视化实战,从CANFD原始数据解析到Matplotlib三维动态图实现的全流程。通过解析CANFD数据帧结构、点云数据编码原理,并结合Python实现CANFD通信接口,帮助开发者掌握4D雷达数据处理与优化技巧,最终实现高性能的3D点云动态可视化。

u9v0w的博客 568

chrome浏览器触发元素事件

$("#btnFastBuy").trigger("click") $('#btnFastBuy').click()

friendan的专栏 1454

Mybatis Provider注解实现批量插入

需求 借助mybatis 的provider实现一个比较通用的,批量插入数据接口。 Mapper接口 第一参数为需要批量插入的数据,第二个参数为对应实体类的class public interface BaseDao<T> { @InsertProvider(type = BaseProvider.class, method = "batchInsert") int batchInsert(@Param("lists") List<T&gt

小楼夜听雨的博客 2417

UNSW-NB15数据集:网络流量分析与恶意攻击检测实战指南

本文提供了UNSW-NB15数据集在网络流量分析与恶意攻击检测领域的实战指南。详细介绍了该数据集的构成、核心特征解析、特征工程处理、机器学习模型训练与评估方法,并探讨了模型部署及持续优化的挑战与思路,帮助读者构建高效的网络攻击检测系统。

weixin_29193359的博客 258

JavaScript-5-事件触发机制、三种触发方式

事件触发机制 事件源【就是网页中的标签】 button 事件 onclick 单击 ondblclick 双击 行为【js】 show() 触发方式一:标签内 οnclick=“func()” <body ondblclick="show()"> <button type="button" onclick="change()" id="btn">点击</...

qq_38328762的博客 2356

在 SAP 里,想让“同一笔业务”在多个账套(平行分类账)中生成不同编号的会计凭证,标准做法就是

摘要:SAP系统中实现同一业务在不同分类账生成独立凭证号的方法是为每个分类账配置独立的凭证类型-编号范围映射。通过FBN1/OBA7等事务码为各分类账分配专属编号段,系统过账时会按分类账自动取号,确保凭证号互不冲突。该方案适用于S/4HANA和ECC系统,支持标准过账(F-02)或分类账专属过账(FB01L)两种模式,最终实现"一业务多账套,各自独立编号"的目标。

金牌架构师 549

谷歌浏览器控制台调试器的基本使用方法,常用方法必备,手把手教学

谷歌浏览器控制台调试器的基本使用方法,常用方法必备,手把手教学

海贼王某人的博客 1万+

在zcu102开发板上使用PetaLinux运行Qt程序

请注意,上述步骤只是一个概述,并且可能需要根据特定的开发环境和要求进行适当的调整。如果你是一个初学者或者对于这些领域不太熟悉,建议在尝试之前阅读相关的文档和教程,或者寻求专业人士的帮助。在"Projects"菜单中,选择"Build & Run"选项,并在"Build"步骤中选择正确的工具链。注意:如果Qt程序依赖于其他库文件,需要将这些库文件一起复制到PetaLinux工程的根文件系统目录中,并在Qt程序中正确地配置库文件路径。如果一切顺利,PetaLinux系统将启动,并自动运行Qt程序。

UhxzCombined的博客 698

HyperLynx仿真(一)LineSim简单介绍

可以选择设置信号线与信号线之间默认的距离和信号线与同平面的平面之间的距离,这些设置根据工程师项目上经常使用的情况而设置,也可以选择不设置,在每次仿真时根据需要再对每一个仿真单独设置。仿真属性的设置对话框包含一般设置、 显示颜色设置、LineSim 设置、BoardSim 设置、 层叠默认设置、焊盘类型设置、仿真示波器默认设置、电路仿真器默认设置、电源完整性设置及高级设置。第一次使用HyperLynx软件时需要设置仿真相关环境,包括仿真软件的基本设置、模型库路径设置、仿真控制器控制、单位等。...

小幽余生不加糖 8949

火狐浏览器获取event

由于各种浏览器对js文件的解析不同,加上各种浏览器的内核不一样,以及内核版本也不一样,所以获取event的方式也不一样。 使用原始的方式获取event是 这样的: document.body.onclick=function(e){ e=e||window.event; }; 实际上大家会想为什么要重新赋值,这是因为event是瞬间有效,所以要进行保存。 这中方式可以实现,但是要保证传

5933

《Zephyr OS 入门与实战》第1章:Zephyr OS 架构与物联网定位

【代码】《Zephyr OS 入门与实战》第1章:Zephyr OS 架构与物联网定位。

2301_79143213的博客 1270

聊聊浏览器的事件循环机制

最近阅读了一些与浏览器事件循环相关的资料,并整理输出了本篇文章,希望能帮助大家搞懂浏览器的事件循环。后续(会很久,因为我懒)会继续补充node中的事件循环机制。文章将从三个部分介绍事件循...

狗子的博客 607

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JS事件机制相关知识点整理

事件机制 1.事件三要素 事件源 事件发生的源头,指DOM对象 事件处理函数 匿名函数,只有在事件发生之后才会执行,由浏览器调用,在调用的时候会产生一个事件对象传递给事件处理函数 事件对象 记录了事件的详细信息 2.事件绑定 1.onXxx属性 通用型 dom.onclick = function(event){} 2.addEventListener(eventType,handler,useCapture) eventType 事件类型 handler 事件处理函数

all_outD的博客 295

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

浏览器端的事件循环机制

只是进行了整理。 参考文档 浏览器与Node的事件循环(Event Loop)有何区别? 事件循环机制EventLoop JavaScript:event loop详解 eventLoop 相关的概念 堆(Heap) 堆表示一大块非结构化的内存区域,对象被存放在堆中. 栈(stack) 栈在javascript中又称执行栈,调用栈,是一种后进先出的数组结构,调用栈(或执行栈call-stack)...

weixin_34025151的博客 312

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

react 事件机制的理解-01

背景写本文也算是实现19年的一个 flag,研究一个知识点并且把自己的理解整理成文分享出来。react 事件机制一共有4篇吧,也没有太长,其实可以合成一篇文章,只是想把文...

zz_jesse的博客 484

JavaScript DOM、事件机制与 BOM 核心知识点整理

利用事件冒泡,只给父元素注册一次事件,就可以管理所有子元素,减少事件注册次数,提升性能,新增的子元素也可以直接触发事件。永久存储,关闭浏览器数据仍然保留,需要手动删除才会消失,同一浏览器多窗口数据共享,以键值对存储,只能存字符串。可以拿到浏览器、操作系统版本字符串,用来做设备判断,区分电脑端、手机端,实现网页适配。写代码的时候不用每次都写选择器,可以直接通过元素关系找到目标元素。页面多个轮播插件,class 类名做好区分,避免冲突。实例化时间对象,可以获取年、月、日、时、分、秒。

wyhlyh913913的博客 223

前端之事件机制!!!

几乎每次面试都会本问到浏览器的事件机制,今天来整理一下!本文包含进程与线程、事件循环、宏任务与微任务的梳理,文字偏多,请稍微多点耐心,是经过本人学习了一些资料后的一点小总结,如果有说明不准确甚至错误的地方,欢迎路过的大神们指正! 首先要知道的以下几个概念: 进程:进程是CPU资源的最小分配单位 线程:线程是CPU调度的最小单位 线程依赖于进程 一个进程至少有一个线程 而咱们的浏览器就是多进程的,浏览器之所以可以工作,是因为CPU给它分配了资源。就拿Chrome来说。它的每个页签都是一个独立的进程,验

wwwqiaoling的博客 889

6、 垃圾回收 & 浏览器事件循环

分代式机制,垃圾回收,内存管理,事件循环运行机制

yolo 1190

javaScript事件机制兼容【整理】

【添加事件机制】 addEventListener 和 attachEvent [W3C] addEventListener('click' , function(){alert('Hello World')} ,false ) //W3C规范添加事件(IE8及以上不兼容); 第一个参数为事件类型 ,第二个为事件程序 ,第三个 false为事件冒泡,true为事件捕获 ...

dllpwaa719081的博客 125

对JavaScript事件循环机制的理解

前言: 这次主要整理一下自己对 Js事件循环机制,同步,异步任务,宏任务,微任务的理解,大概率暂时还有些偏差或者错误。如果有,十分欢迎各位纠正我的错误! 一、事件循环和任务队列产生的原因: 首先,JS是单线程,这样设计也是具有合理性的,试想如果一边进行dom的删除,另一边又进行dom的添加,浏览器该如何处理? 引用: “单线程即任务是串行的,后一个任务需要等待前一个任务的执行,这就可能出现长时间的等待。但由于类似ajax网络请求、setTimeout时间延迟、DOM事件的用户交互等,这些任务并不消

OceanH的博客 9317

事件机制 / Event Loop

这一次,彻底弄懂 JavaScript 执行机制 最近一直在补事件机制,也就是常说的Javascript 执行机制,翻阅了大量书籍,以及博客,想静下心来好好的整理归纳。 定义 event loop翻译出来就是事件循环,可以理解为实现异步的一种方式,我们来看看event loop在HTML Standard中的定义章节: 第一句话: 为了协调事件,用户交互,脚本,渲染,网络等,用户代理必须使用本节所述的event loop。 事件,用户交互,脚本,渲染,网络这些都是我们所熟悉的东西,他们都是由event

李dayday 1411

Node事件循环和浏览器事件循环

前端必备知识:node.js的事件循环以及浏览器中的事件循环

分享记录前端知识 1099

DOM事件全整理之从DOM事件级别,DOM事件流到事件委托

  JS编程中常常接触到DOM事件,虽然只是事件而已,但是处于历史原因,它是足够复杂的,也足够强大的,由于自己之前总是对DOM事件的一些概念模糊不清,所以这里来做一下总结啦 DOM级别与DOM事件   我们常听到DOM0级事件,DOM1级事件,DOM2级事件处理,其实这里的DOM0,DOM1,DOM2和DOM级别是密切相关的。   最开始的时候,IE4和Netscape等浏览器各自实现自己的一套D...

weixin_33928137的博客 455
上一篇: 浏览器知识点整理(1) 开篇
下一篇: 浏览器知识点整理(三)存储
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光机上敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值