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

时间:2018-02-14 13:19:10

标签: javascript settimeout window.open requestanimationframe

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

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

如果你使用超时>做同样的事情1000毫秒或requestAnimationFrame,弹出窗口被阻止。

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

有人知道为什么吗?有没有关于此的文档或w3c规范?

1 个答案:

答案 0 :(得分:1)

来自HTML 5.2

  

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

     

...

     

受信任事件的事件侦听器   ...

     

...由允许显示弹出窗口的算法排队,此类算法链在用户代理定义的时间范围内开始

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

该时间取决于浏览器的决定时间。