为什么我的JS脚本在耐克官网运行时无限循环打开标签页无法终止?
问题根源
- 数组索引越界触发异常,导致
clearInterval无法执行:你获取的a标签数组长度为4时,有效索引范围是0~3,循环判断条件写的是i<dispo+1即i<5,i会走到4,此时访问a[4].href会抛出未定义错误,代码直接终止运行,后续清除定时器的逻辑永远不会触发,定时器会每2秒重复执行一次,持续打开新标签。 - 变量未声明导致全局污染:
dispo和循环变量i都没有用var/let/const声明,会自动挂载到全局window对象,取值容易出现预期外的异常。 - 缺少节点存在性校验:如果页面结构变动,
.grid的第6个元素(索引5)不存在,或者该元素下没有a标签,都会提前触发异常,同样会导致定时器无法清除。
修复后的代码
var checkInterval = setInterval(() => { // 无目标文本直接跳出本次执行 if (!document.documentElement.innerText.includes('Paris')) return try { const gridItem = document.querySelectorAll('.grid')[5] if (!gridItem) throw new Error('目标grid节点不存在') const linkList = gridItem.querySelectorAll('a') const dispo = linkList.length // 循环条件改为小于dispo,避免索引越界 for (let i = 0; i < dispo; i += 2) { const targetHref = linkList[i]?.href if (targetHref) window.open(targetHref, "_blank") } } catch (err) { console.error('执行出错:', err) } finally { // 无论执行成功还是失败都清除定时器,避免无限运行 clearInterval(checkInterval) } }, 2000);
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

