为什么 window.open() 被静默忽略从循环中并通过 setTimeout() 调用的 iff?



--- 编辑。

我不明白;昨天它似乎被忽略了;现在它似乎正在起作用。即使在循环内并通过setTimeout()调用。目前,我似乎很难复制昨天的行为......这是怎么回事?


--- 第2次编辑。

首先知道如何"修复"问题的复制:奇怪的是,这是否有效似乎取决于当前的 URL! 例如,从 SE 站点工作,但不能从 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;

这个问题似乎已经出现了近一百万次,但还没有(据我所知/搜索(简洁的问答格式;例如

Settimeout(( javascript 函数被忽略

模拟JavaScript的setTimeout((方法"从第一原则">

大多数流行浏览器中的弹出窗口阻止程序仅允许打开一个新窗口,如果该窗口是由于从直接用户操作(如单击(运行的代码而打开的。由于setTimeout()发生在未来的某个时间,因此不被视为用户操作的直接结果,因此尝试从setTimeout()打开窗口可能会被弹出窗口阻止程序阻止。

从本质上讲,试图内部触发window.opensetTimeout()会让浏览器"认为"它是一个值得(静默(阻止的弹出窗口。 - 相反,如果window.open是自行触发的,浏览器似乎将其视为"用户点击">,即不被视为要阻止的垃圾邮件。

相关内容

  • 没有找到相关文章

最新更新