对于HTML页面中CSS, JS, HTML的加载与执行过程的简单分析
来自 https://blog.csdn.net/u011088260/article/details/79563315
最近在研究HTML页面中JavaScript的执行顺序问题。在JavaScript中,定义一个方法或者函数有很多方式,最常见的有2中,function语句式与函数直接量方式。
对于function语句式,解释器会优先解释。即加载了这个js文件后,会扫描一下所有的js代码,然后把该优先执行的东西先执行了,然后再从上到下按顺序执行。所以,定义的代码可以在执行的代码后边。就跟C#中的方法定义一样。解释器已经记住了这个方法,知道在内存中的哪里,用的时候直接去取就行了。
C#语言是,对象中的属性与方法具有优先的解释权,先放到内存中,之后哪里都可以用,所以没有先后顺序。这也是对象定义的时候,字段中不能有任何计算的原因。因为字段在优先解释的时候,只是为这个对象开辟内存空间,然后把值放入到内存空间。一个字段肯定不会用到另外的一个字段,因为字段定义的时候,是没有计算的。如果用到了另外一个字段,那肯定是有计算了,就报错了。
但是函数直接量方式,地位跟一般的普通变量一样,没有优先解释权。是在正常的从上到下运行过程中,遇到了才在内存中分配地址。遇到之前,解释器里根本没这个东西,不知道是什么。所以下边的这个代码就会出错。
接下来我们来看一个例子,一段代码。
- <html>
- <head>
- <script>
- test();
- </script>
- </head>
- <body>
- <div>HelloWorld</div>
- //HHHHHHHHHHHHHHHH
- </body>
- <script>
- functiontest()
- {
- alert('a');
- }
- </script>
- </html>
这段代码在页面中运行的时候是报错的。不是说function语句式定义的函数,在前边调用也可以吗?但是注意,调用与定义要在同一个script代码块中。在这个例子中,在不同的script语句块中,所有报错了。但是如果前边定义,后边调用,就可以。
现在来分析一下所有的这些CSS,HTML,JS文件的执行顺序。接下来仅仅是我自己的一些观点。
当浏览器向服务器发起一次请求之后,xxx.com,服务器会向浏览器返回字符串,即HTML代码。接下来的执行情况是这样的。浏览器会一点点的从头接收这些字符串,然后从<html>节点开始分析,从上到下,遇到<script>节点就开始执行JS代码,在此同时,也会一点点的加载HTML控件。(分析与执行JS代码与加载HTML控件是两个同时进行的线程)所以现在document.getElementById这个方法如果获取页面尾部的控件,很有可能为空,因为这时候还没有加载到。而且,在此同时,浏览器也在加载外部CSS文件,并且应用到相应的控件上。
在更新页面内容HTML组件的,叫做UI Upate线程。
我的理解是,这些都是在同时进行的,但是加载HTML控件稍微快一些,CSS稍微慢一些,这就是为什么一个CSS复杂的页面,刚刚load的时候是布局混乱的,过一会就好了。因为那时候CSS还没有加载完全。
在加载HTML的同时,如果css没有加载下来,那么HTML标签中的class就不会起作用。如果CSS很大,那么一时半会不会加载下来,就会看到没有任何格式化的HTML文字。这时候就显示出inline html的好处了,在加载HTML的时候能够立即显示。当然这只是一个方面,也会造成的后果是HTML页面的加载慢,导致长时间白屏。
JS与CSS相互之间的影响也是有可能存在的。
JS 有可能会修改 DOM.典型的,可能会有 document.write. 这意味着,在当前 JS 加载和执行完成前,后续所有资源的下载有可能是没必要的。这是 JS阻塞后续资源下载的根本原因。
JS的执行有可能依赖最新样式。比如,可能会有
var width = $('#id').width(). 这意味着,JS 代码在执行前,浏览器必须保证在此 JS之前的所有
css(无论外链还是内嵌)都已下载和解析完成。这是 CSS 阻塞后续 JS 执行的根本原因。
https://lifesinger.wordpress.com/2012/02/03/performance-impact-of-js-css-loading-order/
对于HTML页面中CSS, JS, HTML的加载与执行过程的简单分析的更多相关文章
- 用 Flask 来写个轻博客 (28) — 使用 Flask-Assets 压缩 CSS/JS 提升网页加载速度
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Flask-Assets 将 Flask-Assets 应用 ...
- JS性能优化——加载和执行
JavaScript 在浏览器中的性能,可以认为是开发者所面临得最严重的可用性问题.这个问题因JavaScript的阻塞特性变得复杂, 也就是说当浏览器在执行JavaScript代码时,不能同时做其他 ...
- js dom元素加载完成执行
//dom ready执行 function ready(fn){ if(document.addEventListener){ document.addEventListener('DOMConte ...
- JS脚本加载与执行对性能的影响
高性能JavaScript-JS脚本加载与执行对性能的影响 在web产品优化准则中,很重要的一条是针对js脚本的加载和执行方式的优化.本篇文章简单描述一下其中的优化准则. 1. 脚本加载优化 1.1 ...
- MVC学习随笔----如何在页面中添加JS和CSS文件
http://blog.csdn.net/xxjoy_777/article/details/39050011 1.如何在页面中添加Js和CSS文件. 我们只需要在模板页中添加JS和CSS文件,然后子 ...
- 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数
[问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...
- js中全局变量修改后的值不生效【jsp页面中各个js中内容的加载顺序】
一个老项目中,一个jsp文件中有很多个js文件, 现在要在页面上的一个地方判断一个状态,因为一直找不到原来是在哪里修改的那个状态,所以决定不找了,而是在比较靠前引入的一个js中定义一个全局变量,然后在 ...
- SpringMvc架构下css、js、jpg加载失败问题
SpringMvc架构下css.js.jpg加载失败问题 springMvc搭建成功后,页面出现一些错误,jsp.js等静态资源加载失败.导致页面没有显示任何样式以及 此处原因很简单,是因为相对路径在 ...
- 关于html,css,js三者的加载顺序问题
<head lang="en"> <meta charset="utf-8"> <title></title> ...
随机推荐
- css实现响应式布局的相关内容
所以我就在做自适应的时候查了一些资料 首先我发现一个问题:有响应式布局和自适应布局两种布局效果 简单来说,响应式布局就是不同的设备无论大小 布局都自动调整大小 页面布局都一样 可以保证无论什么设备 用 ...
- 基于c#的windows基础设计(学习日记1)【关于异或运算】
第一次接触异或运算,总体来说比哈希算法简单的多,无论是理解还是代码的难易度,唯一不好的是在固定了密钥之后,随机性就小了很多,所以安全性比起哈希算法还是有所差距. 原理在网站上很多都有所以就不再赘述了. ...
- 聚合函数count()
2018-08-12
- Linux SSH登录很慢的解决方法
一:UseDNS OpenSSH在用户登录的时候会验证IP,它根据用户的IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法.如果客户机的IP没有域名,或者DNS服务 ...
- LINK : fatal error LNK1104: cannot open file .exe' 重开application Experience 服务即可
这是一个坑, , 答案五花八门这个解决了我的痛点. 就这样了.
- nginx传世经典
nginx的简单介绍与安装nginx的简单介绍 一.Nginx的产生 Nginx是一款高性能的 HTTP 和反向代理服务器,由俄罗斯人Igor Sysoev(伊戈尔·赛索耶夫)为俄罗斯网站Ramble ...
- 环境搭建、RF库
一.Python27安装 1.双击安装python-2.7.13-64位.msi 2.检查python:cmd命令行→[python]→回车,出现如图所示,表示成功 可能出现:'python'不是内部 ...
- What is the RESTful API ?
REST 是 RepresentationalStateTransfer 的缩写,一般中文译为 “表征状态转移”,Roy Thomas Fielding 在他2000年的PhD论文中发明了这个概念.首 ...
- 【坑】https证书链不完整的坑
支付宝支付回调https失败,微信分享https连接在微信里打开空白,而chrome等浏览器访问正常. 是的,以上问题我作为半个运维在项目中遇到了,就是由于https证书链不完整引起的. 好吧,其实压 ...
- mac出现zsh: command not found: ping解决方法
Step1:终端输入以下命令: /sbin/ping 若出现如下信息,说明包含ping命令,是zsh的 PATH有问题,表示没有加载sbin下的命令,需要编辑.zshrc文件. Step2:终端打开. ...