1、跨线程操作
1.1 各线程各司其职
JS引擎不能操作页面,只能操作JS
渲染引擎不能操作JS,只能操作页面
document.body.appendChild(div)
1.2 跨线程通信
当浏览器发现JS在body里面加了个div1对象
浏览器就会通知渲染引擎在页面里也新增一个div元素
新增的div元素所有属性都照抄div1对象

2、插入新标签的完整过程

id选择器里面可能有对color的设置,则可能会重新渲染
修改title,重新渲染示例:https://css-tricks.com/css-content/#article-header-id-4

对div1连续操作,浏览器会合并成一次操作,该怎么解决??

http://js.jirengu.com/yefac/1/edit?html,css,js,output
3、属性同步
3.1 标准属性
对div1的标准属性的修改,会被浏览器同步到页面中
比如id,className,title等
3.2 data-*属性
3.3 非标准属性
对非标准属性的修改,则只会停留在JS线程中,不会同步到页面里
比如x属性
<!DOCTYPE html><html><head><meta charset="utf-8"><title>JS Bin</title></head><body><div id="test" x="test" data-x="test"><p>id 一开始为 test,后来改为 frank<p>你会发现页面中 id 变为 frank<p>data-x 属性一开始为 test,后来改为 frank<p>你会发现页面中的 data-x 变成了 frank<p>x 属性一开始为 test,后来改为 frank<p>你会发现页面中的 x 还是 test</div></body></html>
//JS代码let div1 = document.querySelector('#test')div1.id = 'frank' // 同步过去了div1.dataset.x = 'frank' // 同步过去了div1.x = 'frank' // 没有同步过去div1.style.border = '1px solid red'


3.4 启示
如果你有自定义属性,又想被同步到页面中,请使用data-作为前缀
4、Property VS Attribute

5、学习路线

