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

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

本文详解如何修复因 `img.src` 返回完整 url 导致的图标切换失效问题,通过 `getattribute('src')` 获取原始相对路径,并实现密码类型与图标状态的双向同步。

在 Web 表单中,常见的“密码可见性切换”功能通常包含两个联动行为:一是切换 ,二是同步更新右侧眼睛图标的显示(如 eye.png ↔ eyec.png)。但许多开发者会遇到图标不切换的问题——表面逻辑正确,实际却无响应。根本原因在于:img.src 属性返回的是浏览器解析后的绝对 URL(如 file:///.../eye.png),而非 HTML 中写的相对路径 eye.png,因此直接用 === "eye.png" 比较必然失败。

✅ 正确做法是使用 element.getAttribute('src'),它精确读取 HTML 标签中声明的原始属性值:

function fun1() {
  const eyeImg = document.getElementById("eye");
  const currentSrc = eyeImg.getAttribute("src"); // ✅ 获取原始 src 值,如 "eye.png"

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

同时,建议优化整体逻辑,避免冗余判断和潜在竞态。以下是重构后的健壮版本:

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 文件确实存在于项目根目录(或对应路径),且文件名大小写完全匹配;
  • 推荐为 添加 alt 属性提升可访问性;
  • 生产环境建议使用 CSS 类控制图标(如 .eye--open, .eye--closed),配合背景图或 SVG,更利于维护;
  • 若启用 CSP(内容安全策略),动态修改 src 需确保资源路径符合 img-src 规则。

通过 getAttribute('src') 抓取原始属性值,再结合清晰的状态映射逻辑,即可稳定实现密码可见性与图标状态的精准同步。


# css  # word  # html  # svg  # 浏览器  # input  # 重构  # 的是  # 见性  # 一是  # 并在  # 而非  # 表单  # 根本原因  # 却无  # 安全策略 


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


相关推荐: 1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  如何选择可靠的免备案建站服务器?  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  原生JS实现图片轮播切换效果  中山网站推广排名,中山信息港登录入口?  Android GridView 滑动条设置一直显示状态(推荐)  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  如何快速登录WAP自助建站平台?  如何在云主机上快速搭建多站点网站?  Laravel如何记录自定义日志?(Log频道配置)  韩国服务器如何优化跨境访问实现高效连接?  如何用VPS主机快速搭建个人网站?  Laravel如何实现API资源集合?(Resource Collection教程)  零服务器AI建站解决方案:快速部署与云端平台低成本实践  网页设计与网站制作内容,怎样注册网站?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Python制作简易注册登录系统  Laravel如何使用Blade组件和插槽?(Component代码示例)  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  如何在橙子建站上传落地页?操作指南详解  如何在宝塔面板中修改默认建站目录?  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel如何使用Service Container和依赖注入?(代码示例)  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  IOS倒计时设置UIButton标题title的抖动问题  如何用PHP工具快速搭建高效网站?  新三国志曹操传主线渭水交兵攻略  如何续费美橙建站之星域名及服务?  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  如何在阿里云域名上完成建站全流程?  如何用低价快速搭建高质量网站?  如何在万网利用已有域名快速建站?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  实现点击下箭头变上箭头来回切换的两种方法【推荐】  昵图网官网入口 昵图网素材平台官方入口  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Android使用GridView实现日历的简单功能  三星、SK海力士获美批准:可向中国出口芯片制造设备  如何构建满足综合性能需求的优质建站方案?  Laravel怎么实现模型属性的自动加密  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  北京网站制作的公司有哪些,北京白云观官方网站?  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  北京企业网站设计制作公司,北京铁路集团官方网站?  如何在云指建站中生成FTP站点?  Laravel如何实现本地化和多语言支持?(i18n教程)