今天看了一篇前段大全推送的“js一定要放在body的最底部么?聊聊浏览器的渲染机制”。正好今天在《javascript Dom 编程艺术》上看到有说,<script>标签应该放在body的底部,所以就很有兴趣点进去学习了。

学习了几个概念:

1.DOM:Document Object Model,浏览器将HTML解析成树形的数据结构,简称DOM.

2.CSSOM:CSS Object Model,浏览器将CSS代码解析成树形的数据结构。

3.DOM和CSSOM都是以Bytes->characters->tokens->nodes->object model.这样的方式生成最终的数据。DOM树的构建过程是一个深度遍历的过程:当前节点的所有节点都构建好了才会去构建当前节点的下一个兄弟节点。

3.Render Tree : DOM和CSSOM合并后生成Render Tree。Render Tree和DOM一样,以多叉树的形式保存了每个节点的css树形、及诶到哪本身属性和节点的孩子节点。

小知识点:display:none的节点不会被加入RenderTree,而visiblility:hidden会,所以若某及诶到哪最开始是不显示的,设为display:none是更优的。

浏览器的渲染过程

1.create/update DOM And request css/image/js:浏览器请求到html代码后,在生成DOM的最开始阶段(Bytes->characters后),并行发起CSS、图片、js的请求

2.Create/update Render CSSOM:CSS文件下载完成,开始构建CSSOM

3.Create/update Render Tree:所有CSSOM构建结束后,和DOM一起生成Render Tree

*之所以用Create/update是因为这三步都可能在第一次Painting后被更新多次,比如JS修改了DOM或者CSS属性

4.Layout:有了Render Tree,浏览器已经知道网页中有哪些节点、及各个节点的CSS定义及他们的从属关系,这一步就是计算出每个节点在屏幕中的位置。

5.Painting:按照规则,通过显卡,把内容画到屏幕上。

*Layout和painting也会执行多次,如在图片等资源下载好后。

此文章作者经过跑了一个网站的代码,通过timeline得出浏览器的实际处理过程:

1.运行浏览器自带脚本->发起请求,包括CSS、图片、js->资源全部下载好后触发load事件,然后painting了一次->等到jquery.js下载并执行好后又Painting了一次->触发DomContentload事件

因此得出:

1.首屏事件和DomContentload事件没有必然的先后关系。

2.所有CSS尽早加载是减少首屏事件的最关键因素。(首屏不代表一个完整页面,可能只是渲染了一部分)

3.js的下载会中断Dom树的更新,所以script标签放在首屏范围内的HTML代码段中会截断首屏的内容。(所以,为了更快速显示出完整的界面,个人认为js放在最后加载,可以使完整的画面更早出来,放在底部是有一定道理的。)

4.普通script标签放在body底部,做不做async或defer处理,都不会影响首屏时间,但影响DomContentload和load的时间,进而影响依赖他们代码的执行开始时间

得出结论:js放置位置。不会影响首屏时间,但是首屏可能会有所截断,使其只显示上面的一部分

工作中学到的小知识点:

1.在js中,存在父窗口和子窗口,则在子窗口可以用parent获取到父窗口的对象,如父窗口的tabpanel,在子窗口可以使用parent.tabpanel获取到。

2.Ext.util.Format.nl2br(value)可以将value中换行符转换成<br/>

2017年1月16日

转载于:https://www.cnblogs.com/DavidChung/p/6298138.html

