重复执行脚本后出现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
相关产品推荐
相关产品推荐

