当您在浏览器中有文档时,该文档会加载来自同一源服务器的一个或多个帧。
那些帧是由与主窗口相同的线程执行的?
或者可能有一个重度过程的框架,其他框架不会冻结?
我没有找到任何规范,有人知道它存在于哪里?
答案 0 :(得分:5)
我不是“浏览器如何工作”的专家,但我预测的是:
你不能确定。这取决于引擎的类型(我们谈论),浏览器及其版本......
如果我们谈论布局渲染引擎(一般单线程);一切都在单个线程中的线性流中执行。 传统上,它是“浏览器”的主线程,然后使用IE7,每个浏览器“窗口”都有自己的主题。但它不断变化及时,现在主要是每个“标签”的单线程。
在标签内;当javascript正在执行时,呈现引擎等待它完成。原因是Javascript引擎传统上共享相同的单个线程(但不一定)。甚至,异步事件排队等待适当的执行时间。
另一方面,网络运营;通过多个并行线程处理。但是又一次;这些操作的回调被注入到主线程中的浏览器事件循环中。 (这就是为什么这些电话的数量通常是有限的。)
用于渲染;内部/嵌入框架(例如iframe
)受框架构造器(它负责每个具有大小,填充,边距,位置等的矩形框)的约束。脚本执行在主窗口的同一个线程中处理。 (再次“一般”因为在Opera中,如果它是iframe,情况可能并非如此。)
因此,每个浏览器都有一个内部调度实现,用于何时以及如何对事件/操作进行排队和执行。例如;下图显示了如何在Gecko浏览器中处理页面请求。
浏览器可以决定是推迟重排还是立即。一般来说,原因是优化速度和涂装,但立即回流主要是一项要求。例如,改变布局的javascript代码,例如更改DOM元素的高度。这应该是立即重排,以便渲染引擎可以准确地计算元素的边界并继续布局过程。有关Gecko Reflow Visualization的信息,请参阅this video。
回到关于非冻结重工序的第二个问题:
在Opera中,您可能会向iframe加载繁重的进程,并且可能无法阻止主窗口。但这也可能会及时改变。如果你无法获得承诺这一点的API;你不能依赖它作为非阻塞。作为开发人员,您应该考虑有关Javascript和DOM操作的单线程。
您可以在HTML5规范中查看 Web Workers 。他们可以通过JavaScript访问。我不相信这会给javascript带来多线程,因为工作人员只能通过消息与另一个线程交谈,而且不能直接访问DOM。但是,您仍然可以为工作人员分配繁重的计算,而不会干扰您所在的线程。