DOM技术点

全称:Document(浏览器)Object(对象)Model(模型)

DOM0

DOM1 1998年 w3c标准

DOM2 2000年 ()

DOM3 2004年 ()

DOM4 2015年

## 1、节点Node:元素、标签、注释

// 节点名称 节点类型 节点的值

// (NodeName) (NodeType) (NodeValue)

// 元素节点 标签名 1 null

// 文本节点 #text 3 文本内容

// 属性节点 属性名 2 属性值

节点也是一个对象

### 通过ID值获取元素

get 获取、Element 元素、By 通过、Id

// let getNode = document.getElementById("box3");

// console.log(getNode);

// console.log(getNode.nodeName); //获取到的节点名称都是大写字母DIV

// console.log(getNode.nodeType); //1

// console.log(getNode.nodeValue); //null

// // 便捷方式

// console.log(box2.nodeName);

// console.log(box2.nodeType);

// console.log(box2.nodeValue);

### 通过类名获取元素

//类名是可以0-多个,因此需要存储多个数值的变量来接收(类数组)

// let art = document.getElementsByClassName("xlb");

// console.log(art); //输出数组

// console.log(art[2]); //获取具体的元素用下标

### 通过标签名获取元素

let art = document.getElementsByTagName("div");

console.log(art); //输出数组

console.log(art.length);

console.log(art[2].style.color="red"); //获取具体的元素用下标

### 通过Name值来获取元素

let nameNode = document.getElementsByName("f68")[0];

console.log(nameNode);

### 通过CSS选择器获取元素

querySelector和querySelectorAll这两种方法的特点:

1、IE8以下不支持

2、无法实时返回元素(删除或增加)

弊端:不能实时监控数据,删除时无法更新

//.querySelector 获取第一个满足条件的元素

// let artSpanNode = document.querySelector("article span");

//.querySelectorAll获取所有满足条件的元素

// let artSpanNode = document.querySelectorAll("article span");

// console.log(artSpanNode[1]);

// let artSpanNode = document.querySelectorAll("article>header>.box>.box1");

// console.log(artSpanNode);

// let SpanNode = document.getElementsByClassName("box")[0];

// console.log(SpanNode);

### 兄弟元素,选中下一个

//console.log(SpanNode.nextSibling); //#text 文本节点,回车也算一个节点

//console.log(SpanNode.nextSibling.nextSibling); //<span>abcdef</span>

//下一个元素节点

// console.log(SpanNode.nextElementSibling);//<span>abcdef</span>

### 兄弟元素,选中上一个

//console.log(SpanNode.previousSibling); //#text

//console.log(SpanNode.previousSibling.previousSibling); //<span>123456</span>

//上一个元素节点

// console.log(SpanNode.previousElementSibling);//<span>123456</span>

//获取父节点

//let faNode = SpanNode.parentNode;

// console.log(faNode);

//获取子元素节点

//console.log(faNode.children);//nav的所有子元素节点

//获取第一个子节点

// console.log(faNode.firstChild);//#text

//获取第一个子元素节点

// console.log(faNode.firstElementChild);

//获取最后一个子节点

//console.log(faNode.lastChild);//#text

//获取最后一个子元素节点

// console.log(faNode.lastElementChild);

## 2、新增节点:

//获取父节点

let artEle =document.querySelector(".box1");

console.log(artEle);

// step1、节点名称

// 格式:document.createElement("标签名");

let headerEle = document.createElement("header");

console.log(headerEle);

//step2、元素内容

let headerText = document.createTextNode("f68");

console.log(headerEle.innerText);//空

//step3、添加文本节点

headerEle.appendChild(headerText);

console.log(headerEle.innerText);

//step4、添加节点

artEle.appendChild(headerEle);

//获取2个header一样的节点:

//必须重新获取两个节点,相同节点相当于剪切,移动后会删除原来的节点

let headerEle2 = document.createElement("header");

let headerText2 = document.createTextNode("f68");

headerEle2.appendChild(headerText2);

artEle.appendChild(headerEle2);

## 3、修改|替换节点内容:

* .innerText和.innerHTML区别?

* 都是节点的属性。把所有内容当字符串的方式显示到节点的内容中

会改变、替换原来的东西

* 注:如果字符串中包含标签,.innerHTML 会识别成元素,.innerText 会当成普通文本

* 会快速修改| 替换节点里面的内容

// spanEle.innerText = `${count}秒后自动关闭X`;

// let pEle=document.querySelector(".box2");

// let count = 5;

// pEle.innerHTML = `<span>${count--}秒后自动关闭X</span>`;

// console.log(pEle);

## 实现广告倒计时

// let spanEle = document.querySelector("aside>span");

// console.log(spanEle);

// // window.onload 加载

// let count = 5;

// function f68() {

// if (count > 0) {

