如何通过点击 切换密码可见性并同步更新眼睛图标

发布时间 - 2026-01-07 00:00:00    点击率:

切换密码可见性并同步更新眼睛图标 " />

本文详解 javascript 中因 `img.src` 返回绝对路径导致图片切换失效的问题,提供使用 `getattribute('src')` 获取原始相对路径的正确方案,并附带健壮性优化与完整可运行示例。

在 Web 表单中,实现“密码可见/隐藏”功能时,常需同步切换输入框类型(type="password" ↔ type="text")和眼睛图标(如 eye.png ↔ eyec.png)。但初学者常遇到图标不切换的问题——表面看逻辑正确,实则源于对 DOM 属性 src 的误解。

元素的 .src 属性返回的是浏览器解析后的完整绝对 URL(例如 file:///C:/project/eye.png 或 https://example.com/eye.png),而非 HTML 中写的相对路径 eye.png。因此,直接用 == "eye.png" 比较必然失败。

✅ 正确做法是使用 element.getAttribute('src'),它精准返回 HTML 标签中声明的原始字符串值:

function fun1() {
  const eyeImg = document.getElementById("eye");
  const currentSrc = eyeImg.getAttribute("src");

  if (currentSrc === "eyec.png") {
    eyeImg.src = "eye.png";
  } else if (currentSrc === "eye.png") {
    eyeImg.src = "eyec.png";
  }
}

⚠️ 更进一步,建议增强代码鲁棒性:

  • 使用严格相等 === 替代 ==;
  • 添加默认 fallback,避免因初始路径异常导致逻辑中断;
  • 合并两个函数逻辑,提升可维护性。

优化后的完整函数如下:

function togglePasswordVisibility() {
  const passwordInput = document.getElementById("password");
  const eyeImg = document.getElementById("eye");

  // 切换输入框类型
  if (passwordInput.type === "password") {
    passwordInput.type = "text";
    eyeImg.src = "eyec.png"; // 显示明文时显示“睁眼”图标
  } else {
    passwordInput.type = "password";
    eyeImg.src = "eye.png"; // 隐藏时显示“闭眼”图标
  }
}

对应 HTML 中只需绑定一次事件:

? 注意事项:

  • 确保 eye.png 和 eyec.png 文件存在于与 HTML 同级目录,或按实际路径调整;
  • 若使用构建工具(如 Webpack/Vite),静态资源路径可能需通过 public/ 或 assets/ 引用,此时应统一使用 import 或环境变量处理;
  • 推荐为眼睛图标添加 cursor: pointer CSS 样式,提升用户可感知性;
  • 生产环境中建议增加 aria-label 和 role="button",保障无障碍访问。

该方案简洁、可靠,彻底规避了路径解析差异带来的陷阱,是前端表单交互中的典型最佳实践。


# css  # javascript  # word  # java  # html  # 前端  # vite  # 浏览器  # 工具  # 环境变量 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Windows Hello人脸识别突然无法使用  Laravel PHP版本要求一览_Laravel各版本环境要求对照  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  图册素材网站设计制作软件,图册的导出方式有几种?  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Python面向对象测试方法_mock解析【教程】  java获取注册ip实例  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  简历在线制作网站免费版,如何创建个人简历?  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何用PHP快速搭建CMS系统?  如何快速搭建高效WAP手机网站吸引移动用户?  韩国服务器如何优化跨境访问实现高效连接?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel storage目录权限问题_Laravel文件写入权限设置  网站制作企业,网站的banner和导航栏是指什么?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Android利用动画实现背景逐渐变暗  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  canvas 画布在主流浏览器中的尺寸限制详细介绍  如何在阿里云ECS服务器部署织梦CMS网站?  如何在Windows 2008云服务器安全搭建网站?  如何快速生成可下载的建站源码工具?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  深圳网站制作培训,深圳哪些招聘网站比较好?  JavaScript如何实现继承_有哪些常用方法  Swift中switch语句区间和元组模式匹配  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  🚀拖拽式CMS建站能否实现高效与个性化并存?  公司门户网站制作流程,华为官网怎么做?  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  如何快速使用云服务器搭建个人网站?  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  如何在宝塔面板创建新站点?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  三星、SK海力士获美批准:可向中国出口芯片制造设备  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