JavaScript遍历文件URL数组仅打开第一个URL的故障如何解决
问题原因
- 核心触发原因是浏览器的内置弹窗拦截机制:浏览器默认会拦截非用户主动触发的批量弹窗操作,即便是代码在点击、按键这类用户交互事件的回调中执行,绝大多数浏览器也仅允许单次
window.open调用,连续无间隔的弹窗调用会被判定为恶意行为,直接拦截后续的弹窗请求,部分浏览器在触发拦截规则后会直接终止当前脚本的执行,所以会出现只有第一个链接能打开、后续循环直接停止的情况。 - 次要可能原因:部分浏览器对相同窗口目标标识做了复用优化,多个连续的
window.open调用都使用_blank作为目标时,后续的链接会覆盖第一个已经打开的标签页,看起来就像只成功打开了第一个链接。
修复方案
可以通过给每个弹窗调用增加短时错开的延时,规避浏览器的批量弹窗拦截规则,同时给每个窗口设置唯一标识避免标签页被覆盖,修复后的代码如下:
var x = document.querySelectorAll("a.Mylinks"); var myarray = []; for (var i = 0; i < x.length; i++) { var link = x[i].href; myarray.push(link); } for (var i = 0; i < myarray.length; i++) { // 立即执行函数锁定当前循环的链接和索引,避免异步延时导致的变量污染 (function(targetUrl, index) { setTimeout(function() { // 给每个弹窗设置唯一的窗口名,避免标签页被复用覆盖 window.open(targetUrl, `custom_open_${index}`); }, index * 150); })(myarray[i], i); }
补充说明:150毫秒的间隔可以根据使用的浏览器调整,多数情况下100-200毫秒的间隔就可以绕过拦截规则,不会被判定为批量恶意弹窗。如果是个人自用的脚本,也可以直接在浏览器设置里关闭当前站点的弹窗拦截,无需修改代码即可正常打开所有链接。
内容的提问来源于stack exchange,提问作者c0zero
相关产品推荐
相关产品推荐