// spanEle.innerText = `${count--}秒后自动关闭X`;

// let asideEle = document.querySelector("aside");

// asideEle.style.bottom="10px";

// asideEle.style.visibility="visible";

// } else {

// asideEle.style.bottom="-200px";

// clearInterval(timer);

// }

// }

// let timer = setInterval(f68, 1000);

## 插入节点(不存在的节点)

插入页面中不存在的节点:

//格式:父节点.insertBefore(B,A);

//获取父节点

//let pEle = document.getElementsByClassName("box2")[0];

//被插入的节点 A

// let emEle = document.getElementsByClassName("haha")[0];

// //创建插入节点 B

// let spanEle = document.createElement("span");

// //插入新创建的节点

// //格式:父节点.insertBefore(B,A);

// pEle.insertBefore(spanEle,emEle);

// console.log(pEle);

## 移动节点:已有的节点

插入页面中已有的节点:

// let pEle = document.getElementsByClassName("box2")[0];

// //被插入的节点 A

// let emEle = document.getElementsByClassName("haha")[0];

// //创建插入节点 B

// let strongEle = document.querySelector("strong");

// //插入新创建的节点

// pEle.insertBefore(strongEle,emEle);

// console.log(pEle);

## 删除节点:

//不能用delete,,,,,

// let headerEle = document.querySelector("header");

// let navEle = document.querySelector("nav");

// console.log(navEle);

### 格式1:.remove();

格式1:被删除节点.remove();

// navEle.remove();

// console.log(headerEle);

### 格式2:.removeChild();

格式2:父节点.removeChild(被删除子节点);

// headerEle.removeChild(navEle); //removeChild方法

// console.log(headerEle);

## 替换节点 .replaceChild

step1、获取被替换的节点

step2、获取新节点

step3、获取替换元素的父节点

书写格式:父节点.replaceChild(新节点,替换节点);

// let citeEle = document.querySelector("cite");

// console.log(citeEle);

// let qNew=document.createElement("q");

// let faEle =document.querySelector("footer");

// // let faEle =citeEle.parentNode;

// // let faEle =citeEle.parentElement;

// //书写格式:父节点.replaceChild(新节点,替换节点);

// faEle.replaceChild(qNew,citeEle);

// console.log(faEle);

## 属性

// let imgEle = document.querySelector("img");

### 获取节点的属性值.getAttribute

// let srcEle = imgEle.getAttribute("src");

### 设置节点的属性值.setAttribute

//如果有就是替换修改,如果没有这个属性就新增

// function f68(){

// imgEle.setAttribute("src","./IMG/shutter_2.jpg");

// imgEle.setAttribute("class","box box1");

// }

//例2:快速修改和添加节点属性(属性名和属性值)

// let imgEle = document.querySelector("img");

// function f68(){

// imgEle.src="./IMG/shutter_2.jpg";

// imgEle.className="box box1";

// }

### 删除属性 .removeAttribute;

删除属性 .removeAttribute(属性名);

// imgEle.removeAttribute("name");

## 通过属性选择器获取自定义属性节点

//自定义属性名要加一个前缀,data-名字(data:公司名)

// let divEle = document.querySelector(`[data-f68="123"]`);

// console.log(divEle);

//例3:原有自定义属性 .dataset.f68="";

// function f68() {

// divEle.dataset.f68="lovo"; //data- 识别不了,用dataset.类名实现

// }

## 给节点添加样式

//以内嵌样式来实现样式添加:

// let divEle = document.querySelector(".zl");

// divEle.style.width="100px";

// divEle.style.height="100px";

// divEle.style.backgroundColor="deeppink";

// divEle.innerText="张雨涵";

// divEle.style.color="white";

// divEle.style.position="absolute";

// divEle.style.right="10px";

// divEle.style.bottom="10px";

// console.log(divEle);

## 获取节点css样式

// let asideEle = document.querySelector("aside");

//获取行内样式

// console.log(asideEle.style.height);

// 获取外部样式

//.client 会加上 content+padding

// console.log("clientHeight",asideEle.clientHeight);

// console.log(".clientWidth",asideEle.clientWidth);

// //.offset 会加上 content+padding+border

// console.log("offsetHeight",asideEle.offsetHeight);

// console.log("offsetWidth",asideEle.offsetWidth);

## 获取节点的位置

::判断当前节点的上级元素有没有固定或绝对定位,有就是离父级的距离,没有就是离视口的距离

//节点离视口的位置

console.log("offsetLeft",asideEle.offsetLeft);

console.log("offsetTop",asideEle.offsetTop);

//节点离包含快的位置

console.log("offsetLeft",spanEle.offsetLeft);

console.log("offsetTop",spanEle.offsetTop);

原文地址:https://www.cnblogs.com/liqiang95950523/p/13725755.html