重绘和重排 ok
重绘:当元素的一部分属性发生改变,
如背景、颜色等不会引起布局变化,
只需要浏览器根据元素的新属性重新绘制,
使元素呈现新的外观叫做重绘。
重排(回流):当render树中的一部分或者全部,
因为大小边距等问题发生改变,而需要DOM树重新计算的过程
所以简单的来说就是。会引起布局的变化,叫做重排(回流)。
不会引起布局的变化,叫做重绘。
『重绘』不一定会出现『重排』,『重排』必然会出现『重绘』。
tip:所以在我们平时写css的时候,还是要按照html中类的顺序来写。
否者可能会造成重排,重排是需要消耗浏览器性能的哈。
引起重排的地方 ok
1.添加、删除可见的dom
2.元素的位置改变
3.元素的尺寸改变(外边距、内边距、边框厚度、宽高)
4.页面渲染初始化
5.浏览器窗口大小改变
6.改变文字大小
7.操作class属性
8.内容的改变,(用户在输入框中写入内容也会)
add,del-->位置-->尺寸--初始化
窗口-->字体-->内容-->操作class属性
如何避免重绘或者重排?ok
#### 1.集中改变样式 #### 2.使用createDocumentFragment #### 2.使用createDocumentFragment 我们可以通过createDocumentFragment创建一个游离于DOM树之外的节点, 然后在此节点上批量操作,当完成所有的操作后,最后插入DOM树中,这样只触发一次重排 var fragment = document.createDocumentFragment(); for (let i = 0;i<10;i++){ let node = document.createElement("p"); node.innerHTML = i; fragment.appendChild(node); } document.body.appendChild(fragment);
12.前端如何实现即时通讯?
1.短轮询,使用setTimeout。
每隔一段时间客户端就发出一个请求,去获取服务器最新的数据,一定程度上模拟实现了即时通讯。
优点:兼容性强,实现非常简单
缺点:延迟性高,非常消耗请求资源,影响性能
2.Websocket:
Websocket是一个全新的、独立的协议,基于TCP协议。
可以在服务器和客户端之间建立【实时】的【双向通信】。
优点:真正意义上的实时双向通信,性能好,低延迟
缺点:需要额外的项目改造,使用复杂度高,必须引入成熟的库,无法兼容低版本浏览器
3.Web Worker
Web Worker 的作用,就是为 JavaScript 创造【多线程环境】,
允许主线程创建 Worker 线程,将一些任务分配给后者运行
4.Service workers
Service workers 本质上充当Web应用程序与浏览器之间的代理服务器,
也可以在网络可用时作为浏览器和网络间的代理,创建有效的离线体验。
https://www.cnblogs.com/wangxi01/p/11590178.html
13 什么是跨域 ok
协议, 域名, 端口号, 不同就是不同的域。
不同的域之间相互请求资源,就叫“跨域”。
ps:https与http也是不同的域
浏览器基于:“同源策略”
认为跨域请求是不安全的 所以拒绝访问。
14.什么是浏览器同源策略? 理解
同源策略是一个重要的安全策略,
它用于限制一个origin上的文档或者它加载的脚本如何能与另一个源的资源进行交互。
它能阻隔恶意文档,减少被攻击的媒介。
协议, 域名, 端口号 相同就是同源
15 哪三个标签可以不受同源的影响 ok
浏览器中的大部分内容都是受同源策略限制的,但是以下三个标签可以不受限制:
<img src=XXX> <link href=XXX> <script src=XXX>
17.最经典的跨域方案 jsonp
jsonp它利用<script>标签不受同源策略的限制。
缺点:
1.只支持get请求(因为<script>标签只能get)
2.同时需要后配合。
3.有安全性问题,容易遭受xss攻击
2最流行的跨域方案cors[跨域资源共享]
(CORS) 是一种机制,使用 HTTP 头来告诉浏览器。
让运行在一个 origin (domain) 上的Web应用,访问不同源服上务服务的指定的资源。
3.最方便的跨域方案Nginx
Nginx是一款极其强大的web服务器,其优点就是轻量级、启动快、高并发。
反向代理的原理很简单,即所有客户端的请求都必须先经过nginx的处理,
nginx作为代理服务器在将请求转发给node或者java服务,这样就规避了同源策略。
其它跨域方案
1.HTML5 XMLHttpRequest 有一个API,、
postMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,
可以实现跨文本档、
多窗口、
跨域消息传递。
19 为什么JavaScript是单线程的? 与异步冲突吗 ok
JavaScript是单线程,与它的用途有关。
作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。
这决定了它只能是单线程,否则会带来很复杂的问题。
解释为什么是单线程的,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,
另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
所以,为了避免复杂性,从一诞生,JavaScript就是单线程,
这已经成了这门语言的核心特征,将来也不会改变。
不冲突:
Js执行是单线程,但浏览器是多线程,它有以下常驻线程
1.渲染引擎线程:负责页面的渲染。
2.JS引擎线程:负责JS的解析和执行(本文说的主线程就指js引擎线程)
3.定时器触发线程:处理定时事件,比如setTimeout, setInterval
4.事件触发线程:处理DOM事件
5.异步http请求线程:处理http请求