DOM跨线程操作

187 阅读2分钟

跨线程操作

* 各线程各司其职

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

* 跨线程通信

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

插入新标签的完整过程

  • 在div1放入页面之前 你对div所有的操作都属于JS线程内的操作
  • 把div1放入页面之时 浏览器会发现js的意图

就会通知渲染线程在页面中渲染div1对应的元素

  • 把div1的操作都有可能会触发重新渲染 div1.id = 'newId'可能会重新渲染,也可能不会

div1.title = 'new'可能会重新渲染,也可能不会

如果你连续对div1多次操作,浏览器可能会合并成一次操作,也可能不会

image.png

test.clientWidth 这句话看似没有用但是实际上会触发渲染

image.png

属性同步:

  • 标准属性 对div1的标准属性的修改,会被浏览器同步到页面中

比如id, className, title 等

  • data-* 属性 同上
  • 非标准属性 对非标准属性的修改,则只会停留在JS线程中

不会同步到页面里

比如x属性

  • 启示: 如果你有自定义属性,又想被同步到页面中,请使用data-作为前缀

Property v.s. Attribute

* property属性

JS线程中div1的所有属性,叫做div1的property

* attribute也是属性

渲染引擎中的div1对应标签的属性,叫做attribute

区别:

  • 大部分时候,同名的proyerty 和 attribute值相等
  • 但如果不是标准属性,那么他俩只会在一开始的时候相等
  • 但注意attribute只支持字符串
  • 而property支持字符串,布尔等类型