前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试官:哪些浏览器事件不会冒泡?

面试官:哪些浏览器事件不会冒泡?

原创
作者头像
茶无味的一天
发布于 2022-10-07 10:53:13
发布于 2022-10-07 10:53:13
1.9K00
代码可运行
举报
文章被收录于专栏:品味前端品味前端
运行总次数:0
代码可运行

你知道哪些浏览器事件不会冒泡吗?

回答这个问题之前,我们首先要具备DOM事件流捕获与冒泡的知识,这里只讲JS中如何设置这两种事件监听,例如对body注册点击事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.body.addEventListener('click', e => {
    console.log('触发捕获阶段');
}, true)

document.body.addEventListener('click', e => {
    console.log('触发冒泡阶段');
}, false)

具体区别在第三个参数,w3c规定了true表示捕获阶段触发,false表示冒泡阶段触发,默认false

在JS中通常利用冒泡来进行事件委托,但并不是所有事件都会冒泡。下面我们看看哪些事件是不能冒泡的,又有哪些相关应用场景。

scroll、focus、blur、resize

假设有如下一段html结构

代码语言:html
AI代码解释
复制
<ul id="container">
    <ul id="outer">
        <div id="inner"></div>
    </ul>
</ul>

我们只需设置overflow: scroll;,当内层长度超出外层时元素就会出现滚动条,此时应有两个滚动事件,我们分别为 containerouter 添加 scroll 监听:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.getElementById('container').addEventListener('scroll',
    function (e) {
        console.log('container scroll')
    },
);

document.getElementById('outer').addEventListener('scroll',
    function (e) {
        console.log('outer scroll')
    },
);

此时滚动内层,我们看到并不会触发外层的事件监听:

2022-08-26 10.43.48.gif
2022-08-26 10.43.48.gif

而如果设置成捕获监听呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.getElementById('container').addEventListener('scroll',
    function (e) {
        console.log('container scroll')
    },
    true
);

document.getElementById('outer').addEventListener('scroll',
    function (e) {
        console.log('outer scroll')
    },
    true
);
2022-08-26 10.46.21.gif
2022-08-26 10.46.21.gif

通过这个例子我们可以得出结论,scroll无法触发冒泡,而捕获事件可以正常触发,所以scroll必须在捕获阶段才能完成事件委托。

注意:有个类似滚动事件的叫滚轮事件wheel是可以触发冒泡的( MDN - wheel_event ),我们甚至可以通过额外注册 wheel 监听事件并阻止其冒泡从而让 scroll 事件失效,不过只要滚动条还在 scroll 还是可以不通过滚轮来控制滚动的,所以还记得前面我们怎么让元素滚动起来的吗?就是设置了 overflow: scroll;,所以控制滚动应该使用 CSS 而不是 JS 事件。

focusblurresize 这几个事件和 scroll 道理是一样的,都不会触发冒泡,所以事件也都不能通过阻止冒泡取消,它们理解起来比较直观,就不多做阐述了。

mouseenter、mouseleave

mouseover & mouseenter 均为鼠标移动到元素上的事件,两者区别在于后者不会冒泡。

代码语言:html
AI代码解释
复制
<ul id="outer">
    <li id="inner"></li>
</ul>

假设给 ul 设置了 mouseover 事件,在鼠标经过 ul 时因为 ul 中还有 li 元素,鼠标每经过一个 li 元素就会冒泡到 ul 上的 mouseover,造成多次触发:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.getElementById('outer').addEventListener('mouseover',
    function() {console.log('鼠标进入了外层');}
);
document.getElementById('inner').addEventListener('mouseover',
    function() {console.log('鼠标进入了内层');}
);
2022-08-26 11.07.19.gif
2022-08-26 11.07.19.gif

这时就需要在内层额外阻止冒泡(e.stopPropagation())才能解决多次触发的问题,不过鼠标从 li 移出到 ul 上还是触发了 ul 的监听事件,其实这并不符合常理,因为此时鼠标还是在 ul 内的。相比之下直接使用 mouseenter 就不会出现以上这些问题了。

2022-08-26 11.06.17.gif
2022-08-26 11.06.17.gif

