浏览器响应用户的机制是通过事件驱动的方式当用户与浏览器进行交互时,例如点击按钮或滚动页面,浏览器会捕获这些事件并触发相应的事件处理程序事件处理程序可以是预定义的浏览器内置函数,也可以是开发者自定义。浏览器响应用户的机制是什么?更多详情请大家跟着小编一起来看看吧!

浏览器响应用户的机制是什么

浏览器响应用户的机制是什么(1)

浏览器响应用户的机制是通过事件驱动的方式。当用户与浏览器进行交互时,例如点击按钮或滚动页面,浏览器会捕获这些事件并触发相应的事件处理程序。

事件处理程序可以是预定义的浏览器内置函数,也可以是开发者自定义的函数。一旦事件处理程序被触发,浏览器会执行相应的操作,例如更新页面内容、执行JavaScript代码或发送网络请求。

这种事件驱动的机制使得浏览器能够实时响应用户的操作,并提供交互性和动态性的用户体验。

浏览器响应用户的机制是什么

浏览器响应用户的机制是什么(2)

浏览器响应用户的机制包括以下几个关键步骤:

1. 用户输入请求:用户在浏览器地址栏中输入网址或通过链接点击等方式发起请求。

2. DNS解析:浏览器将输入的网址发送给域名服务器(DNS),以获取对应的IP地址。

3. 建立连接:浏览器使用TCPIP协议与目标服务器建立连接。这涉及到建立TCP握手、进行数据传输和接收确认等过程。

4. 发送请求:浏览器向服务器发送HTTP请求,其中包括请求行、请求头和请求体等信息。请求行包括请求方法(GET、POST等)、请求URI和协议版本。

5. 服务器响应:服务器接收到浏览器的请求后,根据请求的内容和类型,生成相应的HTTP响应,其中包括响应状态码、响应头和响应体等信息。

6. 接收响应:浏览器接收到服务器的响应后,解析和处理响应内容。根据响应的状态码,浏览器可能会执行相应的操作,例如页面跳转、资源加载、错误处理等。

7. 渲染页面:如果响应是一个HTML页面,浏览器会根据HTML标记、CSS样式和JavaScript脚本等信息,解析、渲染并显示页面内容。

8. 用户交互响应:一旦页面加载完成,浏览器将等待用户的交互操作。它会检测用户的键盘输入、鼠标点击、滚动等事件,并根据事件触发相应的处理函数或执行相应的操作。

9. 不断循环:浏览器会持续监测用户的交互操作和页面的变化,并相应地进行处理和更新。

以上是典型的浏览器响应用户的基本机制。每个步骤中都涉及到不同的协议和算法,包括网络协议、HTTP协议、渲染引擎等。不同浏览器的实现可能略有差异,但整体原理和流程基本类似。

浏览器响应用户的机制是什么

浏览器响应用户的机制是什么(3)

1. 浏览器是多进程的

GPU进程

最多一个,用于3D绘制等

Browser进程

负责浏览器界面显示,与用户交互。如前进,后退等

负责各个页面的管理,创建和销毁其他进程

将Renderer进程得到的内存中的Bitmap,绘制到用户界面上

网络资源的管理,下载等

第三方插件进程

每种类型的插件对应一个进程,仅当使用该插件时才创建

浏览器渲染进程(浏览器内核)

默认每个tab页一个进程

页面渲染,脚本执行,事件处理等

2. 浏览器渲染进程是多线程的

GUI渲染线程

负责渲染浏览器界面,解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。

当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行

注意,GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起(相当于被冻结了),GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。

js引擎线程

也称为JS内核,负责处理Javascript脚本程序。(例如V8引擎)

JS引擎线程负责解析Javascript脚本,运行代码。

JS引擎一直等待任务队列中任务的到来,然后加以处理,一个Tab页(renderer进程)中只有一个JS线程在运行

同样注意,GUI渲染线程与JS引擎线程是互斥的。所以如果JS执行的时间过长,要放在body下面,否则就会导致页面渲染加载阻塞。

事件触发线程

管理着事件队列

监听事件,符合条件时把回调函数放入事件队列中

定时触发器线程

setInterval与setTimeout在此线程中计时完毕后,把回调函数放入事件队列中

浏览器定时计数器并不是由JavaScript引擎计数的,(因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确),因此通过单独线程来计时并触发定时(计时完毕后,添加到事件队列中,等待JS引擎空闲后执行)

注意,W3C在HTML标准中规定,规定要求setTimeout中低于4ms的时间间隔算为4ms。

异步http请求线程

检测到XHR对象状态变化时,将回调函数放入事件队列中

event loop整体流程

3. repaint、reflow

repaint

repiant或者redraw遍历所有的节点检测各节点的可见性、颜色、轮廓等可见的样式属性,然后根据检测的结果更新页面的响应部分。

当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color。则就叫称为重绘

reflow

reflow指的是计算页面布局。某个节点reflow时会重新计算节点的尺寸和位置,而且还有可能触发其子节点、祖先节点和页面上的其他节点reflow。在这之后再触发一次repaint。

当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流,每个页面至少需要一次回流,就是在页面第一次加载的时候。

导致reflow的操作

调整窗口大小

改变字体

增加或者移除样式表

内容变化,比如用户在input框中输入文字

激活 CSS 伪类,比如 :hover (IE 中为兄弟结点伪类的激活)

操作 class 属性

脚本操作 DOM

计算 offsetWidth 和 offsetHeight 属性

设置 style 属性的值

它们会大大影响web性能,如何减少reflow、repaint

不要通过父级来改变子元素样式,最好直接改变子元素样式,改变子元素样式尽可能不要影响父元素和兄弟元素的大小和尺寸

尽量通过class来设计元素样式,切忌用style多次操作单个属性

实现元素的动画,对于经常要进行回流的组件,要抽离出来,它的position属性应当设为fixed或absolute

权衡速度的平滑。比如实现一个动画,以1个像素为单位移动这样最平滑,但reflow就会过于频繁,CPU很快就会被完全占用。如果以3个像素为单位移动就会好很多。

不要用tables布局的另一个原因就是tables中某个元素一旦触发reflow就会导致table里所有的其它元素reflow。在适合用table的场合,可以设置table-layout为auto或fixed,

这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围。

css里不要有表达式expression

减少不必要的 DOM 层级(DOM depth)。改变 DOM 树中的一级会导致所有层级的改变,上至根部,下至被改变节点的子节点。这导致大量时间耗费在执行 reflow 上面。

避免不必要的复杂的 CSS 选择器,尤其是后代选择器(descendant selectors),因为为了匹配选择器将耗费更多的 CPU。

尽量不要过多的频繁的去增加,修改,删除元素,因为这可能会频繁的导致页面reflow,可以先把该dom节点抽离到内存中进行复杂的操作然后再display到页面上。

请求如下值offsetTop, offsetLeft, offsetWidth, offsetHeight,scrollTopLeftWidthHeight,clientTopLeftWidthHeight,浏览器会发生reflow,建议将他们合并到一起操作,可以减少回流的次数。