为什么window.open()默认忽略iff在循环内调用并通过setTimeout()?

时间:2018-05-14 08:32:38

标签: javascript firefox popup timeout

---编辑。

我不明白;昨天似乎被忽略了;现在它似乎正在起作用。甚至在循环内并通过setTimeout()调用。目前我似乎难以复制昨天的行为......发生了什么事?

---第二次编辑。

首先想法如何“修复”问题的复制:奇怪的是,这是否有效似乎取决于当前的URL!例如。作品from SE-sites,但不是http://www.asdf.com/。怎么样?

setTimeout() 在这里工作:

setTimeout(function(){ alert("Hello"); }, 3000);

window.open() 在这里工作:

window.open("https://www.bbc.com","_self");

甚至这两个作品的组合在这里:

setTimeout(function(){ window.open("https://www.bbc.com","_self") }, 3000);

突然意外地将两者的组合 - 静默地 - 在循环中忽略:

i=0;
while(i < 100)
{
    setTimeout(function(){ window.open("https://www.bbc.com","_self") }, 3000);
    i++
}

为什么?

tldr;

这个问题似乎已经接近一百万次,但现在还没有(据我所知/搜索)简洁的Q&amp; A格式; e.g。

Settimeout() javascript function is ignored

Simulating JavaScript's setTimeout() method “from first principles”

1 个答案:

答案 0 :(得分:1)

{{3}}

从本质上讲,尝试从 <iframe>中解雇window.open 会让浏览器“认为”这是一个应得的弹出窗口(无声)阻塞。 - 相反,如果setTimeout()被自己触发,则浏览器对待它似乎将 视为“用户点击” ,也就是说,不是作为要阻止的垃圾邮件。