17370845950

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

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

本文详解 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",保障无障碍访问。

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