关于浏览器对html,js,css的解析先后顺序的理解
1.⾸先要了解页⾯的结构(包含哪些元素?哪些计算机语⾔能够在页⾯中运⾏ )
(1)html
不仅可以包含⽂字,还可以包含图⽚、链接,甚⾄⾳乐、程序等⾮⽂字元素的标记语⾔
(展⽰给⽤户,不能太单调,css)
(2)css
是⼀种⽤来表现HTML的计算机语⾔,能使HTML页⾯变得更加美观
(要展⽰给⽤户光漂亮是不够的,⽤户还要能够动态的操作HTML页⾯,也就是让浏览器和⽤户之间的交互不仅仅是⽤户能浏览html中的内容,还要能对html页⾯操作,JavaScript)
(3)JavaScript
⽤来给HTML⽹页增加动态功能、交互⾏为
是⼀种解释性脚本语⾔(不进⾏预编译)
⽬前我们熟悉的语⾔Java、JavaScript、C、C++,都属于⾼级编程语⾔
①计算机不能理解⾼级语⾔,也就不能直接执⾏⾼级语⾔了
②计算机只能直接理解机器语⾔,所以任何语⾔,都必须将其翻译成机器语⾔,计算机才能运⾏⾼级语⾔编写的程序
③翻译的⽅式有两种,⼀个是编译,⼀个是解释。
1)编译:Java语⾔的运⾏先经过编译,但是JAVA语⾔的编译不是直接编译成计算机能识别的语⾔,⽽是编译成JAVA虚拟机能识别的class⽂件
functional structureJAVA语⾔就是典型的翻译⽅式为编译的编程语⾔,
虽然不是编译成计算机能直接识别的语⾔,但是同其他以编译为翻译⽅式的⾼级编程语⾔的原理⼤体上是相同的。
最明显:C/C++,可以编译成⼆进制代码,以可执⾏⽂件的形式存在(exe⽂件)
都是先编译再运⾏,⽽且是⼀次编译到处运⾏,效率⾮常⾼。(只需要在第⼀次运⾏的时候编译⼀次)
2)解释:解释性脚本语⾔的程序不需要编译,解释性脚本语⾔在运⾏程序的时候才翻译
解释性脚本语⾔有专门的解释器来负责解释,不过每次都需要翻译,效率⽐较低。
mysql下好是文件夹JavaScript 就是⼀种解释性脚本语⾔
④JavaScript也有⾃⼰专门的解释器——JavaScript引擎,它存在于浏览器端,作为浏览器的⼀部分
⼀句话:html(超⽂本标记语⾔)、css(层叠 样式表)、JavaScript脚本语⾔这三样东西在浏览器端相互配合、相辅相成形成了⽐较成熟的前端界⾯
(4)这三样东西在HTML页⾯中的位置
html的基本结构
<html> <head> <!-- 头部中包含的标记是页⾯的标题、序⾔、说明等内容,它本⾝不作为内容来显⽰,但影响⽹页显⽰的效果 --> </head> <body> <!-- 显⽰实际内容 --> </body> </html>
①html:贯穿整个页⾯
②css:三种声明⽅式
外联样式表:在head便签中 ⽤link标签的href属性来引⽤后缀名为.css的css样式⽂件
内联样式表:在head标签下的style标签中,选择器 + 样式声明
内部样式表:在标签的style属性中添加css样式声明
html个人网页完整代码顺序③JavaScript:在<script>标签中,可以在head标签中,也可以在body标签中(区别⼀会再说)
⼩总结:以上内容总结出⼀句话:⽬前为⽌,在整个html页⾯中,可以写html代码、css样式、JS脚本语⾔
位置:html贯穿整个页⾯,css可以定义在head头标签中,也可以在定义在html标签的属性中
JavaScript定义在<script>标签中,<script>标签既能在head标签中定义也能在body标签中定义
自动化设备数据库设计文档问题1:JQuery、EasyUI也可以写在html页⾯中
jQuery是⼀个快速、简洁的JavaScript框架(本质上也是JavaScript)
EasyUI:类库中都是以 .css和.js结尾的⽂件。别⼈写好的css样式和JavaScript(本质上也是css和JavaScript)
所以追其根源,html页⾯中就是 html、css、JavaScript
问题2:jsp中能编写Java代码
jsp是特殊的Servlet,本质是Java,是Java就要运⾏在服务器端,浏览器是不能解析Java代码的
为什么⽤浏览器访问jsp时能在浏览器端显⽰呢?
分两种情况:
①对于html⽂件,当我们⽤浏览器访问时能⾃动解析,解析完毕就会将内容展⽰在浏览器上
②对于jsp,当我们⽤浏览器访问时,我们写好的jsp⽂件会⽣成.java⽂件,服务器运⾏JAVA⽂件,会把jsp中编写的html代码,发送给浏览器
可以这样理解,我们编写的HTML⽂件被浏览器直接解析
⽽我们编写的jsp,是借助JAVA代码将html代码发给浏览器,浏览器再解析
本质上都是浏览器解析html代码(这⾥的html代码,包括刚才说的html、css、JavaScript)
2.加载顺序
<html> <head> <!-- 引⽤外部JS⽂件 --> <script src="..........."></script> <!--引⽤外部css样式 --> <link
href="............."/> <style> .............. </style> <script> .............. </script> </head> <body> <script> .............. </script>
竖式的数组词</body> </html>
从上到下运⾏,先解析head标签中的代码,
(1)head标签中会包含⼀些引⽤外部⽂件的代码,从开始运⾏就会下载这些被引⽤的外部⽂件
queryselector怎么用当遇到script标签的时候
浏览器暂停解析(不是暂停下载),将控制权交给JavaScript引擎(解释器)
如果 <script>标签引⽤了外部脚本,就下载该脚本,否则就直接执⾏,执⾏完毕后将控制权交给浏览器渲染引擎
(2)当head中代码解析完毕,会开始解析body中的代码
如果此时head中引⽤的外部⽂件没有下载完,将会继续下载
浏览器解析body代码中的元素,会按照head中声明⼀部分样式去解析
如果此时遇到body标签中的<script>,同样会将控制权交给JavaScript引擎来解析JavaScript
解析完毕后将控制权交还给浏览器渲染引擎。
当body中的代码全部执⾏完毕、并且整个页⾯的css样式加载完毕后,css会重新渲染整个页⾯的html元素。
(3)按照之前的描述,<script>写到body标签内靠后⽐较好,
因为JavaScript 会操作html元素, 如果在body加载完之前写JavaScript 会造成JavaScript 不到页⾯元素
但是我们经常将<script>写到head中,body中不会有⼤量的js代码,body中的html代码结构会⽐较清晰
$(document).ready(): 页⾯中所有DOM结构绘制完毕之后就能够执⾏
可以这样理解:load 和 $(document).ready()/$(function(){}); 相当于 写在body 内 最靠后的<script> 代码段
DOM⽂档的加载顺序是由上⽽下的顺序加载
1、DOM加载到link标签
css⽂件的加载是与DOM的加载并⾏的,也就是说,css在加载时Dom还在继续加载构建,⽽过程中遇到的css样式或者img,则会向服务器发送⼀个请求,待资源返回后,将其添加到dom中的相对应位置中;
2、DOM加载到script标签
由于js⽂件不会与DOM并⾏加载,因此需要等待js整个⽂件加载完之后才能继续DOM的加载,倘若js脚本⽂件过⼤,则可能导致浏览器页⾯显⽰滞后,出现“假死”状态,这种效应称之为“阻塞效应”;会导致出现⾮常不好的⽤户体验;
⽽这个特性也是为什么在js⽂件中开头需要$(document).ready(function(){})或者(function(){})或者load,即是让DOM⽂档加载完成之后才执⾏js⽂件,这样才不会出现查不到DOM节点等问题;
js阻塞其他资源的加载的原因是:浏览器为了防⽌js修改DOM树,需要重新构建DOM树的情况出现;
3、解决⽅法
前提,js是外部脚本;
在script标签中添加 defer=“ture”,则会让js与DOM并⾏加载,待页⾯加载完成后再执⾏js⽂件,这样则不存在阻塞;
在scirpt标签中添加 async=“ture”,这个属性告诉浏览器该js⽂件是异步加载执⾏的,也就是不依赖于其他js和css,也就是说⽆法保证js⽂件的加载顺序,但是同样有与DOM并⾏加载的效果;
同时使⽤defer和async属性时,defer属性会失效;
可以将scirpt标签放在body标签之后,这样就不会出现加载的冲突了。
CSS样式为什么放在head中,⽽不放在body底部
放在body底部,浏览器会快速闪⼀下"css样式加载顺序", 这时的样式是浏览器默认样式,说明了浏览器已经渲染过⼀次;等底部css⽂件加载完,⼜重新渲染⼀遍;放在head中,在加载html前,加载完了css⽂件,这时渲染⼀次就OK了。
结论:
放在body底部,在DOM Tree构建完成之后开始构建render Tree,计算布局然后绘制⽹页,等css⽂件加载后,开始构建CSSOM Tree,并和DOM Tree⼀起构建render Tree,再次计算布局重新绘制;
放在head中,先加载css,构建CSSOM,同时构建DOM Tree,CSSOM和DOM Tree构建完成后,构建render Tree,进⾏计算布局绘制⽹页。
总体来看,放在body底部要⽐放在head中多⼀次构建render Tree,多⼀次计算布局,多⼀次绘制,从性能⽅⾯来看,不如放在head中。再次,放在body底部⽹页会闪现默认样式的DOM结构,⽤户体验不好。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论