querySelectorAll() 作用于当前文档的 DOM 树,与 HTML 文件数量无关;只要元素已加载并存在于当前页面的 DOM 中,它就能正确选取——关键在于脚本执行时机和 DOM 加载状态。
`queryselectorall()` 作用于当前文档的 dom 树,与 html 文件数量无关;只要元素已加载并存在于当前页面的 dom 中,它就能正确选取——关键在于脚本执行时机和 dom 加载状态。
querySelectorAll() 是一个纯客户端 DOM 查询方法,它不关心 HTML 内容来自单个文件还是多个文件(如 register.html 和 login.html),而只关注当前浏览器标签页中实际渲染完成的 DOM 结构。也就是说:它工作在“运行时文档”上,而非“源文件”上。
你遇到的问题——login.html 中的 .eye 元素未被选中、console.log(eye.length) 输出 1(仅匹配到 register.html 的元素)——根本原因并非 querySelectorAll() 的限制,而是:
✅ script.js 被两个 HTML 文件共用,但脚本可能在 login.html 的 DOM 尚未加载完成时就已执行;
❌ login.html 中缺失某些结构(如未引入 Font Awesome CSS、.eye 元素未正确渲染)、或存在 JS 执行错误中断后续逻辑;
⚠️ 更常见的是:脚本被置于 <head> 中且未加 defer 或 DOMContentLoaded 保护,导致在 <body> 内容解析前执行,此时 document.querySelectorAll('.eye') 返回空 NodeList(或仅部分匹配)。
<!-- login.html 和 register.html 均需如此 --><script src="js/script.js" defer></script>
或在 script.js 开头包裹:
document.addEventListener('DOMContentLoaded', () => { const eye = document.querySelectorAll('.eye'); console.log('Found eyes:', eye.length); // 现在会正确输出 1(本页)或更多 const pass = document.querySelectorAll('.password'); eye.forEach((v, i) => { v.addEventListener('click', () => { v.classList.toggle('fa-eye-slash'); const input = pass[i]; const currentType = input.getAttribute('type'); input.setAttribute('type', currentType === 'password' ? 'text' : 'password'); }); });});
总之,querySelectorAll() 的作用域是当前文档对象(document),不是文件系统路径。只要 HTML 正确加载、脚本在 DOM 就绪后执行,它就能可靠工作——无论你有 1 个还是 100 个 HTML 文件。