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

重复执行脚本后出现JavaScript Unexpected identifier 'Function'错误

问题根源

第二次运行报错是因为脚本反复处理同一个链接,把onclick函数来回转字符串修改,搞乱了代码结构。第一次处理时,你把onclick函数转成字符串提取内容修改,再用setAttribute设回去;第二次运行时,这个已经被改得面目全非的函数再转字符串,提取出来的代码就有语法问题了,直接触发Unexpected identifier 'Function'错误。而且反复改href也可能导致路径重复替换出问题。

修复方法

给处理过的链接加个标记,跳过重复处理,同时优化onclick的修改逻辑:

function changeLinks() {
    let links = document.getElementsByTagName("a");

    for (let i = 0; i < links.length; i++) {
        const link = links[i];
        // 已经处理过的直接跳过
        if (link.dataset.processed === "true") continue;

        // 修改href
        link.href = link.href.replace("/current", "/target");

        // 修改onclick
        if (link.onclick) {
            let funcContent = link.onclick.toString();
            // 替换路径
            funcContent = funcContent.replace("/current", "/target");
            // 重新生成函数赋值
            link.onclick = new Function(funcContent.slice(funcContent.indexOf("{") + 1, funcContent.lastIndexOf("}")));
        }

        // 标记为已处理
        link.dataset.processed = "true";
    }
}
setInterval(changeLinks, 5000);
更省事的优化

直接只选没处理过的链接,不用遍历全部:

function changeLinks() {
    // 只挑没处理过的链接
    let links = document.querySelectorAll("a:not([data-processed='true'])");

    links.forEach(link => {
        link.href = link.href.replace("/current", "/target");

        if (link.onclick) {
            let funcContent = link.onclick.toString();
            funcContent = funcContent.replace("/current", "/target");
            link.onclick = new Function(funcContent.slice(funcContent.indexOf("{") + 1, funcContent.lastIndexOf("}")));
        }

        link.dataset.processed = "true";
    });
}
setInterval(changeLinks, 5000);

这样页面新增的链接也能被正常处理,因为新链接没有标记,会被选中处理。

内容的提问来源于stack exchange,提问作者LokiTheCreator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:25:03