DOM概述
DOM(document object model)是文档对象模型,它为开发者提供了操作HTML元素和文档节点的属性和方法,方便开发者使用这些属性和方法开发出功能更强大的网页。
认识DOM
在DOM中,一个HTML文档是一个树状结构,HTML文档中的元素、属性、文本等不同的内容在内存中转换为DOM树种向对应类型的节点(node)。
常见的节点类别
(1)根节点:<html>是整个HTML节点的根节点,一个HTML文档仅有一个html元素。
(2)父节点:父节点为某个节点的上级节点,如<head>为<meta>和<title>的父节点。
(3)子节点:子节点为某个元素节点的下级节点,如<head>和<body>为<html>的子节点,通常一个为HTML文档仅有一个<head>和一个<body>。
(4)兄弟节点:兄弟节点为拥有同一个父节点的节点,如<h1>和<div>为兄弟节点。
(5)叶节点:叶节点为无子节点的节点,如文本节点Hello。
HTML元素操作
在日常开发种,经常需要对HTML文档元素进行操作,包括获取元素,以及操作元素的内容,样式,属性等
1. 获取元素
在JavaScript中,通常使用document对象中的方法来获取HTML文档中的元素。
document对象获取元素的方法:
举个例子:
<div id="hello">hello</div> <a name="link">链接</a> <p>title</p> <p class="tom">tom</p> <script> // 通过 id 属性值 hello 获取对应元素 console.log(document.getElementById("hello")); // 通过 name 属性值 link 获取所有元素 console.log(document.getElementsByName("link")); // 通过标签名 p 获取所有元素 console.log(document.getElementsByTagName("p")); // 通过类名 tom 获取所有元素 console.log(document.getElementsByClassName("tom")); </script>
注意:
其中,getElementById()返回一个元素,getElementsByName()返回了NodeList对象,getElementsByTagName()和getElementsByClassName()都返回HTMLCollection对象。
NodeList 对象和 HTMLCollection 对象都属于类数组。类数组的取值方式同数组一样,可以从下标0 开始获取,同时可以通过 length 属性获取该对象的长度。
举个例子:
// 获取第 1 个 name 属性值为 link 的元素 var elm1 = document.getElementsByTagName("link")[0]; // 获取第 2 个标签名为 p 的元素 var elm2 = document.getElementsByTagName("p")[1]; // 获取第 1 个类名为 tom 的元素 var elm3 = document.getElementsByClassName("tom")[0];
2. 操作元素内容
在日常开发中,经常需要获取和修改某个元素的内容,DOM提供一些属性和方法来操作元素内容。
举个例子:
<div id="content"> <span>DOM,</span> <span>全称为 document object model。</span> <a href="#">这是个链接</a> <script>var x = 1;</script> </div> <script> //通过 id 属性值 content 获取对应元素 div var a = document.getElementById("content"); //通过标签名 span 获取所有元素,共两个 var b = document.getElementsByTagName("span"); //通过标签名 a 获取所有元素,共一个 var c = document.getElementsByTagName("a"); //在控制台输出指定元素 div 内去除所有标签和样式的文本内容 console.log(a.innerText); //在控制台输出指定元素 div 开始和结束标签之间的 HTML 内容 console.log(a.innerHTML); //在控制台输出指定元素 div 的文本内容 console.log(a.textContent); //设置第一个 span 元素去除所有标签和样式的文本内容 b[0].innerText = "DOM 的全称为 document object model,"; //设置第二个 span 元素的文本内容 b[1].textContent = "是指文档对象模型。"; //设置第一个 a 元素开始和结束标签之间的 HTML 内容 c[0].innerHTML = "<p>点击链接查看详情</p>"; console.log(b[0].innerText); console.log(b[1].textContent); console.log(c[0].innerHTML); </script>
效果展示:
控制台:
注意innerHTML和innerText的区别:
innerHTML获取的内容包括元素里面的所有标签,属性和文本内容。
innerText获取的内容只有元素里面的文本内容。
3. 操作元素样式
为了满足用户对于美观度的需要,DOM 提供了两种操作元素样式的方式,分别是通过 style 属性和class 属性进行操作。
(1)通过 style 属性操作元素样式。 CSS样式中的单词之间是以 “-” 间隔的,而通过DOM 设置的 style 属性是以驼峰式命名。
下面是部分样式的属性:
举个例子:
<head> <meta charset="utf-8"> <title>例 11-3</title> <style> .big { font-size: 28px;} .green { color: green;} .red { color: red;} </style> </head> <body> <div id="content" class="big">操作元素样式</div> <script> // 获取 id 属性值为 content 的对应元素 div var a = document.getElementById("content"); // 通过 style 属性操作元素样式 a.style.width = "300px"; // 设置元素宽度为 300 px a.style.height = "100px"; // 设置元素高度为 100 px a.style.backgroundColor = "green";// 设置元素背景颜色为绿色 </script> </body>
效果展示:
(2)通过 class 属性操作元素样式。一个元素可以有多个类选择器,开发中可以使用class 属性来达到我们想要的效果。
classList 对象的属性和方法:
举个例子:
<head> <meta charset="utf-8"> <title>例 11-3</title> <style> .big { font-size: 28px;} .green { color: green;} .red { color: red;} </style> </head> <body> <div id="content" class="big">操作元素样式</div> <script> // 获取 id 属性值为 content 的对应元素 div var a = document.getElementById("content"); // 获取并输出元素所有类名,结果为 big console.log(a.classList.value); a.classList.add("green"); // 给元素添加类名 green console.log(a.classList.value); // 输出结果 big green a.classList.remove("big"); // 删除元素类名 big console.log(a.classList.value); // 输出结果 green // 若元素中没有 big 类将添加;若有则删除 a.classList.toggle("big"); console.log(a.classList.value); // 输出结果 green big // 用 red 类替换掉元素中的 green 类 a.classList.replace("green", "red"); console.log(a.classList.value); // 输出结果 red big // 判断元素中是否包含 green 类 var result = a.classList.contains("green"); console.log(result); // 输出结果 false </script> </body>
效果展示:
控制台:
4. DOM节点操作
一个完整的 HTML文档是由一个个元素标签嵌套组成的,大部分元素内容都包含其它元素节点。
① 获取节点
在 DOM 中,HTML文档是树状结构,且文档中的元素、属性、文本等不同的内容可以转换为 DOM 树的节点,不同的节点之间存在相互关系,比如父子关系,兄弟关系。
获取节点的常用属性:
举个例子:
<h1>获取节点</h1> <div id="content"> <span>我是一个 span 标签</span> <!-- 我是一个注释 --> <a href="#">我是一个 a 标签</a> </div> <p>我是一个 p 标签</p> <script> // 获取 id 为 content 的元素 div var a = document.getElementById("content"); console.log("childNodes:",a.childNodes);//输出 a 的所有子节点的所有内容包括空格换行 console.log("firstChild:",a.firstChild);//输出a 的第一个子节点的所有内容包括空格换行 console.log("lastChild:",a.lastChild);//输出 a 的最后一个子节点的所有内容包括空格换行 console.log("childNodes:",a.childNodes);//输出 a 的所有子节点所有的内容包括空格换行 console.log("firstChild:",a.firstChild);//输出a 的第一个子节点所有内容包括空格换行 console.log("lastChild:",a.lastChild);//输出 a 的最后一个子节点所有内容包括空格换行 // 输出 a 的前一个兄弟节点所有的内容包括空格换行 console.log("previousSibling:",a.previousSibling); // 输出 a 的后一个兄弟节点所有的内容包括空格换行 console.log("nextSibling: ", a.nextSibling); </script>
效果展示:
②增加修改创建节点
除了获取某个元素的相关节点外,DOM 提供了一些方法用于增加节点,创建节点、插入节点、替换节点到对应元素的方法。
注意:创建节点的相关方法属于 document 对象,插入或替换节点的相关方法属于 element 对象
举个例子:
<script> var a = document.getElementById("content"); var pNode = document.createElement("p"); //创建一个 p 元素节点 // 创建一个 id 属性节点 var pAttrNode = document.createAttribute("id"); pAttrNode.value = "title"; //设置 id 属性节点为 title pNode.setAttributeNode(pAttrNode); //将属性节点设置到 p 元素节点 // 创建一个文本节点 var textNode = document.createTextNode("这是一个文本"); pNode.appendChild(textNode); // 将文本节点插入到 p 元素节点 // 创建一个注释节点 var commentNode = document.createComment("这是一个注释"); // 添加注释节点到文本节点之前 pNode.insertBefore(commentNode, textNode); a.appendChild(pNode); //将 p 元素节点插入到 div 元素中 console.log(a);
</script>
效果展示:
③删除节点
除了获取和增加节点之外,DOM 还提供了删除节点的方法。删除节点的方法主要有removeChild() 和 removeAttributeNode() 。
removeChild() 方法用于删除指定元素节点,removeAtrributeNode() 方法用于删除指定属性节点。
举个例子:
<body> <h1>删除节点</h1> <div id="content" class="big"> <p>这是一个 p 标签</p> </div> <script> var a = document.getElementById("content"); // 获取 div 元素 var b = document.getElementsByTagName("p")[0]; // 获取 p 元素 a.removeChild(b); // 从div元素中删除p元素节点 // 从 div 元素中获取 class 属性节点 var classNode = a.getAttributeNode("class"); //从 div 元素中删除 class 属性节点 a.removeAttributeNode(classNode); console.log(a); </script> </body>
效果展示:
控制台:
标签:console,log,DOM,元素,var,document,节点 From: https://www.cnblogs.com/gzyhrc/p/17922848.html