JavaScript将参数传递给事件处理程序

本篇文件我们将实现导航栏中,选中时候,会将您选中的进行高亮显示;
● 首先我们来获取我们想要的HTML元素

const nav = document.querySelector('.nav');

● 接着我们来写选中的高亮显示

nav.addEventListener('mouseover', function (e) {   //鼠标进入时,会触发mouseoverif (e.target.classList.contains('.nav__link')) {  //确保我们移动式导航连接上面的元素const link = e.target;  //将我们移动的这个元素保存到一个变量中const siblings = link.closest('.nav').querySelectorAll('.nav__link');   //选择nav父元素附近的所有的nav__link元素const logo = link.closest('.nav').querySelector('img'); //选择nav父元素附近的所有的图片元素siblings.forEach(el => {  //通过forEach来判断将其他的链接元素透明度降低if (el !== link) el.style.opacity = 0.5;});logo.style.opacity = 0.5;  //将logo的透明度降低}
});

在这里插入图片描述

● 现在可以实现,但是有一个问题,当我们移出的时候,并不会恢复,所以我们还需要一个移除的事件

//菜单渐变动画
nav.addEventListener('mouseover', function (e) {if (e.target.classList.contains('nav__link')) {const link = e.target;const siblings = link.closest('.nav').querySelectorAll('.nav__link');const logo = link.closest('.nav').querySelector('img');siblings.forEach(el => {if (el !== link) el.style.opacity = 0.5;});logo.style.opacity = 0.5;}
});nav.addEventListener('mouseout', function (e) {if (e.target.classList.contains('nav__link')) {const link = e.target;const siblings = link.closest('.nav').querySelectorAll('.nav__link');const logo = link.closest('.nav').querySelector('img');siblings.forEach(el => {if (el !== link) el.style.opacity = 1;});logo.style.opacity = 1;}
});

这样就可以实现当我们移入到某个元素的时候,有个高亮动画,但是,这样肯定是让代码的臃肿,我们需要去重构这段代码,一般呢,我们会选择通过函数的方式来重构这段代码,例如

const handleHover = function (e, opacity) {if (e.target.classList.contains('nav__link')) {const link = e.target;const siblings = link.closest('.nav').querySelectorAll('.nav__link');const logo = link.closest('.nav').querySelector('img');siblings.forEach(el => {if (el !== link) el.style.opacity = opacity;});logo.style.opacity = opacity;}
};nav.addEventListener('mouseover', function (e) {handleHover(e, 0.5);
});nav.addEventListener('mouseout', function (e) {handleHover(e, 1);
});

● 这样也是可以实现的,但是这个点击事件的匿名回调函数还是不够优雅,我们可以通过bind方法来去除这个重复的匿名回调函数

const handleHover = function (e) {if (e.target.classList.contains('nav__link')) {const link = e.target;const siblings = link.closest('.nav').querySelectorAll('.nav__link');const logo = link.closest('.nav').querySelector('img');siblings.forEach(el => {if (el !== link) el.style.opacity = this;});logo.style.opacity = this;}
};nav.addEventListener('mouseover', handleHover.bind(0.5));nav.addEventListener('mouseout', handleHover.bind(1));

这里可能很多小伙伴不是看的很明白,这里来解释一下:

  1. Function.prototype.bind 方法:
    ○ bind 方法创建一个新的函数,在调用时将 this 关键字设置为提供的值。
    ○ 在这个例子中,handleHover.bind(0.5) 创建了一个新函数,当这个新函数被调用时,this 的值会被绑定为 0.5。
    ○ 类似地,handleHover.bind(1) 创建了另一个新函数,将 this 的值绑定为 1。
  2. this 的使用:
    ○ 在 handleHover 函数内部,this 指向了通过 bind 方法传入的值(即 0.5 或 1)。
    ○ this 被用作不透明度值(opacity),根据事件的类型(mouseover 或 mouseout)来设置兄弟元素和 logo 的不透明度。
  3. 事件处理:
    ○ 通过 addEventListener 方法给 nav 元素添加两个事件监听器:一个用于 mouseover 事件,另一个用于 mouseout 事件。
    ○ 每个事件监听器都绑定了 handleHover 函数,并且通过 bind 方法传入了不同的 this 值(0.5 和 1)。
    通过使用 bind 方法将事件处理函数的 this 关键字绑定到特定的值(0.5 或 1),以简化代码并避免显式传递参数。这种方法使代码更具可读性和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python系统教程01

