网络浏览器如何处理网页的JavaScript内容? JavaScript内容是否被解析为DOM然后呈现?
我不需要规范,但我需要知道它是如何完成的。请告诉我在网页上处理JavaScript内容的整个过程。
答案 0 :(得分:30)
网页的script
部分由浏览器的JavaScript解释器处理,它可能是浏览器的固有部分,但通常是一个独特的模块,有时甚至是一个完全不同的项目(Chrome使用V8; IE使用JScript; Firefox使用SpiderMonkey;等。)。
当HTML解析器到达script
元素时,将读取解析器所执行的 all 并通过结束</script>
标记存储文本(或检索通过src
属性)。然后,除非作者使用defer
or async
attributes,否则所有HTML解析和渲染都会暂停,HTML解析器将脚本文本移交给JavaScript解释器。 JavaScript解释器在window
对象的上下文中解释JavaScript代码,并在完成后返回到HTML解析器,然后HTML解析器可以继续解析和显示页面。这个停止 - 所有 - 并且运行-JavaScript是页面的一些杰出人物recommend putting scripts at the bottom改善感知加载时间的原因。这也意味着script
标签按顺序处理,如果一个脚本依赖另一个脚本,这可能很重要。如果使用defer
或async
属性,则可以延迟脚本执行,直到稍后支持它的浏览器。页面上的所有脚本都在同一个全局执行上下文中执行,共享相同的全局命名空间和内存区域(因此可以相互交互)。
一旦页面被解析和渲染,就会发生各种事件 - 用户可以点击某些内容,浏览器窗口可以调整大小,鼠标可以移动元素。由于位于script
标记而运行的JavaScript代码可以“挂钩”这些事件,请求浏览器在事件发生时调用JavaScript中的函数。这允许JavaScript是交互式的 - 例如,用户点击页面上的元素,浏览器告诉JavaScript解释器它应该在JavaScript代码中运行函数X
。
正如您在上面所看到的,有两种不同的情况可以运行JavaScript代码:在页面解析/呈现过程中(当script
元素不使用defer
或<{1}}属性正在初始处理中),在解析/呈现过程之后(延迟脚本和响应事件而运行的代码)。在解析/呈现过程中运行的JavaScript可以通过async
函数直接将内容输出到HTML解析器。解析/渲染完成后运行的JavaScript当然不能这样做,但可以使用非常强大的DOM HTML API与DOM进行交互。
值得注意的是noscript
元素:在启用了JavaScript的浏览器中,document.write
元素被完全跳过。在没有JavaScript或禁用JavaScript的浏览器中,完全跳过noscript
元素,而是读取script
元素。这使得包含仅在呈现页面时在浏览器上启用或不启用JavaScript时才会显示的内容变得容易。
推荐阅读: