浅谈js中onmouseleave和onmouseout的区别

在这里插入图片描述
同步发布于我的网站 🚀

  • 背景介绍
  • 基本概念
  • 区别详解
    • 无子元素的情况
    • 有子元素的情况
  • 实际应用场景
    • 使用 onmouseleave
    • 使用 onmouseout
  • 注意事项
  • 总结

背景介绍

在前端开发中,我们经常需要为元素绑定鼠标事件,以实现各种交互效果。onmouseleaveonmouseout 是两个常用的鼠标离开事件,它们在某些情况下表现相似,但在具体的行为上有明显的区别。了解这些区别有助于我们在实际开发中选择合适的事件,提高用户体验。

基本概念

  • onmouseleave:当鼠标指针离开指定的元素时触发。这个事件不会冒泡,也就是说,当鼠标从父元素移动到子元素时,不会触发 onmouseleave 事件。
  • onmouseout:当鼠标指针离开指定的元素或其子元素时触发。这个事件会冒泡,也就是说,当鼠标从父元素移动到子元素时,会触发 onmouseout 事件。

区别详解

无子元素的情况

当元素没有子元素时,onmouseleaveonmouseout 的行为是一致的。无论鼠标指针从哪个方向离开元素,都会触发这两个事件。

<div id="no-child" style="width: 100px; height: 100px; background-color: lightblue;">
  无子元素
</div>

<script>
  document.getElementById('no-child').addEventListener('mouseleave', () => {
    console.log('mouseleave triggered');
  });

  document.getElementById('no-child').addEventListener('mouseout', () => {
    console.log('mouseout triggered');
  });
</script>
有子元素的情况

当元素有子元素时,onmouseleaveonmouseout 的行为差异明显。

  • onmouseleave:只有当鼠标指针完全离开父元素的边界时才会触发。鼠标从父元素移动到子元素时,不会触发 onmouseleave 事件。
  • onmouseout:当鼠标指针从父元素移动到子元素时,也会触发 onmouseout 事件。这是因为 onmouseout 事件会冒泡。
<div id="parent" style="width: 200px; height: 200px; background-color: lightgreen;">
  父元素
  <div id="child" style="width: 100px; height: 100px; background-color: lightcoral;">
    子元素
  </div>
</div>

<script>
  document.getElementById('parent').addEventListener('mouseleave', () => {
    console.log('mouseleave triggered');
  });

  document.getElementById('parent').addEventListener('mouseout', () => {
    console.log('mouseout triggered');
  });
</script>

实际应用场景

使用 onmouseleave
  • 工具提示:当鼠标离开某个元素时隐藏工具提示,使用 onmouseleave 可以避免在子元素上频繁触发事件。
  • 菜单栏:当鼠标离开菜单栏时关闭下拉菜单,使用 onmouseleave 可以确保只有当鼠标完全离开菜单栏时才关闭菜单。
使用 onmouseout
  • 计数器:记录鼠标离开某个元素的次数,使用 onmouseout 可以更精确地统计每次鼠标离开的情况。
  • 动态效果:在鼠标离开某个元素时触发动态效果,使用 onmouseout 可以在鼠标离开任何子元素时立即触发效果。

注意事项

  1. 事件冒泡onmouseout 事件会冒泡,可能会导致不必要的事件触发。使用 event.stopPropagation() 可以阻止事件冒泡。
  2. 性能优化:在处理大量元素时,尽量减少事件绑定的数量,可以使用事件委托来优化性能。
  3. 兼容性:虽然现代浏览器普遍支持 onmouseleaveonmouseout,但仍需注意老版本浏览器的兼容性问题。

总结

onmouseleaveonmouseout 在无子元素的情况下行为一致,但在有子元素的情况下表现不同。onmouseleave 不会冒泡,更适合处理复杂的嵌套结构;onmouseout 会冒泡,适合需要精确统计鼠标离开情况的场景。希望本文对您有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python+django自动化部署日志采用‌WebSocket前端实时展示

一、开发环境搭建和配置 # channels是一个用于在Django中实现WebSocket、HTTP/2和其他异步协议的库。 pip install channels#channels-redis是一个用于在Django Channels中使用Redis作为后台存储的库。它可以用于处理#WebSocket连接的持久化和消息传递。 pip install channels…

【小白学机器学习37】用numpy计算协方差cov(x,y) 和 皮尔逊相关系数 r(x,y)

目录 1 关于1个数组np.array&#xff08;1组数据&#xff09;如何求各种统计数据 2 关于2个数组np.array&#xff08;2组数据&#xff09;如何求数组的相关关系&#xff1f; 2.1 协方差公式和方差公式 2.2 协方差 公式 的相关说明 2.3 用np.cov(x,y,ddof0) 直接求协方差矩…

(超详细图文)PLSQL Developer 配置连接远程 Oracle 服务

1、下载配置文件 &#xff08;超详细图文详情&#xff09;Navicat 配置连接 Oracle-CSDN博客 将下载的文件解压到单独文件夹&#xff0c;如&#xff1a;D:\App\App_Java\Oracle\instantclient-basic-windows.x64-19.25.0.0.0dbru 2、配置 打开 PLSQL Developer&#xff0c;登…

学习视频超分辨率扩散模型中的空间适应和时间相干性(原文翻译)

文章目录 摘要1. Introduction2. Related Work3. Our Approach3.1. Video Upscaler3.2. Spatial Feature Adaptation Module3.3. Temporal Feature Alignment Module3.4. Video Refiner3.5. Training Strategy 4. Experiments4.1. Experimental Settings4.2. Comparisons with …

