「JavaScript」 基础知识要点及常考面试题(三)---[浏览器相关]

DOM操作


  1. 创建节点
createDocumentFragment()
createElement()   // 创建元素节点
createTextNode() // 创建文本节点
  1. 添加, 移除,替换,插入
appendChild()
removeChild()
replaceChild()
insertChild()
  1. 查找
getElementsByTagName()
getElementsByName()
getElementsById()

eg

事件机制


事件的触发过程是怎么样的?知道什么是事件代理嘛?

  1. window向下寻找注册事件,直到找到注册事件
  2. 触发注册事件,向上冒泡
  3. 触发父级冒泡事件
  • preventDefault 阻止默认事件
  • stopPropagation 阻止冒泡事件
  • cancelBublle ie阻止冒泡事件
    事件代理:
    由父节点来产生子节点的响应事件
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>
<script>
  let ul = document.querySelector('ul');
  ul.addEventListener('click', (event)=> {
    console.log(event)
})
</script>

请写出兼容各种浏览器版本的事件绑定函数?

  function addHandler(element, type, handler) {
    if (element.addEventListener) {
      element.addEventListener(type, handler,false)  // w3c
    } else if (element.attachEvent) {
      element.attachEvent(`on${type}`, handler)  // ie
   } else {
        element[`on${type}`] = handler  // other
  }


跨域

什么是跨域,怎么解决?

由于浏览器出于安全考虑,有同源策略。也就是说,如果协议、域名或者端口有一个不同就是跨域
解决策略:

  • 前端:
    1. JSONP 的原理很简单,就是利用 <script> 标签没有跨域限制的漏洞。通过 <script> 标签指向一个需要访问的地址并提供一个回调函数来接收数据当需要通讯时。
<script src="http://domain/api?param1=a&param2=b&callback=jsonp"></script>
<script>
    function jsonp(data) {
        console.log(data)
    }
</script>  

局限性:兼容性不好,只是限制于get请求

  • 设置代理
    vue 中可以单独配置代理
  • CORS (后端)
    服务端设置 Access-Control-Allow-Origin 就可以开启CORS
    个人觉得最理想状态是在nginx配置,不要嵌套在后台代码里
server {
     listen 80;
     server_name xxxx;
     root /www/xxxx;
     add_header Access-Control-Allow-Origin *;
     add_header Access-Control-Allow-Headers X-Requested-With,Content-Type;
     add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}

cookie 跨域:现在大型项目都是分模块部署的不同的web容器的,但是当用户登录之后,cookie要公用的,
解决策略:

location /web1 {
            proxy_pass http://web1;
            proxy_set_header Host  127.0.0.1;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            proxy_set_header Cookie $http_cookie;
            log_subrequest on;
        }

        location /web2 {
            proxy_pass http://web2;
            proxy_set_header Host  127.0.0.1;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header Cookie $http_cookie;
            log_subrequest on;
        }

这种策略就是把不同域的cookie放在相同的nginx中

  • postMessage
    postMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。
// 发送消息端
window.parent.postMessage('message', 'http://test.com')
// 接收消息端
var mc = new MessageChannel()
mc.addEventListener('message', event => {
  var origin = event.origin || event.originalEvent.origin
  if (origin === 'http://test.com') {
    console.log('验证通过')
  }
})

存储

h5有哪些存储特性

特性 cookie localStorage sessionStorage indexDB
生命周期 可设置过期时间 除非清理,一直存在 页面关闭就清理 除非清理,一直存在
大小 4k 5M 5M 无限
与服务端通信 每次都会携带在请求头中 不参与 不参与 不参与

浏览器的渲染原理

都知道,执行js有js引擎,渲染页面有渲染引擎,那他如何工作的

  1. 浏览器从服务端去拿html,而浏览器并不清楚css,hlml,元素,所有他是有一个转换的过程的
    首先拿到的元素字节然后转为字符串,接着渲染成node节点,最后形成dom树,
  2. 同理css也是一样的过程接
  3. 最后css树和DOM数结合形成DOM树结合形成网页

为什么操作js dom慢,插入几万个DOM,怎么不卡

因为js是数据js引擎的,而dom是属于渲染引擎的,所以实际上是两个线程在工作,操作多了,自然就卡了
解决几万个DOM操作不卡的办法:

  1. 将多条数据进行分组,
    然后开启异步线程,每组进行渲染
    每组的数据可以用 requestAnimationFrame 进行渲染
    requestAnimationFrame 会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧。
  2. 滚动渲染,

重绘 , 回流

  • reflow(回流): 当DOM树中的一部分或者全部因为大小边距等问题发生改变而需要重建的过程叫做回流
  • repaint(重绘): 当元素的一部分属性发生变化,如外观背景色不会引起布局变化而需要重新渲染的过程叫做重绘
    ** 减少重绘,回流操作 **
  1. 使用visibility 替换 dipslay: none
  2. 不要使用table布局,可能很小的改动就回造成table的重新布局
  3. 避免css的层级过多

渲染请求的过程及优化 https://juejin.im/post/5d0f3a726fb9a07ea4208766

window的onload事件和domcontentloaded谁先谁后

1、当 onload事件触发时,页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成了。
2、当 DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表,图片,flash

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容