DOM操作笔记

95 阅读4分钟

DOM笔记

网页其实是一颗树

1641822798535.png

1641822828068.png

获取元素,也叫标签

 window.id(名),或者直接.id(名)
 document.getElementById('id')
 document.getElementsByTagName('div')[0](所有div标签)
 document.getElementsByClassName('red')[0](所有clss为red的标签)
 document.querySelector('#div')
 document.querySelectorAll('#red')[0]
 注意:工作中常用document.querySelector()和document.querySelector()
 在demo中可以直接用.id,
 兼容IE用getElementById或者getElementsTagName

获取特定元素

 获取html元素
 document.documentElement
 获取head元素
 document.head
 获取body元素
 document.body
 获取窗口
 window
 获取所有元素
 document.all

查看一个div的原型链

 第一层原型HTMLDivElement.prototype(所有div的共有属性)
 第二层原型HTMLElement.prototype(所有有HTML标签的共有属性)
 第三层原型Element.prototype(这里是xml,html标签的公有属性)
 第四层原型node.prototype(所有节点的共有属性,xml标签 文本,注释,html标签,文本 注释等)
 第五层原型EventTarget.prototype(里面最重要的函数属性是addEventListener)
 最后一层原型Object.prototype

节点,元素

 节点(Node)包括以下几种
 1表示元素Element,也叫标签Tag
 3表示文本Text
 8表示注释comment
 9表示文档Document
 11表示文档片段DocumentFargment

节点的增删改查

 创建一个标签节点
 div = document.createElement('div')
 创建一个文本节点
 text1 = document.createTextNode('你好')
 标签里插入文本
 div.appendChild('text')
 div.innerHTML="你好"或者div.textContent="你好"
 但是不能够用div.appendChild('HIHAO')
 插入到页面中
 创建的标签默认在js的线程中
 必须把它插入到head或者中才能生效
 使用bodydocumend.body.appendChild(div)
 或者
 页面中的元素.appendChild(div)

appendChild

 页面中有两个div#text1和div#text2
 let div = document.createElement('div')
 text1.appendChild(div)
 text.appendChild(div)
 请问最终div出现在哪里
 text1
 text2
 text1和text2中都有
 答:text2中(一个元素不可能出现爱两个地方,除非复制)

 两种方法
 旧方法;parentNode.removeChild(childNode)
 新方法;childNode.remove()

 改属性(写标准属性)
 改class;div.className = "reg" (全覆盖)
 改class;div.classList.add('red')
 改style;div.style = "widht:100px; height:50px;"
 改style的一部分;div.style.color = 'red'
 改data_*属性;divdataset.x = 'frank'
 读标准属性
 div.classList / a.href
 div.getAttribute('class'),a.getAttribute('href')

改事件处理函数

 div.onclick默认为;null
 默认点击div不会有任何事发生
 但是你把div.onclick改写为一个函数
 那么点击div的时候,浏览器就会调用这个函数
 并且是这样调用的fn.call(div,event)
 div会被当做this
 event则包含点击事件的所有信息
 绑定事件
 div.addEventListener

该内容

 改文本内容
 div.innerText = 'xxx'
 div.textContent = 'xxx'
 改HTML内容
 div.innerHTML = `<span>666<span/>`
 改标签
 div.innerHTML = " "//先清空
 div.appengChild(DIV2)//再添加
 改爸爸
 newparent.appendChild(div)

 查爸爸
 node.parentNode或者node.parentElement
 查爷爷
 node.parentNode.parentNode
 查子代
 node.childNodes或者node.children
 查兄弟姐妹
 node.parentNode.childNodes//还要排除自己
 node.parentNode.children//还有排除自己
 查老大
 node.firstChild
 查老乡
 node.lastChild
 查上一个哥哥
 node.previousSibling
 查下一个弟弟
 node.nextSibling

DON操作是跨线程的

跨线程操作

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

1641828759253.png

插入新标签的完整过程

 在diiv1放入压面之前
 (对div1所有的操作都属于JS线程内的操作)
 把div1放入页面之后
 (浏览器就会发现JS的意图,就会通知渲染线程在页面中渲染div1对应的元素)
 把div翻入页面之后
 对div1的操作都有可能会触发重回渲染
 div1.id = 'newld' 可能会重新渲染,也可能不会
 div1.title = 'new' 可能会重新渲染,也可能不会
 如果连续对div1对此操作,浏览器可能会合并成一侧操作,也可能不会

属性同步

 标签属性
 对div1的标签属性的修改,会被浏览器同步到页面中
 data_*属性
 同上
 非标准属性
 对非标准属性的修改,测只会定留在JS线程中不同步到页面里
 注意:如果你有自定义属性,有想被同步到页面红,请使用data_作为前缀

1641829485668.png

property vs Attribute

 property属性
 JS线程中div1的所有属性,叫做div1的propety
 attribute也是属性
 渲染引擎中div1对应的属性,叫做attribute
 区别
 大部分时候,同名的property和attribue值相等
 但是如果不是标准属性,那么它俩只会在开始是相等
 但注意attribute只支持字符串
 而property支持字符串,布尔等类型