首页 > 解决方案 > OPENING 常量 新标签

问题描述

var myWindow;
let urls = ["https://stackoverflow.com", "https://stackexchange.com/"];
let counter = 0;
let openWindow;
function openWin(url) {
    openWindow = window.open(url, "_blank");
}
function closeWin(){
    openWindow.close();
}
setInterval(function(){
    if(openWindow) closeWin();
    openWin(urls[counter]);
    counter++;
}, 10000)

即使在打开所有网址后,这也会继续打开新标签。怎么做才能防止打开任何其他选项卡,然后只打开 url。当我加载此网址时,它会打开 4 个网址,但之后会打开 N 个空白标签。

标签: javascript

解决方案


您的解决方案很棒,唯一的问题是setInterval除非您取消它,否则呼叫将永远不会结束。

这个解决方案的问题是它涉及一些副作用,以后调试起来可能很乏味。

我是否可以提出一个涉及较少副作用并利用一些新概念(如 Promises 和 Async/Await 上下文)的解决方案。

"use strict";

function sleep(seconds) {
    return new Promise(function(resolve) {
        window.setTimeout(resolve, seconds * 1000);
    });
}

async function openAndCloseAfter(seconds, url) {
    const openWindow = window.open(url, "_blank");
    await sleep(seconds);
    openWindow.close();
}

async function openAll(urls) {
    for (const url of urls) {
        await openAndCloseAfter(10, url);
    }
}

openAll([
    "https://stackoverflow.com",
    "https://stackexchange.com"
]);

我将让您负责进行必要的运行时类型检查,以防止使用错误的参数类型调用这些函数。

是上述代码在真实环境中的演示。

如果您对代码片段中使用的概念不够熟悉,可以查看此处此处的文档。

注意:小心浏览器!由于您可能会打开许多​​浏览器选项卡,因此浏览器可能会阻止您的脚本,除非用户明确告诉它忽略多个打开的弹出窗口!


推荐阅读