理解浏览器是如何加载及渲染网页的

先上图,我们再慢慢解释,这图就是浏览器加载网页的一个过程

clipboard.png

当我们在浏览器输入一个地址(比如:http://toadw.cn),那么点击回车后,浏览器是如何加载网页的呢?

加载过程

一开始浏览器是不知道你输入的http://toadw.cn这个东西是什么的,也不知道要去哪里给你找这个网页,他需要向DNS服务发出解析请求
大致的步骤如下:

  1. 浏览器发送toadw.cn寻址请求给DNS服务

  2. DNS返回数据告诉浏览器toadw.cn的服务器地址是255.255.255.255

  3. 本地电脑缓存DNS数据,并发送请求给255.255.255.255这个服务器,然后浏览器和服务器根据HTTP协议进行通讯

网页渲染

浏览器拿到HTML代码之后,它是如何显示给大家看的呢?其实所谓的渲染就是讲HTML代码根据CSS定义的规则显示在浏览器窗口中的这个过程

  1. 首先浏览器先把这个HTML文档先转化为DOM树,然后根据这个DOM树,进行渲染,转化为可视的东西

  2. 在渲染的时候,浏览器从上到下依次渲染DOM树,当发现有外链资源或脚本<link>、<img>、<script>的时候会异步发起请求加载,同时DOM树的解析继续。一般我们都会把style都放在head里面,那么这样浏览器就先拿到了css样式文件,他就知道如何讲每个元素绘出来放在哪个位置。

  3. 如果遇到图片<img>浏览器不会等图片加载完再去加载,而是继续加载,这样就会出现个问题,当图片加载完时,在页面插入图片会影响页面的结果,浏览器就又要重新排布,这样浏览器又要花费时间跟经历去排布,所有如果图片是固定的尺寸,我们在写CSS的时候就应该给他加上宽高,浏览器就会预留一个位置给图片,这样就避免了重新排布

  • 回流(重排reflow)

    上文中将到的重新排布就是回流,网页加载慢,有一部分原因就是回流,因为浏览器要耗更多的时间去重新排布渲染,但回流也是不可避免的,因为网页中的一些效果,如鼠标滑过、点击效果等引起了页面上某些元素的占位面积、定位方式、边距包括浏览器的伸缩等的变化都会发生回流。但也有些事可以避免的,例如上文中说的给图片定死宽高。

  • 重绘(repaint)

    有个和 reflow 看上去差不多的术语:repaint,中文叫重绘。如果只是改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器 repaint。repaint 的速度明显快于reflow

$(img).css('width',200px)//重排
$(body).css('backgroud','#fff')//重绘

window.onload()与$(document).ready()的区别

理解了浏览器是如何渲染页面之后我们再来比较这两者就很好理解了

  • 执行的时间

    window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行。 
    $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕。
    
  • 可编写个数不停

    window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个 
    $(document).ready()可以同时编写多个,并且都可以得到执行
  • 简化缩写

    window.onload没有简化写法 
    $(document).ready(function(){})可以简写成$(function(){});也可写成$().ready()
    

$().load()和window.onload()的区别

这里又会联想到 $().load()window.onload()有没有区别?
查看jq文档load()事件的定义是

当指定的元素(及子元素)已加载时,会发生 load() 事件。且$(window).load 方法是 $(window).on('load',handler) 的shortcut

所以$(window).load()window.onload()是没区别的,唯一的小区别就是$(window).load()可以写很多个。

最后来个小练习

如何用原生的JS实现$(doucment).ready()?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS下的Mysql的安装和使用

1.使用安装命令 &#xff1a;yum -y install mysql mysql-server mysql-devel 安装完成却发现Myserver安装缺失&#xff0c;在网上找原因&#xff0c;原来是因为CentOS 7上把MySQL从默认软件列表中移除了&#xff0c;用MariaDB来代替&#xff0c;所以这导致我们必须要去官网上…

NOIP模拟题——神秘大门

【题目描述】最近小K大牛经过调查发现&#xff0c;在WZland的最南方——WZ Antarctica 出现了奇怪的磁场反应。为了弄清楚这一现象&#xff0c;小K 大牛亲自出马&#xff0c;来到了WZ Antarctica。小K大牛发现WZ Antarctica 出现了一道神秘的大门。人总有好奇心&#xff0c;小K…

大学c语言程序设计大赛,关于举办宁夏大学第二届C语言程序设计大赛的通知

各学院&#xff1a;根据学校《关于进一步加强基础课教学改革的意见》(宁大校发〔2008〕178号)、《关于加强学生创新精神和创新能力培养的实施意见》(宁大校发〔2008〕75号)的有关文件精神&#xff0c;经研究决定举办宁夏大学第二届C语言程序设计大赛&#xff0c;从中选拔出优秀…

Android中创建自己的对话框

Activities提供了一种方便管理的创建、保存、回复的对话框机制&#xff0c;例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法&#xff0c;如果使用这些方法的话&#xff0c;Activity将通过getOwnerActivity()方法返回该Act…

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11

搭建Django2.0Python3MySQL5时同步数据库时报错&#xff1a; django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None 解决办法&#xff1a; 找到Python安装路劲下的Python36-32\Lib\site-packages\django\db\backend…

一件很好笑的事情

我是一个比较习惯努力学习的人&#xff0c; 我也会去学习各种可能与我有交集的知识&#xff0c; 就在这几天&#xff0c;我看到以前的一个android网络培训学校开办了C/C的培训&#xff0c;这是挺好的事&#xff0c; 但是看他们的文件&#xff0c;我就奇怪了。 这份文件&#xf…

c语言实现循环链表,c语言实现循环链表的基本操作

循环链表和单链表其实区别不大,差别仅在于算法中的循环条件不是p或者p->next,而是是否等于头指针。下面这个例子简单的实现了循环链表的基本操作,其中插入和删除只是完成了主要的部分,没有判断。#include#includestruct Data{char name;int age;};struct CirList{Data *data…

关于Eclipes的Logcat无法打印消息的解决办法

转自&#xff1a;http://blog.csdn.net/harry211/article/details/8453532 调试程序需要打印一些消息出来&#xff0c;logcat不好用的话就很麻烦了。这个问题折腾了好久&#xff0c;为啥就是不出来呢&#xff1f; 上网找了很多解决办法&#xff1a; 重启eclipse 重启adb 重启…

17:文字排版

17:文字排版 查看提交统计提问总时间限制: 1000ms内存限制: 65536kB描述给一段英文短文&#xff0c;单词之间以空格分隔&#xff08;每个单词包括其前后紧邻的标点符号&#xff09;。请将短文重新排版&#xff0c;要求如下&#xff1a; 每行不超过80个字符&#xff1b;每个单词…

解决AttributeError: 'str' object has no attribute 'decode'报错问题

顺着报错文件点进去&#xff0c;找到query query.decode(errors‘replace’) 将decode修改为encode即可

c语言指针数组课件,C语言指针与数组教程课件.ppt

C语言指针与数组教程;教学要求;本章主要内容;引子;#include void swap ( int x, int y ) { printf("调用时&#xff1a;x地址为&#xff1a;%p, 值为&#xff1a;%d\n",&x,x); printf("调用时&#xff1a;y地址为&#xff1a;%p, 值为&#xff1a;%d\n"…

Android控制EditText的焦点

在项目中&#xff0c;一进入一个页面, EditText默认就会自动获取焦点。 那么如何取消这个默认行为呢&#xff1f; 在网上找了好久&#xff0c;有点 监听软键盘事件&#xff0c;有点 调用 clearFouse()方法&#xff0c;但是测试了都没有&#xff01; xml中也找不到相应的属性可以…

解决python中html 代码被注释掉 依旧被解释导致报错ERROR:tornado.access:500 GET /home (xxx.xxx.xxx.xxx)

ERROR:tornado.access:500 GET /home (xxx.xxx.xxx.xxx) 注释的是Html代码&#xff0c;是给浏览器看的。 Html里的代码还是要执行。注释python代码用{# #}

springMvc 传子 bean 中有bean

2019独角兽企业重金招聘Python工程师标准>>> bean 类型 如下 1. json 字符串 $.ajax({ url :${ctx}/test/testData/f1?bookjava, type: post, dataType : "json", con…

通过rsync搭建一个远程备份系统(二)

Rsyncinotify实时备份数据 rsync在同步数据的时候&#xff0c;需要扫描所有文件后进行对比&#xff0c;然后进行差量传输&#xff0c;如果文件达到了百万或者千万级别以上是&#xff0c;扫描文件的时间也很长&#xff0c;而如果只有少量的文件变更了&#xff0c;那么此时rsync是…

C语言扫地雷游戏的题目简介,C语言程序设计课程设计(论文)-扫地雷游戏.doc...

C语言程序设计课程设计(论文)-扫地雷游戏辽 宁 工 业 大 学C语言程序设计 课程设计(论文)题目&#xff1a; 扫地雷游戏院(系)&#xff1a; 软件学院专业班级: 电子商务091班学 号:学生姓名&#xff1a;指导教师&#xff1a;教师职称&#xff1a; 助 教起止时间&#xff1a;2009…

关于地图中轨迹的平滑移动的实现

很多人应该都有类似的经历&#xff0c;叫完车&#xff0c;想看看车离我还有多远距离&#xff1f;但手机屏幕上的车不是一动不动&#xff0c;就是一跳一跳的漂移。 目前市面上大多产品“轨迹平滑移动”做的并不好。 市面上只有快的打车和一号专车实现了平滑移动&#xff0c;那…

查看centos中的用户和用户组

1、用户列表文件&#xff1a;/etc/passwd/ 2、用户组列表文件&#xff1a;/etc/group 3、查看系统中有哪些用户&#xff1a; cut -d : -f 1 /etc/passwd 4、查看可以登录系统的用户&#xff1a; cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1 5、查看用户操作…

【Android】关于参数的传递问题

最近遇到了一个bug&#xff0c;在debug条件下可以看出更改后的值&#xff0c;但是在最终显示的结果中确实没有更改的值。经过很多次的调试后&#xff0c;才发现最后的原因竟然是因为参数传递的时候并没有将更改后的值传递给最终变量。 这时才意识到java中只存在值传递&#xff…

android按钮响应事件吗,Android 按钮响应事件的几种方式

目录1.在布局中指定onClick属性布局代码android:id"id/btn1"android:layout_width"wrap_content"android:layout_height"wrap_content"android:text"button1"android:onClick"click"/>android:id"id/btn2"andr…