我与DOM的第一次邂逅

DolphinThinker 2019-06-28

DOM

DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model)。它的作用是将网页转为一个 JavaScript 对象,从而可以用脚本进行各种操作


节点

DOM 的最小组成单位叫做节点(node)。文档的树形结构(DOM 树),就是由各种不同类型的节点组成

节点树

一个文档的所有节点,按照所在的层级,类似树状结构 它有一个顶层节点,下一层都是顶层节点的子节点,然后子节点又有自己的子节点


除了根节点,其他节点都有三种层级关系:

  • 父节点关系(parentNode):直接的那个上级节点
  • 子节点关系(childNodes):直接的下级节点
  • 同级节点关系(sibling):拥有同一个父节点的节点

Domcument对象

Document对象提供了访问和更新HTML页面内容的属性和方法
Document对象作为DOM访问和更新HTML页面内容的入口 可以定位HTML页面中的元素 或者创建新的元素

测试Document对象

console.log(document)    //#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无论是使用的还是得到的都应该是对象

  • getElementById()方法
var buttonElement =document.getElementById('btn');
    console.log(buttonElement instanceof Object)  //true
  • getElementsByName()方法
    通过name属性获取
    由于name属性不唯一 得到的结果可能是多个 所以为Elements
    因为得到的是一个集合 如果想取到对应的值 需要添加索引值
<button name='btn'></button>
 var btn=document.getElementsByName('btn')[0]
  • getElementsByTagName
    通过TagName属性获取 与name属性相同
<button ></button>
 var btn=document.getElementsByTagName('button')[0]
  • getElementsByClassName
    通过ClassName属性获取 与name属性相同 存在兼容问题
<button class='btn'></button>
 var btn=document.getElementsByClassName('btn')[0]
  • querySelector()方法
    通过CSS选择器定位第一个匹配的元素
    接收参数 表示选择器 可以包含一个或多个CSS选择器 多个用逗号分隔
<button id='btn'></button<
  var btn=document.querySelector("btn")
  • querySelectorAll()方法
    通过CSS选择器定位所有匹配的元素
    返回一个NodeList集合
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对象

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对象来查看它的属性或者方法我与DOM的第一次邂逅


判断节点类型

Node对象中提供了nodeName nodeType nodeValue 分别用于获取指定节点的节点名称 节点类型 节点值


nodeName 用于获取指定节点的节点名称

<button id='btn'></button>
var btn =document.getElementById('btn');
console.log(btn.nodeName)   //BUTTON

不同的节点类型 nodeName返回的节点名称不同 :

  • 元素节点(Element) ---> 元素节点的节点名
  • 属性节点(Attribute) ---> 属性节点的属性名
  • 文本节点(Text) ---> #text
  • 文档节点(Document) ---> #document

nodeType 用于获取指定节点的节点类型

<button id='btn'></button>
var btn =document.getElementById('btn');
console.log(btn.nodeType)  //1

不同的节点类型 nodeType返回的节点名称也不同:

  • 元素节点(Element) ---> 1
  • 属性节点(Attribute) ---> 2
  • 文本节点(Text) ---> 3
  • 文档节点(Document) ---> 9

nodeValue用于获取指定节点的值

<button id='btn'>按钮</button>
var btn =document.getElementById('btn');
console.log(btn.nodeValue);   // null

不同的节点类型 nodeValue返回的节点类型也不同:

  • 元素节点(Element) ---> null
  • 属性节点(Attribute) ---> 属性节点的属性值
  • 文本节点(Text) ---> 文本节点的内容
  • 文档节点(Document) ---> null

获取节点

获取父节点

通过指定元素查找它的父节点 可以用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>

区别:

  • 父节点(parentNode) 并没有指定节点的父节点是哪一个类型的节点
  • 父元素节点(parentElement) 指定了节点的父节点一定是元素节点

获取html的父节点 为document文档节点
但document文档节点并不是元素节点

var html=document.documentElement;
console.log(html.parentNode)    //文档节点
console.log(html.parentElement)  //null

获取子节点

可以通过Node对象的childNodes firstChild lastChild 属性实现

  • 获取所有子节点
    childNodes用于获取指定节点的所有子节点
    返回一个只读的NodeList对象 并且是一个动态的NodeList对象
<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]
  • 获取第一个子节点
    Node对象提供的firstChild属性用于获取指定节点的第一个子节点
    如果当前节点无子节点 则返回null
<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前的换行
  • 获取最后一个子节点
    Node对象提供的lastChild属性用于获取指定节点的最后一个子节点
<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>

相关推荐