设计模式---建造者模式

建造者模式 一种创建型设计模式&#xff0c;它允许你一步一步地构建复杂对象。通过使用建造者模式&#xff0c;你可以将对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。说白点就是&#xff0c;解决了构造函数创建对象的问题。 适用于那种构造函…

AtomicIntegerFieldUpdater能否降低内存

1. 代码如下&#xff1a; import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerTest {final AtomicInteger startPosition new AtomicInteger(0);final AtomicInteger wrotePosition new Atom…

element的el-table表格标题用css自定义是否必填,用添加伪类的方式标红色*

element的el-table表格标题用css自定义是否必填添加伪类红色 * 效果图如下&#x1f447; el-table组件的html部分 css部分 /deep/.el-table__header-wrapper{.el-table__header{.has-gutter tr .el-table__cell:nth-of-type(3) .cell:before{content: *;color:red}.has-gutte…

数据库的⽤户和权限管理

数据库的⽤户和权限管理 应⽤场景⽤户查看⽤户创建⽤户语法注意事项示例 修改密码语法示例 删除⽤户语法 权限与授权给⽤户授权语法⽰例 回收权限语法⽰例 应⽤场景 数据库服务安装成功后默认有⼀个root⽤户&#xff0c;可以新建和操纵数据库服务中管理的所有数据库。在真实的…

C语言数据结构-栈和队列

C语言数据结构-栈和队列 1.栈1.1概念与结构1.2栈的实现1.2.1结构体定义1.2.2初始化1.2.3销毁1.2.4入栈1.2.5出栈1.2.6取栈顶处的元素1.2.7获取栈中有效的个数 2.队列2.1概念与结构2.2队列的实现2.2.1结构体定义2.2.2入队列2.2.3判断是否为空2.2.4队列中的有效元素个数2.2.5删除…

[CTF/网络安全] 攻防世界 upload1 解题详析

[CTF/网络安全] 攻防世界 upload1 解题详析 考察文件上传&#xff0c;具体原理及姿势不再赘述。 姿势 在txt中写入一句话木马<?php eval($_POST[qiu]);?> 回显如下&#xff1a; 查看源代码&#xff1a; Array.prototype.contains function (obj) { var i this.…

TiDB 优化器丨执行计划和 SQL 算子解读最佳实践

作者&#xff1a; TiDB社区小助手 原文来源&#xff1a; https://tidb.net/blog/5edb7933 导读 在数据库系统中&#xff0c;查询优化器是数据库管理系统的核心组成部分&#xff0c;负责将用户的 SQL 查询转化为高效的执行计划&#xff0c;因而会直接影响用户体感的性能与稳…

监控视频汇聚平台:Liveweb视频监控管理平台方案详细介绍

Liveweb国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发&#xff0c;提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能&#xff0c;包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲、…

10个Word自动化办公脚本

在日常工作和学习中&#xff0c;我们常常需要处理Word文档&#xff08;.docx&#xff09;。 Python提供了强大的库&#xff0c;如python-docx&#xff0c;使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本&#xff0c;帮助新…

ROS VSCode调试方法

VSCode 调试 Ros文档 1.编译参数设置 cd catkin_ws catkin_make -DCMAKE_BUILD_TYPEDebug2.vscode 调试插件安装 可在扩展中安装(Ctrl Shift X): 1.ROS 2.C/C 3.C Intelliense 4.Msg Language Support 5.Txt Syntax 3.导入已有或者新建ROS工作空间 3.1 导入工作…

排序学习整理(1)

1.排序的概念及运用 1.1概念 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作&#xff0c;以便更容易查找、组织或分析数据。 1.2运用 购物筛选排序 院校排名 1.3常见排序算法 2.实…

TYUT设计模式大题

对比简单工厂&#xff0c;工厂方法&#xff0c;抽象工厂模式 比较安全组合模式和透明组合模式 安全组合模式容器节点有管理子部件的方法&#xff0c;而叶子节点没有&#xff0c;防止在用户在叶子节点上调用不适当的方法&#xff0c;保证了的安全性&#xff0c;防止叶子节点暴露…

指针与引用错题汇总

int *p[3]; // 定义一个包含 3 个指向 int 的指针的数组int a 10, b 20, c 30; p[0] &a; // p[0] 指向 a p[1] &b; // p[1] 指向 b p[2] &c; // p[2] 指向 c // 访问指针所指向的值 printf("%d %d %d\n", *p[0], *p[1], *p[2]); // 输出: 10 20 30…

uniapp中scrollview配合swiper实现一个简单的tab标签页

<template><view class"tab-container"><!-- Tab 标签滚动容器 --><scroll-view scroll-x"true" class"tab-scroll" scroll-with-animation"true"><view class"tab-list"><viewv-for"…

opengl 三角形

最后效果&#xff1a; OpenGL version: 4.1 Metal 不知道为啥必须使用VAO 才行。 #include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream> #include <vector>void framebuffer_size_callback(GLFWwindow *window, int width, int heigh…

Qml-TabBar类使用

Qml-TabBar类使用 TabBar的概述 TabBar继承于Container 由TabButton进行填充&#xff0c;可以与提供currentIndex属性的任何容器或布局控件一起使用&#xff0c;如StackLayout 或 SwipeView&#xff1b;contentHeight : real:TabBar的内容高度&#xff0c;用于计算标签栏的隐…