js一定要放在body的最底部么?聊聊浏览器的渲染机制相关推荐

  1. JS一定要放在Body的最底部么?

    一.从一个面试题说起 面试前端的时候我喜欢问一些看上去是常识的问题.比如:为什么大家普遍把 <script src=""></script> 这样的代码放在 ...

  2. JS文件应该放在什么位置

    我们今天来聊一聊关于JavaScript文件的引入位置的问题:大家在平时的Web开发中有没有想过这样一个问题,那就是我应该在文档的头部(也就是<head>标签内部里面)引入所需要的Java ...

  3. js实现鼠标放在div 悬浮显示另一个div内容链接 (不占位置)

    js实现鼠标放在div 悬浮显示另一个div内容链接 (不占位置) 代码如下 不喜勿喷 简单记录前端小知识 <div><a id="div1" href=&quo ...

  4. js重新渲染div_前端工程师必备:从浏览器的渲染到性能优化

    文章来自:华为云开发者社区 摘要:本文主要讲谈及浏览器的渲染原理.流程以及相关的性能问题. 问题前瞻 1. 为什么css需要放在头部? 2. js为什么要放在body后面? 3. 图片的加载和渲染会阻 ...

  5. JS高级 之 深入浏览器的渲染原理

    在浏览器中输入网址按回车后发生了什么, 其实,发生的事情很简单,主要有三大步 找到资源 下载资源 解析资源渲染到页面 目录 一.DNS解析,找到资源 1. 查询浏览器缓存 2. 查询操作系统缓存 4. ...

  6. 使用js直接下载pdf文件而不用在新的浏览器窗口打开

    最近接了一个需求,要求用户点击下载按钮后直接下载pdf文件,而不是打开一个新窗口,让用户再去手动保存. 接到需求后我立刻着手在网上查找文档,发现很多声称可以实现直接下载的方法都不行,只有下面这个方法成 ...

  7. 【Chrome浏览器插件开发】浏览器插件运行机制03之实战使用Vue.js 3 + Vite 2开发出简易的浏览器插件(含源码)

    文章目录 知识点: 一.使用 vite 创建项目 1.1 环境搭建 1.2 安装vite工具 1.3 创建vite项目 1.4 进入项目并安装依赖 1.5 修改端口 1.6 运行项目 二.创建项目资源 ...

  8. 怎么找html代码js的位置,html文件里引用js文件一般放在什么位置才是最适合?

    题目: 放在HTML里的哪一部分JavaScripts会在页面加载的时候被执行? A. 文件头部位置 B. 文件尾 C . 标签部分 D . 标签部分 想要知道js文件在html中的加载解析执行情况? ...

  9. EXT.JS的PROXY放在哪里,STORE放在哪里,绝对是个技术活儿啊。

    我理解的是,单独的STORE,会在应用程序开始时就加载, 而VIEWMODEL的STORE,会在VIEW加载时才开始加载. PROXY放在STORE,则会在调用这个STORE的VIEW才能请求服务器数 ...

最新文章

  1. C语言图书管理系统注册功能,图书管理系统的c语言源程序
  2. The request sent by the client was syntactically incorrect. 错误以及spring事物
  3. linux注册硬盘中断,基于Linux底层硬盘中断辅助代码的分析与设计
  4. 2021暑假实习-SSM超市积分管理系统-day09笔记
  5. 使用PyQT编写界面程序
  6. 【数学】Element Swapping
  7. Angularjs 中使用 layDate 日期控件
  8. 区块链 平行链 侧链 区别
  9. 用友数据库服务器如何修改,用友u8数据库服务器怎么设置
  10. 栅栏布局合并html,制作简约CSS栅栏布局
  11. VS2013配置OpenCV3.4.0
  12. Python — sklearn 分类效果评估
  13. web前端入门到实战:行内和块状元素水平居中与单行或多行文本垂直居中及隐性改变display类型
  14. KinectFusion
  15. 关于自己学C的点滴记录
  16. 禁用微信字体缩放功能
  17. Datawhale组队学习周报(第027周)
  18. 周大侠歌曲计算机,周大侠 周杰伦 周大侠歌曲,周大侠mp3在线试听 - 5nd音乐网
  19. 海康摄像头视频实时监控
  20. JS判断客户端是Android还是iOS

热门文章

  1. 笔记 | 《机器学习》半监督学习
  2. 机器学习之特征工程-特征选择
  3. 作文 深海机器人_海底寻宝机器人
  4. python路径拼接os.path.join()函数完全教程_详解python路径拼接os.path.join()函数的用法...
  5. php 生成腾讯云签名方法,PHP生成腾讯云COS接口需要的请求签名的相关内容
  6. java控制台输出五行字符串_java五行代码导出Excel
  7. 关于在vSphere环境中,安装WindowsServer2008_R2_x64系统,分区格式为GPT,隐藏分区为200M方法心得
  8. python拓展库random_一分钟让你学会Python Random库的使用
  9. nginx-正则表达式-重定向
  10. Java集合Map与其子类回顾