同样的,mouseout会冒泡,而mouseleave则不会冒泡。

Media

由视频、图像、音频等媒体触发的相关事件,都不会触发冒泡,和 scroll 事件同理,如果需要进行事件委托都必须在捕获阶段去处理。

结尾

现代JS框架均对事件体系做了相关处理,很多时候开发者可能会忽略事件委托的一些机制,了解其中细节与不同事件之间的差异,可以有效避免实际开发中出现的坑。

以上就是文章的全部内容,希望对你有所帮助!如果觉得文章写的不错,可以点赞收藏,也欢迎关注,我会持续更新更多前端有用的知识与实用技巧,我是茶无味de一天,希望与你共同成长~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tomcat请求走私(CVE-2024-21733)
本文属于OneTS安全团队成员98的原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。
OneTS安全团队
2025/02/07
2240
Tomcat请求走私(CVE-2024-21733)
修改PHP cURL TLS指纹以绕过Cloudflare「Just a moment」验证
以下代码使用了自己的一个cURL请求封装库,liesauer/simple-http-client,这里不过多介绍,原生cURL也是一样设置Header和cURL参数的。
LiesAuer
2024/02/28
1.4K0
修改PHP cURL TLS指纹以绕过Cloudflare「Just a moment」验证
一日一技:Requests被网站识别怎么办?
现在有很多网站,已经能够通过JA3或者其他指纹信息,来识别你的请求是不是Requests发起的。这种情况下,你无论怎么改Headers还是代理,都没有任何意义。
青南
2023/10/22
6550
一日一技:Requests被网站识别怎么办?
Springboot 修改Tomcat版本 修复Tomcat CVE-2024-21733 漏洞
Apache Tomcat是一个流行的开源Web服务器和Java Servlet容器。Coyote是Tomcat的连接器组件,是Tomcat服务器提供的供客户端访问的外部接口,客户端通过Coyote与服务器建立链接、发送请求并且接收响应。
拉丁解牛说技术
2024/08/15
1K0
手动实现一个简单的 HTTP 请求
本文我们通过 Socket,写一个 HTTP 协议,直观的感受一下上篇文章中的请求和响应。
shengjk1
2025/05/16
530
手动实现一个简单的 HTTP 请求
Java代码审计之JFinalCMS
看到星球发布了一个作业,由于考试没及时弄。所以就自己随便看看了,这套系统确实漏洞很多,可以说是靶场。。。危险操作几乎都没有做过滤,而且很久没更新了
亿人安全
2024/07/12
2720
Java代码审计之JFinalCMS
Python网络爬虫headers的字典总是出现换行符 这个要怎么处理呀?
前几天在Python钻石交流群【大写一个Y】问了一个Python网络爬虫的问题,问题如下:大佬们 问个问题,我写了一个能把源请求头和cookies转换成字典格式的函数,运行之后cookies是成功了的,但是hesders的字典总是出现换行符 这个要怎么处理呀 研究2天了。
Python进阶者
2024/06/24
1170
Python网络爬虫headers的字典总是出现换行符 这个要怎么处理呀?
CVE-2024-45507分析学习(Poc,EXP)
该项目是一个开源的电子商务平台,提供创建基于最新的J2EE/XML规范和技术标准。各模块之间的功能比较松散,用户可以根据自己的需求进行拆卸整合,非常灵活。
网e渗透安全部
2024/11/21
2410
CVE-2024-45507分析学习(Poc,EXP)
新赚吧每日打卡-Python源码
应粉需求,让帮写个简单的新赚吧每日打卡程序,就用Python写个简单易懂的,一行一行往下看应该就看得懂,也就70行,核心的就2行。
偶尔敲代码
2023/04/28
4770
新赚吧每日打卡-Python源码
用python开发的小红书笔记搜索采集软件
对于自媒体从业者来说,采集小红书热门对标作品的意义在于帮助用户了解当前流行的内容和趋势,可以帮助用户更好地把握市场需求,同时也可以启发用户创作出更具吸引力和创新性的内容。通过观察热门对标作品,用户可以学习到一些成功的案例和经验,从而提高自己的内容质量和影响力,还可以帮助用户更好地定位自己的目标受众和市场定位,有助于提升自己在小红书等平台上的曝光和影响力。
马哥小迷弟132
2024/06/24
4011
用python开发的小红书笔记搜索采集软件
AI网络爬虫:批量爬取豆瓣图书搜索结果
你是一个Python编程专家,要完成一个爬虫Python脚本编写的任务,具体步骤如下:
AIGC部落
2024/06/24
1890
AI网络爬虫:批量爬取豆瓣图书搜索结果
爆了!用Python开发的小红书笔记搜索采集神器,含笔记正文、转评赞藏等
在当今自媒体时代,内容为王。小红书作为一个热门的社交媒体平台,拥有大量的优质内容。然而,如何高效、快速地获取这些内容,成为了许多自媒体人、数据分析师和市场营销人员面临的挑战。现在,有了这款2024版Python爬虫软件,你可以轻松实现小红书笔记的批量采集,包括正文内容,让你的工作事半功倍!
马哥小迷弟132
2024/06/25
8792
爆了!用Python开发的小红书笔记搜索采集神器,含笔记正文、转评赞藏等
流量回放工具
在评估某个服务可用性时,一种常见方式是采用一些压测工具(如ab/hey/jmeter/siege/wrk/locust等)压测某几个核心接口,一般看达到某个TPS/QPS时,CPU/内存等资源的水位;或者固定资源的阈值,看最高能达到的TPS/QPS。
fliter
2023/10/24
6280
流量回放工具
【GUI软件】小红书按关键词采集笔记详情,支持多个关键词,含笔记正文、转评赞藏等
开发界面软件的目的:方便不懂编程代码的小白用户使用,无需安装python,无需改代码,双击打开即用!
马哥python说
2024/03/30
5830
【GUI软件】小红书按关键词采集笔记详情,支持多个关键词,含笔记正文、转评赞藏等
AI网络爬虫:批量爬取AI导航网站Futurepedia数据
Futurepedia致力于使AI技术对各行各业的专业人士更加可理解和实用,提供全面的AI网站和工具目录、易于遵循的指南、每周新闻通讯和信息丰富的YouTube频道,简化AI在专业实践中的整合。如何把Futurepedia上的全部AI网站数据爬取下来呢?
AIGC部落
2024/06/24
1170
AI网络爬虫:批量爬取AI导航网站Futurepedia数据
kkfileview任意文件读取漏洞复现(批量化)
基本命令: nuclei.exe -l 网址文件.txt -t POC.yaml
samRsa
2024/03/10
2.2K10
kkfileview任意文件读取漏洞复现(批量化)
抖音 用户id转uid
https://download.csdn.net/download/qq_38154948/87769887
拉灯的小手
2023/05/10
1.8K1
Python爬虫实战入门:爬取360模拟翻译(仅实验)
点击网络刷新之后,在点击Fetch/XHR,随意输入一个单词,点击翻译会发现出现一个数据包,这个数据包就是我们所需要的。
爱喝兽奶的熊孩子
2024/04/10
2210
Python爬虫实战入门:爬取360模拟翻译(仅实验)
【xhs】笔记更新监控,x-s、x-t、a1、web_session
环境环境win10、macPython3.9node.js v4.16x-s、x-t、a1、web_session图片获取博主详细信息 def get_user_info(self, user_id): """ 个人信息接口 user_id: 用户id """ headers = { "Host": "edith.xiaohongshu.com", "sec-ch-ua": "\"Chromium\";v=\"104\", \" Not
拉灯的小手
2023/05/23
1K0
【漏洞复现】泛微-云桥e-Bridge EC8.0 文件上传
泛微-云桥是一款基于云计算技术的企业级协作与办公平台,提供文档管理、流程审批、项目协作等功能,旨在提升企业内部沟通效率与工作协同能力。 /wxclient/app/recruit/resume/addResume 接口存在任意文件上传漏洞
没事就要多学习
2024/08/11
8150
【漏洞复现】泛微-云桥e-Bridge EC8.0 文件上传
推荐阅读
相关推荐
Tomcat请求走私(CVE-2024-21733)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验