addEventListener('DOMContentLoaded')触发页面反复刷新重复弹出prompt问题
问题根因
- 核心逻辑漏洞:
login(token)执行后触发了页面刷新/重定向,且跳转后地址依然命中登录页匹配规则,DOMContentLoaded事件重新触发,导致prompt逻辑重复执行。 - 匹配规则缺陷:当前用全量
window.location.href做匹配,一旦登录页URL带查询参数、哈希锚点,会出现匹配逻辑不符合预期的问题,进一步提升重复触发概率。 - 无状态校验逻辑:脚本没有做执行状态标记,每次页面加载都会无条件触发prompt逻辑,没有做「已提交过token」的状态校验。
修复方案
替换原有代码为如下版本即可解决问题:
document.addEventListener('DOMContentLoaded', function () { // 改用pathname匹配,规避URL参数、哈希对匹配结果的影响 if(window.location.pathname !== '/login') return; // 新增临时状态标记,避免重复触发prompt if(sessionStorage.getItem('token_prompted')) return; sessionStorage.setItem('token_prompted', '1'); console.log("Prompting for token..."); let token = prompt("Give the token"); if(!token) { console.log("No token provided. Aborting!"); sessionStorage.removeItem('token_prompted'); return; } login(token) .then(() => { // 登录成功后清理标记,跳转至非登录页 sessionStorage.removeItem('token_prompted'); // 此处替换为你的业务侧登录后默认跳转地址 window.location.href = '/home'; }) .catch(() => { // 登录失败清理标记,允许用户重新输入 sessionStorage.removeItem('token_prompted'); }) })
修复说明
- 优化了登录页匹配规则,仅校验路由路径,不受URL后缀参数干扰
- 通过sessionStorage做临时状态缓存,同一次登录流程下页面刷新不会重复弹出prompt
- 新增登录成功/失败的回调处理,登录完成后跳转至非登录页,避免停留在登录路由重复触发逻辑,同时清理状态标记不影响后续登录操作。
内容的提问来源于stack exchange,提问作者Sulty
相关产品推荐
相关产品推荐

