贝利信息

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

日期:2026-01-07 00:00 / 作者:心靈之曲

本文详解如何修复因 `img.src` 返回完整 url 导致的图标切换失效问题,使用 `getattribute('src')` 精准比对原始路径,并提供健壮、可维护的密码显示控制方案。

在 Web 表单中,实现“密码可见性切换”(即点击眼睛图标切换输入框类型并同步更新图标)是常见需求。但许多开发者会遇到图标不切换的问题——表面看逻辑正确,实则根源在于对 DOM 属性 src 的误解。

? 问题核心:img.src vs img.getAttribute('src')

因此,原代码中:

if (document.getElementById("eye").src == "eyec.png") { ... }

永远为 false —— 因为左侧是完整路径,右侧是相对名。

✅ 正确做法是统一使用 getAttribute('src') 进行判断,并直接赋值 src 属性切换图像:

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";
  }
}

✅ 推荐优化写法(更简洁 & 容错更强)

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

  // 切换密码类型
  pwdInput.type = pwdInput.type === "password" ? "text" : "password";

  // 同步切换图标(基于原始 src 值判断)
  const current = eyeImg.getAttribute("src");
  eyeImg.src = current === "eye.png" ? "eyec.png" : "eye.png";
}
? 提示:将 pwdInput 和 eyeImg 缓存为变量,避免重复 DOM 查询;使用三元运算符提升可读性与性能。

⚠️ 注意事项

? 最终整合建议(HTML + JS)

中保持简洁,JS 部分建议封装为模块化函数,并在页面加载后绑定事件(而非内联 onclick),例如:
  @@##@@
document.getElementById("toggle-eye").addEventListener("click", eye);

这样既解耦逻辑,又便于后续添加过渡动画、无障碍支持(如 aria-label)等进阶功能。

掌握 getAttribute() 与属性访问器的区别,是 DOM 操作中少踩坑的关键一步。一次修正,全局生效。