Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
浏览器会为iframe提供单独的JavaScript线程吗?_Javascript_Multithreading_Browser - Fatal编程技术网

浏览器会为iframe提供单独的JavaScript线程吗?

浏览器会为iframe提供单独的JavaScript线程吗?,javascript,multithreading,browser,Javascript,Multithreading,Browser,web浏览器是否在iFrame中为JavaScript使用单独的执行线程 我相信Chrome会为每个选项卡使用单独的线程,因此我猜测iframe中的JavaScript会与其父窗口共享同一线程,然而,这似乎也存在安全风险。在Chrome出现之前,任何浏览器的所有选项卡都共享同一个JavaScript线程。Chrome提高了游戏的质量,其他一些人也开始效仿 这是一个浏览器实现细节,因此没有确切的答案。较老的浏览器肯定不会。我不知道有哪个浏览器肯定会使用另一个线程作为iFrame,但老实说,我从来没

web浏览器是否在iFrame中为JavaScript使用单独的执行线程


我相信Chrome会为每个选项卡使用单独的线程,因此我猜测iframe中的JavaScript会与其父窗口共享同一线程,然而,这似乎也存在安全风险。

在Chrome出现之前,任何浏览器的所有选项卡都共享同一个JavaScript线程。Chrome提高了游戏的质量,其他一些人也开始效仿

这是一个浏览器实现细节,因此没有确切的答案。较老的浏览器肯定不会。我不知道有哪个浏览器肯定会使用另一个线程作为iFrame,但老实说,我从来没有真正研究过它


这不是一个安全风险,因为线程执行时不会带来任何对象。

稍后,但是。。。很好,因为iframe js在Firefox 16中似乎是并发的。
尝试使用警报功能(阻止),您将看到对话框一起打开。
这在Chrome或IE中是看不到的。

iframe js可能会像往常一样访问Firefox 16中的父窗口,因此我可以考虑可能出现的竞争条件。

对于iframe,没有。但是如果你想在JavaScript中使用线程,你可以使用Web Workers,这是一个新浏览器支持的工作html5草案

今天在Ubuntu的Chrome 28上做了一些实验。使用此命令查看Chrome的线程和进程

ps-axo-pid、nlwp、cmd | grep“chrome”


看起来Chrome不会为iFrame生成新的线程或进程。一个有趣的注意事项是,它确实为“开发工具”窗格生成了一个新的进程。

总结其他答案:不,iFrame通常与主页运行在同一线程/进程中

然而,Chromium团队似乎正在进一步隔离该区域:

[抱歉,链接不起作用-如果您能找到有效的问题链接,请让我知道]


在检查现有答案之前,我自己今晚也遇到了同样的问题。在我目前正在工作的项目中,我们必须加载一个使用不同框架的iFrame,如果该iFrame能够以某种方式阻止线程并影响我的应用程序,我很好奇。答案是可以的

我的测试是用铬做的。在父级中,我加载了一个子iFrame。在父级中,我为console.log设置了一个间隔,每次记录一个文本。然后在iFrame中,我使用了一个超时来启动阻止线程的“while”。答案是:iFrame使用相同的线程

例如:

在父项中:

setInterval(() => {
  console.log('iFrame still using the thread');
}, 3000)
在iFrame中:

setTimeout(() => {
  console.log('now the thread is not working in the iFrame anymore');
  while (true) {
  }
}, 10000)

最近测试了在iFrame中运行的JavaScript是否会阻止JavaScript在父窗口中运行

iFrame与父级位于同一域上:

  • 铬68.0.3440.84:块
  • Safari 11.0.2(13604.4.7.1.3):区块
  • Firefox 61.0.1:块
不同域上的iFrame作为父域

  • Chrome 68.0.3440.84:不会阻塞
  • Safari 11.0.2(13604.4.7.1.3):区块
  • Firefox 61.0.1:块
parent.html:

    <body>
    <div id="count"></div>
    <iframe src="./spin.html"></iframe>     
    <script>
        let i = 0;
        let div = document.getElementById("count");
        setInterval(() => {
            div.innerText = i++;
        }, 100);
    </script>
    </body>

设i=0;
让div=document.getElementById(“count”);
设置间隔(()=>{
div.innerText=i++;
}, 100);
spin.html:

    <body>
    <button id="spin">spin</button>
    <script>
        const spin = document.getElementById("spin");
        spin.addEventListener('click', () => {
            const start = Date.now();
            while (Date.now() - start < 1000) { }
        })
    </script>
    </body>

快速旋转
const spin=document.getElementById(“spin”);
spin.addEventListener('click',()=>{
const start=Date.now();
而(Date.now()-start<1000){
})

TL;医生:

只有chrome桌面(不,不是手机)是分开的线程

Firefox计划在2021H1年实现这一目标


我已经创建了一个小页面,在主页中以长循环间隔运行,并在主页和iframe中显示了一个动画。 您可以从要检查的浏览器转到该网站

如果下部动画(在“crossorigin”下)不停止运行,则它将有一个单独的线程

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
是布尔真值的结构化标头语法


这里有更多详细信息:

如果你发现了什么,很好。如果你不知道,我们就不可能不费吹灰之力就知道所有的浏览器。Chrome在每个标签上使用一个单独的过程。我不相信iFrame会有这种分离。为什么会有安全风险?这并不是说您能够在线程中执行本机代码。不管线程是什么,你只访问沙箱中的内容。我不确定浏览器如何根据跨域场景在父窗口和iFrame之间分配范围。据我所知,来自不同域的iframe会得到不同的线程。显然,我把范围和执行混为一谈。这似乎是正确的答案。我可能会尝试创建一个测试来演示它,并验证每个浏览器中的行为。只是想发表评论