Python 是一门解释性语言,相对更简单、易学,它可以用于解决数学问题、获取与分 析数据、爬虫爬取网络数据、实现复制数学算法等等。 1、print()函数: print()书写时注意所有的符号都是英文符号。print()输出内容时,若要输出字符…

安卓实现微信聊天气泡

一搜没一个能用的&#xff0c;我来&#xff1a; 布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xml…

【MySQL】数据库事务详解

文章目录 前言1. 事务的定义2. 事务的四个特性2.1 原子性2.2 一致性2.3 隔离性2.4 持久性 3. 事务的并发问题3.1 脏读3.2 不可重复读3.3 幻读3.4 更新丢失 4. 事务的隔离级别5. 事务的使用结语 前言 假设我们现在需要操作数据库进行转账&#xff0c;A 给 B 转账 100 块钱&…

掌握React与TypeScript:从零开始绘制中国地图

最近我需要使用reactts绘制一个界面&#xff0c;里面需要以中国地图的形式展示区块链从2019-2024年这五年的备案以及注销情况&#xff0c;所以研究了一下这方面的工作&#xff0c;初步有了一些成果&#xff0c;所以现在做一些分享&#xff0c;希望对大家有帮助&#xff01; 在这…

【Kotlin】Kotlin 基础语法指南

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

基于TCP/QT/C++的网盘系统测试报告

目录 一、项目介绍 1、项目描述 2、项目组成模块 3、项目技术要点 二、用户功能测试 1、查看在线用户测试 1.1、运行服务器 1.2、登录两个账号 1.3、点击显示在线用户&#xff0c;可以看到jack和lucy 2、搜索用户测试 2.1、打开服务器&#xff0c;登录两个账号jack,lucy 2.2、在…

嵌入式学习——硬件(IIC、ADC)——day56

1. IIC 1.1 定义&#xff08;同步串行半双工通信总线&#xff09; IIC&#xff08;Inter-Integrated Circuit&#xff09;又称I2C&#xff0c;是是IICBus简称&#xff0c;所以中文应该叫集成电路总线。是飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备…

Linux高并发服务器开发(八)Socket和TCP

文章目录 1 IPV4套接字结构体2 TCP客户端函数 3 TCP服务器流程函数代码粘包 4 三次握手5 四次挥手6 滑动窗口 1 IPV4套接字结构体 2 TCP客户端 特点&#xff1a;出错重传 每次发送数据对方都会回ACK&#xff0c;可靠 tcp是打电话的模型&#xff0c;建立连接 使用连接 关闭连接…

【代码随想录】【算法训练营】【第49天】 [300]最长递增子序列 [674]最长连续递增序列 [718]最长重复子数组

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 49&#xff0c;周二&#xff0c;坚持不了一点~ 题目详情 [300] 最长递增子序列 题目描述 300 最长递增子序列 解题思路 前提&#xff1a;最大递增子序列的长度 思路&#xff1a;动态规划 d…

RedHat9 | podman容器-续集

一、管理容器存储和网络资源 使用容器来运行简单的进程&#xff0c;然后退出。可以配置容连续运行特定服务&#xff0c;如数据库服务。如果持续运行服务&#xff0c;需要向容器添加更多的资源&#xff0c;如持久存储或对其他网络的访问权限。 针对企业容器平台上的大型部署&a…

