常用原生DOM操作总结

722 阅读2分钟

节点和元素?

节点 Node 包括很多种,以node.nodeType可获取其类型序号:

  • 1 ------ 元素 Element,也叫标签 Tag
  • 3 ------ 文本 Text
  • 8 ------ 注释 Comment
  • 9 ------ 文档 Document
  • 11 ------ 文档片段 Document Fragment

获取元素

直接用id的值  //非正式,仅限测试时使用
document.getElementById(/* id名 */)
document.getElementsByTagName(/* 标签名 */)
document.getElementsByClassName(/* class名 */)

document.querySelector(/* 选择器 */) //推荐!!
document.querySelectorAll(/* 选择器 */) //推荐!!

document.documentElement //html元素(根元素)
document.head //head元素
document.body //body元素
document.all //falsy值(IE除外)

节点的增删改查

//创建节点:
document.createElement(/* 标签名 */)  //创建标签节点
document.createTextNode(/* 文本内容 */) //创建文本节点

//增加子节点:
node.appendChild(/* 子节点 */)

【注】:一个元素只能append到一个父节点中,以后插入的目的地为准。

parentNode.removeChild(/* 子节点 */) //删除子节点
childNode.remove() //删除自己,将节点从父节点中移除
parentNode.innerHTML = '' //清空所有子节点

//属性改写:
node.className = string //改写class
node.classList.add(string) //增加一个class
node.classList.remove(string) //删除一个class
node.style = /* style */
node.style.width = /* 改写部分style */
node.dataset.xxx = string //改 data-xxx 属性(自定义属性)

//内容改写:
node.innerText = string //改文本
node.textContent = string //同上,IE写法
node.innerHTML = /* HTML 内容 */
    
//事件处理函数改写:
div.onclick = ()=>{}
div.addEventListener('click', ()=>{})

//读取属性:
node.classList
node.getAttribute('属性名')
//【注】:对于a标签,
a.href //经处理后的href(处理成完整的URL)
a.getAttribute('href') //纯粹的href

//父:
node.parentNode //查父
node.parentElement //同上

//子:
node.childNodes //所有子节点
node.children //仅所有元素子节点
node.firstChild //第一个子节点
node.lastChild //最后一个子节点

//兄弟姐妹:
node.previousSibling //前一个节点
node.nextSibling //后一个节点

//遍历一个div中所有元素:
const travel = (node, fn) => {
    fn(node)
    if(node.children.length !== 0){
        for(let i=0;i<node.children.length;i++){
            travel(node.children[i], fn)
        }
    }
}

DOM跨线程操作

  1. 浏览器包括两个线程:
  • JS 线程
  • 渲染线程
  1. 对已经渲染的元素进行操作,有可能不会触发重新渲染:
  • 标准属性的修改,如id、className、title、data-*(自定义属性) -------- 会同步到渲染线程
  • 非标准属性的修改 -------- 不会同步到渲染线程,仅停留在 JS 线程中
  1. Property 和 Attribute
  • JS 线程中 div 对象的属性称为 property
  • 渲染线程中 div 标签的属性称为 attribute