本文详解如何修复因 `img.src` 返回完整 url 导致的图标切换失效问
题,使用 `getattribute('src')` 精准比对原始路径,并提供健壮、可维护的密码显示控制方案。
在 Web 表单中,实现“密码可见性切换”(即点击眼睛图标切换输入框类型并同步更新图标)是常见需求。但许多开发者会遇到图标不切换的问题——表面看逻辑正确,实则根源在于对 DOM 属性 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 查询;使用三元运算符提升可读性与性能。
if (current.includes("eye.png") && !current.includes("eyec.png")) {
eyeImg.src = "eyec.png";
} else {
eyeImg.src = "eye.png";
}在
中保持简洁,JS 部分建议封装为模块化函数,并在页面加载后绑定事件(而非内联 onclick),例如:@@##@@
document.getElementById("toggle-eye").addEventListener("click", eye);这样既解耦逻辑,又便于后续添加过渡动画、无障碍支持(如 aria-label)等进阶功能。
掌握 getAttribute() 与属性访问器的区别,是 DOM 操作中少踩坑的关键一步。一次修正,全局生效。