Flash的“d性跑道”是从浏览器继承的。当然,在浏览器范围内,我们不会这样称呼-我们将其称为事件循环。
javascript事件循环的历史始于在Netscape上进行渐进式GIF和JPEG渲染。渐进式渲染(部分加载内容的绘图)是Netscape实施异步下载渲染引擎所必需的。当Brendan
Eich实现javascript时,该异步事件循环已经存在。因此,向其添加另一层是一项相当简单的任务。
因此,浏览器的事件循环如下所示:
Event loop ┌──────────┐ │ │ │ │ │ ▼ │ check if there's any new ───────▶ parse data │ data on the network │ │ │ │ │ ▼ │ │ check if we need to execute ◀─────────┘ │ any javascript ──────────────────▶ execute │ │ javascript │ ▼ │ │ check if we need to ◀────────────────┘ │ redraw the page ──────────────▶ redraw page │ │ │ │ │ │ └────◀─────┴─────────────────◀─────────────────┘
其余的,正如他们所说,是历史。当Microsoft复制javascript时,他们不得不复制事件循环以保持与Netscape的兼容性。因此,形式上每个人都必须做同样的事情以保持与Netscape和IE的兼容性。
请注意,Javascript没有任何功能可以手动递归到事件循环中(某些语言,例如tcl,可以做到),因此浏览器必须等到没有其他javascript执行后才能重画页面。在脚本结束之前不能强制进行页面重绘。
因此,当您尝试在创建后立即读取它们时,诸如元素的宽度或高度之类的计算值有时会返回错误的值-
浏览器尚未绘制它们。如果您确实需要在页面重绘后执行代码,则解决方法是
setTimeout使用超时值为0的a来允许浏览器运行事件循环的一轮。
其他细节:
似乎有一种例外情况会触发昂贵的回流。请注意,重排是浏览器计算页面布局。如果浏览器需要绘制更改的页面,通常会触发该事件。
当页面中的某些内容发生更改时,将对重排计算进行排队-
不会立即执行。如以上说明中所述,重排将仅在javascript执行结束时执行。但是有一种情况会导致浏览器立即执行重排计算:如果您尝试读取任何计算出的值,例如宽度和高度。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)