题外话

在考察事件基础的时候,会经常被问及 clickmousedownmouseup 它们三者执行的先后顺序是怎样的?

如果平时没太注意,这细节可能就会忽略,毕竟很少会在同一个元素上面同时绑定这三个事件~~

直接上示例:

<div class="c">测试点击事件</div>

<script>
(() => {
const c = document.querySelector('.c')
c.addEventListener('click', () => {
console.log('click')
})
c.addEventListener('mousedown', () => {
console.log('mousedown')
})
c.addEventListener('mouseup', () => {
console.log('mouseup')
})
})()
</script>

实际控制台输出:

而且 click 事件鼠标在元素上点击之后,再按住鼠标移开元素,此时并不会触发 click 事件,仅 mousedown 事件被触发了。

这里就有一个比较有意思的操作了,如果开发中想要用户无法取消事件,那就直接用 mousedown 事件吧~~

事件 enter/leave 和 over/out 区别

这两组事件都是鼠标进入元素和离开元素时触发,用文字描述的区别就是 over/out 这一组事件会冒泡,而 enter/leave 这组事件不会冒泡。

如果绑定事件没有子元素,其实两者没有任何区别,比如:

<style>
.c {
border: 1px solid #000;
padding: 8px;
}
</style> <div class="c">前端路引--事件测试</div> <script>
(() => {
const c = document.querySelector('.c')
c.addEventListener('mouseover', () => {
console.log('mouseover')
})
c.addEventListener('mouseout', () => {
console.log('mouseout')
})
c.addEventListener('mouseenter', () => {
console.log('mouseenter')
})
c.addEventListener('mouseleave', () => {
console.log('mouseleave')
})
})()
</script>

效果:

可以明显看到,这两组事件触发都是一样的,在鼠标移入和移除的时候都触发了。

但这里有一个细节:enter/leave 这组事件永远都是在 over/out 后面触发,不论代码的先后顺序,也不论是否是事件捕获!!

存在子元素时

上面事件看不出区别来,别急,来一个包含子元素的例子:

<style>
.bd {
border: 1px solid #000;
padding: 8px;
}
</style> <div id="container1" class="bd">
外层
<div class="bd">
内层
<div class="bd">
最内层
<div class="bd">
按钮
</div>
</div>
</div>
</div> <script>
(() => {
const c = document.querySelector('#container1')
c.addEventListener('mouseover', () => {
console.log('mouseover')
})
c.addEventListener('mouseout', () => {
console.log('mouseout')
})
c.addEventListener('mouseenter', () => {
console.log('mouseenter')
})
c.addEventListener('mouseleave', () => {
console.log('mouseleave')
})
})()
</script>

效果:

可以看到 over/out 这组事件,在鼠标每次进入子元素时候,都会触发父元素的 over/out 事件;而 enter/leave 这组事件只会在进入/离开父元素时候触发一次。

前面说了,over/out 是冒泡事件,那能不能通过 event.stopPropagation() 来阻止冒泡?

把所有事件都添加上 阻止传播 试试:

(() => {
const c = document.querySelector('#container1')
c.addEventListener('mouseover', (event) => {
event.stopPropagation()
console.log('mouseover')
})
c.addEventListener('mouseout', (event) => {
event.stopPropagation()
console.log('mouseout')
})
c.addEventListener('mouseenter', (event) => {
event.stopPropagation()
console.log('mouseenter')
})
c.addEventListener('mouseleave', (event) => {
event.stopPropagation()
console.log('mouseleave')
})
document.querySelectorAll('.bd').forEach((item) => {
item.addEventListener('mouseover', (event) => {
event.stopPropagation()
})
item.addEventListener('mouseout', (event) => {
event.stopPropagation()
})
})
})()

效果:

可以看到虽然 最内层 里面的元素移动不会触发顶层事件,但在 内层外层 来回移动的时候,还是会触发事件冒泡。

可以理解为每个子元素都有物理空间,over/out 这组事件在父元素和子元素的物理空间来回移动的时候,还是会触发 over/out 事件。

写在最后

开发中需要根据需求选择合适的事件,一般情况 enter/leave 这组事件使用率相对而言较高一些。

