DOM跨线程

123 阅读2分钟

DOM是跨线程操作的

浏览器分为渲染引擎和JS引擎

跨线程操作

各线程各司其职

  • JS引擎不能操作页面,只能操作JS
  • 渲染引擎不能操作JS,只能操作页面
  • document.body.appendChild(div1)
  • 这句JS是如何改变页面的

跨线程通信

  • 当浏览器发现JS在body里面加了个div1对象
  • 浏览器就会通知渲染引擎在页面里面也新增一个div元素
  • 新增的div元素所有属性都照抄div对象

图示跨线程操作

1633143982(1).png
时间浪费在中间

插入新标签的完整过程

在div1放入页面之前

  • 对div1所有的操作都属于JS线程的操作

把div1放入页面之时

  • 浏览器会发现JS的意图
  • 就会通知渲染线程在页面中渲染div1对应的元素

把div1放入页面滞后于

  • 对div1的操作都有可能触发重新渲染
  • div1.id='newid'可能重新渲染,也可能不会(大多数重新)
    • 新的id里面有css样式,那么要重新渲染
  • div1.title='new' 可能会渲染也可能不会(大所数不重新)
  • 如果连续对div1多次操作,浏览器可能会合并成一次操作,也可能不会
    • 例:

1633144911(1).png
start设置宽度,end设置一个宽度,想实现一个宽度变化的动画效果,但是没有动画,因为浏览器渲染引擎将这两个步骤合并了。
加上中间的过渡条件,当原有的代码执行的过程中要不断地反馈宽度,触发重新渲染,所以达成了动画效果

属性同步

标准属性

  • 对div1的属性修改,会被浏览器同步到页面中
  • 比如id,calsName,title等

data-XXX属性

  • 同上

非标准属性

  • 对非标准属性的修改,只会停留在JS线程中,不会同步到页面里
  • 比如名为XXX的属性

小结

  • 同步的属性只有标准属性(id,className,title等)和data-xxx
  • 如果想要有自定义属性,并且又想同步到页面中,使用data- 作为前缀
图示

1633162080(1).png