DOM编程

754 阅读3分钟

基本概念

DOM是英文Document Object Model的缩写,即文档对象模型。它是一种跨平台的、独立于编程语言的API,它把HTML、XHTML或XML文档当作一个树结构,而每个节点视为一个对象,这些对象可以被编程语言操作,进而改变文档的结构,映射到文档的显示。

网页其实也是一棵树,那么JS是如何操作这棵树的呢?浏览器往window上加一个document。JS就是用document来操作网页。

获取元素的API

获取元素,也叫标签有很多标签:

  • document.getElementByld('idxxx')
  • document.getElementsByTagName('div')[0]
  • document.getElementsByClassName('red')[0]
  • document.querySelector('#idxxx')
  • document.query.SelectorAll('.red')[0]

获取特定元素

  • document.documentElement//获取html元素
  • document.head//获取head元素
  • document.body//获取body元素
  • window//获取窗口(窗口不是对象)
  • document.all//获取所有元素


获取的元素是什么

我们获取的元素是一个对象,我们要搞清它的原型:下图是完整的原型链



节点(node)

节点包含以下几种:

x.nodeType得到一个数字:

1表示元素Element,也叫标签Tag

3表示文本Text

8表示注释Comment

9表示文档Document

11表示文档片段DocumentFragment

主要的只需要记住1和3即可

节点的增删改查

增:

创建一个标签节点

let div = document.createElement('div')
document.createElement('style')
document.createElement('script')
document.createElement('li')

创建一个文本节点

let text = document.createTextNode('你好')

标签里面插入文本

div.appendChild(text)
div.innetText'你好'/div.textContent'你好'

在这里需要注意一下:appendChild

let div = document.createElement('div')
test1.appendChild(div)
test2.appendChild(div)

div会出现在test2里面(一个元素不能出现在两个地方,除非复制一份)

两种方法:

旧方法:parentNode.childChild(childChild)

新方法:childNode.remove()

删除之后还在内存了

改属性:

div.className='red'
div.classList.add('red')
div.style='width:100px'
div.style.width='100px'
div.dataset.x='jack'//改data-属性

该事件处理函数:

div.onclick默认为null,默认点击div不会发生任何事,但是如果你把div.onclick改成一个函数fn那么点击div的时候浏览器就会调用这个函数,并且是这样调用的fn.call(div,event)div会被当成this,event包含了点击事情的所有信息,如坐标。

该内容

该文本内容:

div.innerText='xxx'/div.textContent='xxx'

改html内容:

div.innerHTML='xxx'

改标签:

div.innerHTML=''//先清空
div.appendChild('div2')//在加内容

改parent

newParent.appendChild(div)//直接从原来的地方消失

node.parentNode/node.parentElement//查爸爸 

node.parentNode.parentNode//查爷爷 

node.childNode/node.children//查儿子

 node.parentNode.childNode//(排除自己)查兄弟 node.firstChild/lastChild/previousSibling/nextSibling

遍历一个div里的所有元素:

let travel =(node,fn)=>{
fn(node)
if(node.children){
for(let i=0;i<node.children.length;i++){
travel(node.children[i],fn)
    }
  }
}
travel(div,(node)=>console.log(node))

  • DOM操作是跨线程的

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

各线程各司其职:JS引擎不能操作页面只能操作JS,渲染引擎不能操作JS只能操作页面

这个js命令:document.body.appendChild('div1')是如何改变页面的?

当浏览器发现js在body加了一个div1对象,浏览器也会通知渲染引擎新增一个div元素,新增的div元素所有属性照抄div1对象的。



属性同步:

  • 标准属性

属性的标准属性(如:id、className、title等)的修改,会被同步到页面中

  • data-*属性

同上

  • 非标准属性

对非标准属性的修改,则会停留在js线程中,不会同步到页面里,比如x属性


properties是JS线程中div的所有属性,attributes是渲染引擎div对应标签的属性,不部分同名的两者值相等,但如果是非标准属性,他们只会一开始相等

注意:attributes只支持字符串;properties支持字符串、布尔等类型



前端小白,求留言指正!!!