Javascript 在单独的过程中创建iframe,使其不会';t阻止父窗口的主线程

Javascript 在单独的过程中创建iframe,使其不会';t阻止父窗口的主线程,javascript,html,Javascript,Html,我最近听说了rel=“noopener”属性值可以添加到锚定标记中,以便新窗口在单独的进程中运行。这让我想知道:有没有可能创建一个在单独进程中运行的iframe,例如,iframe中的无限循环不会导致父窗口的主线程被阻塞 下面是一些观察主线程冻结的示例代码: <progress></progress> <iframe srcdoc="<script>function loop() { i=0; while(i<700000000){i++}; se

我最近听说了
rel=“noopener”
属性值可以添加到锚定标记中,以便新窗口在单独的进程中运行。这让我想知道:有没有可能创建一个在单独进程中运行的iframe,例如,iframe中的无限循环不会导致父窗口的主线程被阻塞

下面是一些观察主线程冻结的示例代码:

<progress></progress>
<iframe srcdoc="<script>function loop() { i=0; while(i<700000000){i++}; setTimeout(loop, 2000) }; loop();</script>"></iframe>


编辑:请注意,您可以通过向iframe添加
沙盒
属性来防止冻结,这似乎“强制”浏览器(至少是Chrome浏览器)将iframe放在单独的线程中,但在我的情况下,我不能这样做。然而,我在一个单独的子域下为iframe提供代码,因此我认为,由于它是一个单独的源代码,Chrome会将它放在一个单独的过程中,就像如果iframe的
src
是一个不同的顶级域一样。

在一些浏览器中,包括Chrome,跨源iframe。例如,在Chrome中运行以下代码段不会阻止您在父堆栈溢出窗口中滚动:

while(true){

}
从2021年初开始,现在有了
Origin Agent Cluster
头,允许您为iframe请求专用资源。它目前在Chrome(88+)上受到支持,受到Mozilla和Safari的好评

Origin Agent Cluster是一个新的HTTP响应头,它指示浏览器防止同一站点跨源页面之间的同步脚本访问。浏览器也可以使用源代理集群作为提示,提示您的源应该拥有自己的、独立的资源,例如专用的进程

[…]例如,如果
https://customerservicewidget.example.com
预计将使用大量资源进行视频聊天,并将嵌入整个
https://*.example.com
,,维护该小部件的团队可以使用originagent集群头来尝试降低它们对嵌入式程序的性能影响

要使用原始代理群集标头,请将web服务器配置为发送以下HTTP响应标头:
原始代理群集:?1
的值
?1
是布尔真值的结构化标头语法


这里有更多细节:

Hmm,这很奇怪,因为我在帖子中链接的示例冻结了jsbin的主线程,即使jsbin在一个单独的子域上运行javascript:
null.jsbin.com
,因此它是跨源的。添加
sandbox
属性修复是(没有冻结),所以Chrome可能没有在严格的“不同来源”基础上进行流程分离?也许它是通过顶级域来实现的?我正在为我的站点做类似于JSbin的事情(在子域上运行iframe),我看到了相同的父冻结行为。