
本文详解如何修复因 `img.src` 返回完整 url 导致的图标切换失效问题,通过 `getattribute('src')` 获取原始相对路径,并实现密码类型与图标状态的双向同步。
在 Web 表单中,常见的“密码可见性切换”功能通常包含两个联动行为:一是切换 word"> 与 ,二是同步更新右侧眼睛图标的显示(如 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') 抓取原始属性值,再结合清晰的状态映射逻辑,即可稳定实现密码可见性与图标状态的精准同步。