汽车零部件材料耐候性测试氙光太阳辐射系统试验箱

概述 汽车零部件等领域的材料耐候性测试是一项关键的质量控制环节&#xff0c;它关乎汽车部件在各种气候条件下的性能表现和寿命。塑料件光照老化实验箱&#xff0c;即氙灯老化试验箱&#xff0c;在其中扮演着至关重要的角色。通过模拟自然环境中的光照、温度、湿度等条件&…

遇到多语言跨境电商系统源码问题?这里有解决方案!

从手机到电脑&#xff0c;从线下到线上&#xff0c;如今&#xff0c;跨境电商正在打破地域界限&#xff0c;成为全球贸易的新引擎。在这个全球化的背景下&#xff0c;跨境电商平台的运营也面临着一系列的挑战&#xff0c;其中之一就是多语言问题。如果你遇到了多语言跨境电商系…

【HALCON】如何实现hw窗口自适应相机拍照成像的大小

前言 在开发一个喷码检测软件的时候碰到相机成像和hw窗体的大小不一致&#xff0c;hw太小显示不完全成像的图片&#xff0c;这使得成像不均匀&#xff0c;现场辨别起来比较不直观&#xff0c;因此需要对其进行一个调整。 解决 省略掉读取图片的环节&#xff0c;我们只需要将…

全国产化飞腾模块BIOS下修复系统启动文件

1、背景介绍 全国产飞腾模块采用麒麟信安操作系统&#xff0c;当系统下面的grub.cfg文件被用户误操作导致无法启动时&#xff0c;可以在BIOS下通过U盘中备份的grub.cfg替换硬盘上原来的grub.cfg文件&#xff0c;从而实现启动。 2、操作步骤 首先进入BIOS命令行模式&#xff…

2.3章节Python中的数值类型

1.整型数值 2.浮点型数值 3.复数   Python中的数值类型清晰且丰富&#xff0c;主要分为以下几种类型&#xff0c;每种类型都有其特定的用途和特性。 一、整型数值 1.定义&#xff1a;整数类型用于表示整数值&#xff0c;如1、-5、100等。 2.特点&#xff1a; Python 3中的…

Ubuntu(通用)—网络加固—ufw+防DNS污染+ARP绑定

1. ufw sudo ufw default deny incoming sudo ufw deny in from any to any # sudo ufw allow from any to any port 5353 protocol udp sudo ufw enable # 启动开机自启 # sudo ufw reload 更改后的操作2. 防ARP欺骗 华为云教程 arp -d删除dns记录arp -a显示arp表 ipconfi…

拆分盘投资策略解析:机制、案例与风险考量

一、引言 随着互联网技术的迅猛发展和金融市场的不断创新&#xff0c;拆分盘这一投资模式逐渐崭露头角&#xff0c;成为投资者关注的焦点。它基于特定的拆分策略&#xff0c;通过调整投资者持有的份额和单价&#xff0c;实现了看似稳健的资产增长。本文旨在深入探讨拆分盘的运…

MySQL-数据操作类型的角度理解 S锁 X锁

文章目录 1、S锁和S锁互相兼容2、S锁和X锁互斥3、X锁和X锁也互斥4、X锁和S锁也互斥5、select * from account for update;6、select * from account for update nowait;7、select * from account for update skip locked; 1、S锁和S锁互相兼容 2、S锁和X锁互斥 3、X锁和X锁也互…

在线疫苗预约小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;工作人员管理&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;疫苗管理&#xff0c;论坛管理&#xff0c;公告管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;疫苗…

K 近邻、K-NN 算法图文详解

1. 为什么学习KNN算法 KNN是监督学习分类算法&#xff0c;主要解决现实生活中分类问题。根据目标的不同将监督学习任务分为了分类学习及回归预测问题。 KNN&#xff08;K-Nearest Neihbor&#xff0c;KNN&#xff09;K近邻是机器学习算法中理论最简单&#xff0c;最好理解的算法…