You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:18:04