主要分为2部分:

1、渲染引擎

a、渲染引擎负责获取网页的内容,html,xml,图像等等,然后加入css,计算网页的显示方式

2、JS引擎,例如V8

a、解释和执行js实现网页的动态效果

二、常见的内核

Trident(IE ,MaxThon,TT,360,搜狗)
Gecko(FF,mozillaSuite/SeaMonkey,Netscape6及以上版本)
Presto(opera7及以上,现在为Blink(webkit的分支))
Webkit内核(Safafi,Chorme)

三、cookie,sessionStorage,localStroage,indexDB

特性 cookie lcoalStorage sessionStorage indexDB
数据周期性 一般由服务器生成,可以设置过期时间 除非被清理,否则一直存在 页面关闭就清理,会话级 除非被清理,否则一直存在
数据存储大小 4K 5M 5M 无限
与服务器通信 每次都会携带在head中,对性能有影响(如果过大) 不参与 不参与 不参与

此外,cookie的安全性
value:如果用于保存用户登录状态,应该将值加密,不能使用明文的用户标识
http-only:不能通过JS访问Cookie,减少XSS攻击
什么是xss攻击?
secure:只能在协议为HTTPS的请求中携带
same-site:规定浏览器不能再跨域请求中携带Cookie,减少CSRF攻击
什么是CSRF攻击?

路白———-

浏览器对象模型

常用API

1、window对象
alert() ……
open()
onerror : 监听全局报错(资源加载,js代码报错)
addEventListener(‘error,’)
setTimout() :轮训 ,模拟setTnterval
setTnterval():
窗口大小……
窗口位置……
location对象
hash
host
serach
……
navigation : isOnline 判断用户是否断网
history对象
go()
back()
forword()
length
pushState
onPopState

浏览器事件模型

事件捕获— 目标阶段 — 事件冒泡

true ,捕获阶段 ,默认是false ,代表冒泡
e.target 绑定事件的元素
e.currentTarget //当前点击的元素
Ie 不支持事件捕获


阻止事件传播

1、stopPropagation :阻止事件传播(不论是捕获还是冒泡)。
阻止到哪里事件就在哪里 停止
IE : e.cancelBubble = true 阻止事件冒泡

面试题:场景设计题

阻止默认行为:

e.preventDefault ,比如说 a标签
ie : e.returnValue = true

封装一个没有兼容问题的addEvent

  1. class BomEvent{
  2. constructor(el){
  3. this.el = el
  4. }
  5. addEvent(type,handler){
  6. if(this.el.addEventListener){
  7. this.el.addEventListener(type,handler,false) //false表示冒泡,默认也是false
  8. }else if(this.el.attachEvent){
  9. this.el.attachEvent('on'+type,handler) //IE 不支持事件捕获
  10. //handler.call(this.el)
  11. }else{ //兜底
  12. this.el['on'+type] = handler
  13. }
  14. }
  15. removeEvent(type,handler){
  16. if(this.el.removeEventListener){
  17. this.el.removeEventListener(type,handler)
  18. }else if(this.el.attachEvent){
  19. this.el.detachEvent('on'+type,handler) //IE 不支持事件捕获
  20. }else{ //兜底
  21. this.el['on'+type] = null
  22. }
  23. }
  24. }
  25. function stopPropagation(event){
  26. if(event.stopPropagation){
  27. event.stopPropagation
  28. }else{
  29. event.cancelBubble = true
  30. }
  31. }
  32. function preventDefault(event){
  33. if(event.preventDefault){
  34. event.preventDefault
  35. }else{
  36. event.returnValue = true
  37. }
  38. }

事件委托\事件代理

  1. //事件委托+ 伪数组(获取的node节点数组)
  2. ul.addEventListener('click',function(e){
  3. let target = e.target //点击的目标元素
  4. if(target.tagName.toLowerCase() === 'li'){
  5. let liList = Array.from(document.querySelectorAll('li'))
  6. let index = liList.indexOf(target) //拿索引
  7. alert(`内容为${target.innerHTML} ,索引为${index}`)
  8. }
  9. })

浏览器请求相关内容

3、浏览器原生请求 xhr

  1. const xhr = new XMLHttpRequest()
  2. xhr.upload.onprogress //原生的上传的进度
  3. xhr.timeout = 3000 //超时
  4. xhr.ontimeout = ()=>{ //超时处理函数
  5. }
  6. xhr.upload.onprogress = p =>{
  7. const percent = Math.round((p.loaded / p.total)*100) + '%'
  8. }