Web前端入门第 76 问:JavaScript 鼠标事件(mouse) enter/leave 和 over/out 区别的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  3. web前端(13)—— 了解JavaScript,JavaScript的引入方式

    从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...

  4. WEB前端工程师整理的原生JavaScript经典百例

    一.原生JavaScript实现字符串长度截取 二.原生JavaScript获取域名主机 三.原生JavaScript转义html标签 四.原生JavaScript时间日期格式替换 Date.prot ...

  5. Web前端基础怎么学? JavaScript、html、css知识架构图

    以前开发者只要掌握 HTML.CSS.JavaScript 三驾马车就能胜任一份前端的工作了.而现在除了普通的编码以外,还要考虑如何性能优化,如何跨端.跨平台实现功能,尤其是 AI.5G 技术的来临, ...

  6. Android零基础入门第76节:Activity数据保存和横竖屏切换

    在前面几期学习了Activity的创建.配置.启动和停止,还学了Activity的生命周期,本期一起来学习Activity有关的更多事儿. 一.数据保存 通过上一期 LogCat 窗口打印的日志可以看 ...

  7. web前端学习之HTML CSS/javascript之一

    前端编码之路之坎坷,web前端应该一直是个战场吧,各种浏览器的不兼容,各种小细节的修改,要往一个好的产品经理方向走,实在是难,昨天听了一位十年经验的产品经理讲座,最重要的恐怕就是协调资源的能力,而协调 ...

  8. JavaScript 鼠标事件

    鼠标事件是Web开发中最常用的一类事件. DOM3级事件中定义了9个鼠标事件,分别如下: click.dbclick.mousedown.mouseenter.mouseleave.mousemove ...

  9. 小试牛刀JavaScript鼠标事件

    鼠标事件练习1 当鼠标点击网页某个单元格的时候,其他的单元格颜色不变,只有被点击的单元格颜色发生变化 <style type="text/css"> *{ margin ...

  10. Web前端开发规范【HTML/JavaScript/CSS】

    前言 这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范,其中包含了 HTML, JavaScript 和 CSS/SCSS 这几个部分.我们知道,当一个团队开始指定并实行编码规 ...

随机推荐

  1. 远程连接到轻量应用服务器PG数据库

    不建议这样做,但是开发时方便需要.进入正题. PG是不支持远程连接的,需要连接直接该参数. 在其data目录里,有二个配置文件: pg_hba.conf:配置数据库的访问权限 postgresql.c ...

  2. 支付宝当面付和微信付款码支付封装DLL

    项目中需要为客户对接支付宝的当面付和微信付款码支付.场景就是软件中生成金额订单,然后扫顾客的微信付款码或者支付宝的付款码完成收款.为此封装了此DLL,可以用在其他项目中,其他人也可以直接拿来用. 最主 ...

  3. zk基础—5.Curator的使用与剖析

    大纲 1.基于Curator进行基本的zk数据操作 2.基于Curator实现集群元数据管理 3.基于Curator实现HA主备自动切换 4.基于Curator实现Leader选举 5.基于Curat ...

  4. 阿里云域名+Github配置Pages

    最近用Flutter开发了一个新的应用,准备上架AppStore的时候遇到一个问题,就是通过什么途经能把自己的隐私html和官网html通过链接都显示出来呢? 经过一番的查找和研究后就准备用Githu ...

  5. java基础之接口、多态

    一.接口:是Java语言中一种引用类型[组数.类也是引用类型],内部主要就是封装了方法, 包括(抽象方法.默认方法.静态方法.私有方法) 格式: public interface 接口名称 { // ...

  6. 🎀文件对比工具--BeyondCompare

    简介 Beyond Compare 是一款功能强大的文件和文件夹比较工具,由Scooter Software开发.它可以帮助用户轻松地比较文件和文件夹的差异,并且可以合并变化.同步文件以及备份重要数据 ...

  7. kettle介绍-Step之Script Values/Mod(JavaScript 代码) 一

    Script Values/Mod JavaScript 代码介绍 JavaScript 代码步骤提供了一个用户界面,用户可以编写 JavaScript 代码到脚本区,脚本区域中的每一行代码都会执行一 ...

  8. 17.8K star!完美超越宝塔的产品,像呼吸一样部署应用,这款开源神器绝了!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Dokploy是一个强大的开源平台,旨在简化全栈 Web 应用的开发和部署.通过其直观的界面 ...

  9. eclipse中那些难以分辨的符号、Java中的Long和mysql中的bigint

    这是一个字符串 从左到右依次是数字"0", 大写字母"O",小写字母"o",数字"1",小写字母"l(艾欧)& ...

  10. 关于网传微信聊天记录提取工具"留痕"盗取个人信息的分析

    今天早上看到一篇文章,是关于一个微信聊天记录提取工具泄露个人信息的内容,于是我就好奇,看了一下作者的 github,然后也是自己小小的分析了一下 1.官方地址 Github: https://gith ...