DOM
DOM Document Object Model
文档对象模型
操作HTML的节点(HTML标签)
DOM发展史
DOM0
DOM1 1998年 w3c推荐版本
DOM2 2000年 (主讲)
DOM3 2004年(主讲)
DOM4 2015年
1. 节点Node
? NodeName节点名字 NodeType节点类型 NodeValue节点值
元素节点:ElementNode 标签名 1 null
文本节点:TextNode #text 3 文本内容
属性节点:attributeNode 属性名 2 属性值
2. 快速查找节点
document
get获取
Element元素
ById通过ID
(1)通过ID值获取元素节点(ID唯一)
格式: document.getElementById(ID值); 参数必须是字符串
let divEle = document.getElementById("F66");
console.log(divEle);//<div>
(2)通过元素名称(标签名)获取元素节点 0到多个
格式: document.getElementsByTagName(标签名称);
let sectionEle = document.getElementsByTagName("section");
console.log(sectionEle[1]);//[section]
(3)通过name值获取元素节点 0到多个
格式: document.getElementsByName(name值);
let asideEle = document.getElementsByName("F66");
console.log(asideEle[0]);//
(4)通过class值获取元素节点 0到多个
格式: document.getElementsClassName(class值);
let footerEle = document.getElementsByClassName("F67");
console.log(footerEle);
console.log(footerEle[0]);
console.log(footerEle[1]);
(5)可以通过CSS选择器来获取第1个满足条件的元素节点
格式: document.querySelector(css选择器);
let navEle = document.querySelector("header>nav");
console.log(navEle);
(6)可以通过CSS选择器来获取所有满足条件的元素节点
格式: document.querySelectorALL(css选择器);
let navEle1 = document.querySelectorAll("header>nav");
console.log(navEle1);
console.log(navEle1[0]);
console.log(navEle1[1]);
###### DOM 节点增、删、改、查
1. 查找
关系层次查找节点
let spanEle1 = document.querySelector("article>.F01>p:nth-child(1)>span")
console.log(spanEle1);
查找父节点 格式:当前节点.parentNode
console.log(`我是元素1的父节点:`,spanEle1.parentNode);
查找兄弟节点
let spanEle2 = document.querySelector("article>.F01>p:nth-child(1)>span:nth-child(2)")
console.log(spanEle2);//元素2
向前查找兄弟节点
console.log(`我是前一个兄弟节点:`,spanEle2.previousSibling);//#text
console.log(`我是前一个兄弟节点:`,spanEle2.previousSibling.previousSibling);//元素1
向后查找兄弟节点
console.log(`我是前一个兄弟节点:`,spanEle2.nextSibling);//#text
console.log(`我是前一个兄弟节点:`,spanEle2.nextSibling.nextSibling);//元素3
[扩展]
let ele =spanEle2.previousSibling.nextSibling.nextSibling.previousSibling.nextSibling.nextSibling;
console.log(ele);
查找子节点
let pEle = document.querySelector("article>.F01>p:nth-child(1)");
console.log(pEle.firstChild);//#text
查找最后一个子节点
console.log(pEle.lastChild);//#text
console.log( pEle.children);
console.log( pEle.children[0]);
console.log( pEle.children[1]);
console.log( pEle.children[2]);
查找第一个子元素节点
console.log(pEle.firstElementChild);//元素1
查找最后一个子元素节点
console.log(pEle.lastElementChild);//元素3
查找兄弟元素节点
let spanEle2 = document.querySelector("article>.F01>p:nth-child(1)>span:nth-child(2)");
向前查找兄弟元素节点
console.log(`我是前一个兄弟元素节点:`,spanEle2.previousElementSibling);//元素1
向后查找兄弟元素节点
console.log(`我是后一个兄弟元素节点:`,spanEle2.nextElementSibling);//元素3
3. ##### 新增节点
- 实现步骤
###### 1.创建元素节点
书写格式:document.createElement(‘元素‘);
###### 2.创建元素内容(文本节点)
书写格式:document.createTextNode(‘元素内容‘);
###### 3.新节点的存放位置
书写格式:元素节点.appendChild(文本节点);
插入
书写格式:父元素.insertBefore(参1,参2);//参数1是新元素,参数2是已有元素
删除
书写格式:父元素.removeChild(当前元素节点);
修改元素
书写格式:父元素.replaceChild(参1,参2);//参1:新元素;参2:旧元素
快速替换元素内容
方式一:书写格式:父元素.innerText = "元素内容";//写什么就在页面显示什么
方式二:书写格式:父元素.innerHTML = "元素内容";//能够识别HTML代码
克隆节点
1. 深克隆 包含复制节点的子节点
书写格式:let 新节点 = 克隆节点.cloneNode(true);
2. 浅克隆 只复制元素节点,其子节点不复制
书写格式:let 新节点 = 克隆节点.cloneNode(false);
* 属性节点
1.查找存在的属性
```
书写格式:当前节点.getAttribute("属性名");//属性值
```
书写格式:当前节点.getAttribute("属性名");//属性值
```
2.查找不存在的属性
```
书写格式:当前节点.getAttribute("属性名");//null
```
书写格式:当前节点.getAttribute("属性名");//null
```
3.修改属性节点的值
```
书写格式:当前节点.setAttribute("参1","参2");//参1:属性名 参2:新的属性值
```
书写格式:当前节点.setAttribute("参1","参2");//参1:属性名 参2:新的属性值
```
4.新增
```
书写格式:当前节点.setAttribute("参1","参2");//参1:新的属性名 参2:新的属性值
```
书写格式:当前节点.setAttribute("参1","参2");//参1:新的属性名 参2:新的属性值
```
5.删除
```
书写格式:当前节点.removeAttribute("属性名");
```
书写格式:当前节点.removeAttribute("属性名");
```
6.设置属性由于class在js中是关键字,无法使用
为了能够修改class属性,特地提供className进行设置
```
书写格式:当前节点.className = "新属性值";
```
7.设置属性由于label在js中是关键字,无法使用
为了能够修改label属性,特地提供htmlFor进行设置
```
书写格式:当前节点.htmlFor = "新属性值";
```
8.自定义属性 以date-开头
```
示例:
```
```
//html部分
<nav class="F67" id="F88" data-lovo="456">我是兄弟
<p><span>1</span></p>
<p><span>2</span></p>
<p><span>3</span></p>
</nav>
//js部分
let navEle = document.querySelector(".F67");
navEle.dataset.lovo ="123";
//最终<nav>中的data-lovo="123"
```
书写格式:当前节点.className = "新属性值";
```
7.设置属性由于label在js中是关键字,无法使用
为了能够修改label属性,特地提供htmlFor进行设置
```
书写格式:当前节点.htmlFor = "新属性值";
```
8.自定义属性 以date-开头
```
示例:
```
```
//html部分
<nav class="F67" id="F88" data-lovo="456">我是兄弟
<p><span>1</span></p>
<p><span>2</span></p>
<p><span>3</span></p>
</nav>
//js部分
let navEle = document.querySelector(".F67");
navEle.dataset.lovo ="123";
//最终<nav>中的data-lovo="123"
```