4、fetch

  • fetch:默认不带cookie
  • 错误不会reject出去
  • 不支持设置超时
  • 可以中止fetch, signal, new Abort ```javascript const controller = new AbortController() //中止请求 fetch(‘http://domin/service',{ method:’GET’, credentials :’same-origin’ , //同源携带 cookie ,localStroge传值 signal:controller.signal //中止请求 }).then((response)=>{ if(response.ok){ return response.json() } throw new Error(‘http error’) }).then(json=>{ console.log(json) }).catch(error=>{ console.error(error) }) controller.abort() //中止请求 //手动设置超时

function ontimeout(url,options,time = 3000){ return new Promise((resolve,reject)=>{ fetch(url,options).then(resolve).catch(reject) setTimeout(reject,time) }) }

  1. 5、封装一个ajax工具函数,处理对于异步函数的超时处理
  2. ```javascript
  3. //一个通用的异步函数的超时逻辑
  4. interface IOptions {
  5. url:string;
  6. type?:'GET' | 'POST';
  7. data:any;
  8. timeout?:number;
  9. }
  10. export function asyncAjax(options:IOptions ={
  11. url:'',
  12. type:'GET',
  13. data:{},
  14. timeout:3000
  15. }){
  16. if(!options.url) return
  17. return new Promise((resolve,reject)=>{
  18. let xhr,timer
  19. const onStateChange = ()=>{
  20. xhr.onreadystatechange = ()=>{
  21. if ( xhr.readyState == 4 ) {
  22. clearTimeout(timer);
  23.        if(xhr.status>=200 && xhr.status<300 || xhr.status==304){
  24. resolve(xhr.responseText)
  25. }
  26.     } else {
  27. reject(xhr.status);
  28.     }
  29. }
  30. }
  31. const formatUrl = (obj)=>{
  32. let resArr = []
  33. for(let k in obj ){
  34. resArr.push(`${k}=${obj[k]}`)
  35. }
  36. return resArr.join('&')
  37. }
  38. if((window as any).XMLHttpRequest){
  39. xhr = new XMLHttpRequest() //chrome
  40. }else{
  41. xhr = new ActiveXObject('Microsoft.XMLHTTP') //IE
  42. }
  43. if(options.type.toUpperCase()==="GET"){
  44. xhr.open('GET',options.url + formatUrl(options.data) )
  45. onStateChange() //这个要放在前面,避免
  46. xhr.send()
  47. }else if(options.type.toUpperCase()==="POST"){
  48. xhr.open('POST',options.url)
  49. xhr.setRequestHeader(
  50. "ContentType",
  51. "application/x-www-form-urlencoded" //浏览器编码好的名称/值对格式,ajax默认提交格式
  52. //而axios默认的请求头就是application/json,
  53. )
  54. /****
  55. * 0(UNSENT):未初始化。尚未调用open()方法
  56. 1(OPENED):启动。已经调用open()方法,但尚未调用send()方法
  57. 2(HEADERS_RECEIVED):发送。己经调用send()方法,且接收到头信息
  58. 3(LOADING):接收。已经接收到部分响应主体信息
  59. 4(DONE):完成。已经接收到全部响应数据,而且已经可以在客户端使用了
  60. */
  61. // 必须在调用open()之前指定onreadystatechange事件处理程序,才能确保跨浏览器兼容性.否则将无法接收readyState属性为0和1的情况
  62. onStateChange() //告诉xmlhttp当它的state发生改变的时候执行 ,这个要放在前面,避免
  63. xhr.send(options.data)
  64. }
  65. if (options.timeout) { //超时后就取消掉请求,并reject
  66. timer = setTimeout(() => {
  67. xhr.abort();
  68. reject("timeout");
  69. },options.timeout);
  70. }
  71. })
  72. }

6、请求头
为什么cnd域名和 业务域名不一样?

  • 安全,用户信息不包括给第三方cdn厂商。
  • request header携带了不必要的资源,增加带宽消耗

referer ?

  • 判断当前浏览器来自哪个页面,从哪里来,标志访问路径

user-agent
7、返回头
access-control-allow-origin:*
conrent-encoding:gzip
set-cookie:

8、status
304 :协商缓存,服务器资源未修改

强缓存
max-age
expired:服务器时间不准

协商缓存

  • last-modified : 打开后不做修改就保存,这个时间也会变化
  • etag :整体文件内容hash,耗时间耗性能

9、单页应用的index.html如果一定要做缓存,适合做哪种缓存

  • 协商缓存
  • 因为里面的js和css文件本身都是有hash的,都是js.hash,css.hash,需要及时更新,协商缓存检测到变化了就必须要更新,因为迭代很快,
  • 真实情况下:一般不做缓存,原因有1.本身文件比较小2、需要快速迭代实时更新