为什么 window.open 在 setTimeout <= 1000ms 时不会被阻止?

And*_*ris 5 javascript settimeout window.open requestanimationframe

document.querySelector('#ontime').onclick = function() {
    setTimeout(() => {
        window.open('https://www.google.com');
    }, 1000);
};
Run Code Online (Sandbox Code Playgroud)

当用户点击超时 <= 1000ms(或 a Promise.resolve().then(...))后使用 window.open 时,它不会被浏览器阻止。

如果您使用超时> 1000ms 或 执行相同操作requestAnimationFrame,则弹出窗口将被阻止。

单击下面的链接可以获取包含 4 个案例的完整示例: https: //jsfiddle.net/kouty79/rcwgbfxy/

有人知道为什么吗?有相关文档或 w3c 规范吗?

Que*_*tin 2

HTML 5.2开始:

\n\n
\n

如果满足以下任一条件,则允许算法显示弹出窗口:

\n\n

\xe2\x80\xa6

\n\n

受信任事件的事件侦听器\n \xe2\x80\xa6

\n\n

\xe2\x80\xa6 按允许显示弹出窗口的算法排队,并且此类算法链在用户代理定义的时间范围内启动。

\n
\n\n

onclick是一个可信事件,但setTimeout将其放入队列中(因此不会直接调用),因此弹出窗口必须在特定时间内出现。

\n\n

这个时间由浏览器决定。

\n