DolphinThinker 2019-06-28
DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model)。它的作用是将网页转为一个 JavaScript 对象,从而可以用脚本进行各种操作
DOM 的最小组成单位叫做节点(node)。文档的树形结构(DOM 树),就是由各种不同类型的节点组成
一个文档的所有节点,按照所在的层级,类似树状结构 它有一个顶层节点,下一层都是顶层节点的子节点,然后子节点又有自己的子节点
除了根节点,其他节点都有三种层级关系:
Document对象提供了访问和更新HTML页面内容的属性和方法
Document对象作为DOM访问和更新HTML页面内容的入口 可以定位HTML页面中的元素 或者创建新的元素
console.log(document) //#document 页面上的内容
Document对象的属性和方法被定义在prototype原型中
console.log(Document.prototype) //一个包含很多属性和方法的对象
Document对象继承于Node对象 Node对象继承于EventTarget对象
console.log(Document.prototype instanceof Node) //true console.log(Node.prototype instanceof EventTarget) //true console.log(Document.prototype instanceof EventTarget) //true
DOM无论是使用的还是得到的都应该是对象
var buttonElement =document.getElementById('btn'); console.log(buttonElement instanceof Object) //true
<button name='btn'></button> var btn=document.getElementsByName('btn')[0]
<button ></button> var btn=document.getElementsByTagName('button')[0]
<button class='btn'></button> var btn=document.getElementsByClassName('btn')[0]
<button id='btn'></button< var btn=document.querySelector("btn")
var liList=document.querySelectorAll('li);
创建元素节点
Document对象提供了createElement()方法创建元素节点
var buttonElement=document.crateElement('button');
创建文本节点
Document对象提供了createTextNode()方法创建元素节点
接收一个参数 是文本节点中的内容 是一个字符串
var text=document.createTextNode('我是文本内容')
创建属性节点
Document对象提供了createAttribute()方法创建元素节点
接受一个参数 为节点的属性名称
创建属性节点方法只具有属性名称 没有属性值
var attributeNode=document.createAttributeNode('id') //为元素添加一个id属性
Node对象主要提供了用于解析DOM节点树结构的属性和方法
Node对象是解析DOM节点结构的主要入口
Node对象继承于EventTarget对象 EventTarget是一个用于接收事件的对象
console.log(Node.prototype instanceof EventTarget) //true
Document对象和Element对象都继承于Node对象
console.log(Document.prototype instanceof Node) //true console.log(Element.prototype instanceof Node) //true
测试Node对象
Node对象是DOM底层封装的对象 所以并不能通过直接打印Node对象来查看它的属性或者方法
Node对象中提供了nodeName nodeType nodeValue 分别用于获取指定节点的节点名称 节点类型 节点值
<button id='btn'></button> var btn =document.getElementById('btn'); console.log(btn.nodeName) //BUTTON
不同的节点类型 nodeName返回的节点名称不同 :
<button id='btn'></button> var btn =document.getElementById('btn'); console.log(btn.nodeType) //1
不同的节点类型 nodeType返回的节点名称也不同:
<button id='btn'>按钮</button> var btn =document.getElementById('btn'); console.log(btn.nodeValue); // null
不同的节点类型 nodeValue返回的节点类型也不同:
通过指定元素查找它的父节点 可以用Node对象的parentNode属性实现
<ul id="parent"> <li>Xayah</li> <li id="abm">Lucian</li> <li>Vayne</li> </ul> var abm =document.getElementById('abm'); var parent =abm.parentNode; console.log(parent); // <ul id='parent'>...</ul>
通过parentElement属性 获取其父元素节点
console.log(abm.parentElement) //<ul id='parent'>...</ul>
区别:
获取html的父节点 为document文档节点
但document文档节点并不是元素节点
var html=document.documentElement; console.log(html.parentNode) //文档节点 console.log(html.parentElement) //null
可以通过Node对象的childNodes firstChild lastChild 属性实现
<ul id="parent"> <li>Xayah</li> <li id="abm">Lucian</li> <li>Vayne</li> </ul> var parent =document.getElementById('parent'); var children=parent.childNodes; console.log(children) //NodeList(7) [text, li, text, li#abm, text, li, text]
<ul id="parent"> <li>Xayah</li> <li id="abm">Lucian</li> <li>Vayne</li> </ul> var parent =document.getElementById('parent'); console.log(parent.firstChild) //#text 第一个li前的换行
<ul id="parent"> <li>Xayah</li> <li id="abm">Lucian</li> <li>Vayne</li> </ul> var parent =document.getElementById('parent'); console.log(parent.lastChild) //#text 最后一个li后的换行
previousSibling 获取指定节点的上一个兄弟节点
<ul id="parent"> <li>Xayah</li><li id="abm">Lucian</li> <li>Vayne</li> </ul> var abm=document.getElementById('abm'); console.log(abm.previousSibling) //<li>Xayah</li>
nextSibling 获取指定节点的下一个兄弟节点
<ul id="parent"> <li>Xayah</li> <li id="abm">Lucian</li><li>Vayne</li> </ul> var abm=document.getElementById('abm'); console.log(abm.nextSibling) //<li>Vayne</li>
Vue和React是数据驱动视图,如何有效控制DOM操作?能不能把计算,更多的转移为js计算?因为js执行速度很快。patch函数-->patch,对比tag,对比tag与key,对比children