首页 > 编程语言 >DOM【JavaScript】

DOM【JavaScript】

时间:2024-09-21 15:24:35浏览次数:13  
标签:const DOM JavaScript element getElementById console document 节点

在JavaScript中,DOM (Document Object Model:文档对象模型) 是web页面的编程接口,用于表示和操作 HTML 和 XML 文档。它将文档结构化为一个树形结构,允许开发者通过 JavaScript 访问和修改网页的内容、结构和样式。以下是一些关于DOM的关键概念:

1. 结构

DOM树结构是以节点为单位组织的。常见的节点类型包括:

文档节点(Document)整个HTML或XML文档。
元素节点(Element)HTML标签,如<div><p>等。
文本节点(Text)元素中的文本内容。
属性节点(Attribute)元素的属性,如classid

1.1 节点对象的重要属性

在 DOM 中,节点对象有几个重要的属性,以下是三个常用且重要的属性:

1.1.1 nodeName
const element = document.getElementById('myElement');
console.log(element.nodeName); // 输出:DIV
  • 描述节点的名称。
  • 对于元素节点,返回标签名称(例如,"DIV"、"P");对于文本节点,返回 "#text"。
1.1.2 nodeType
const element = document.getElementById('myElement');
console.log(element.nodeType); // 输出:1(如果是元素节点)
  • 返回节点的类型,值为数字。
  • 常用的节点类型:
    • 1:元素节点
    • 2:属性节点
    • 3:文本节点
    • 8:注释节点
    • 9:文档节点
1.1.3 parentNode
const element = document.getElementById('myElement');
console.log(element.parentNode); // 输出:父节点对象
  • 返回节点的父节点。如果节点没有父节点,则返回 null
  • 该属性常用于导航 DOM 结构。
示例代码
<div id="myElement">Hello LuQian</div>

<script>
    const element = document.getElementById('myElement');
    
    console.log('节点名称:', element.nodeName); // 输出节点名称
    console.log('节点类型:', element.nodeType); // 输出节点类型
    console.log('父节点:', element.parentNode); // 输出父节点
</script>

1.2 节点对象的其他常用属性

1.2.1 childNodes
  • 返回一个 NodeList,包含指定节点的所有子节点(包括元素节点、文本节点等)。
  • 通过索引可以访问特定的子节点。
const element = document.getElementById('myElement');
const children = element.childNodes;
console.log(children); // 输出所有子节点

1.2.2 firstChild / lastChild
  • firstChild 返回节点的第一个子节点,lastChild 返回最后一个子节点。如果没有子节点,则返回 null
const element = document.getElementById('myElement');
console.log(element.firstChild); // 输出第一个子节点
console.log(element.lastChild);  // 输出最后一个子节点

1.2.3 nextSibling / previousSibling
  • nextSibling 返回当前节点的下一个兄弟节点,previousSibling 返回上一个兄弟节点。如果没有相应的兄弟节点,则返回 null
const element = document.getElementById('myElement');
console.log(element.nextSibling); // 输出下一个兄弟节点
console.log(element.previousSibling); // 输出上一个兄弟节点

1.2.4 textContent
  • 获取或设置节点的文本内容。对于元素节点,它会返回该节点及其所有子节点的文本内容。
const element = document.getElementById('myElement');
console.log(element.textContent); // 输出节点的文本内容
element.textContent = '新的文本内容'; // 设置新的文本内容

1.2.5 innerHTML
  • 获取或设置节点的 HTML 内容。对于元素节点,它会返回该节点内部的 HTML 代码。
const element = document.getElementById('myElement');
console.log(element.innerHTML); // 输出节点的 HTML 内容
element.innerHTML = '<span>新的 HTML 内容</span>'; // 设置新的 HTML 内容

1.2.6 attributes
  • 返回一个 NamedNodeMap,包含元素的所有属性,可以通过属性名称或索引访问。
const element = document.getElementById('myElement');
const attrs = element.attributes;
console.log(attrs); // 输出所有属性
console.log(attrs[0].name); // 输出第一个属性的名称

示例代码
<div id="myElement">
    <p>这是一个段落。</p>
    <span>这是一个 span。</span>
</div>

<script>
    const element = document.getElementById('myElement');
    
    // childNodes
    console.log('所有子节点:', element.childNodes);
    
    // firstChild 和 lastChild
    console.log('第一个子节点:', element.firstChild);
    console.log('最后一个子节点:', element.lastChild);
    
    // nextSibling 和 previousSibling
    console.log('下一个兄弟节点:', element.nextSibling);
    console.log('上一个兄弟节点:', element.previousSibling);
    
    // textContent
    console.log('文本内容:', element.textContent);
    
    // innerHTML
    console.log('HTML 内容:', element.innerHTML);
    
    // attributes
    console.log('所有属性:', element.attributes);
</script>

1.3 动态操作节点的方法

动态操作节点的方法有很多,以下是一些常用的 DOM 操作方法,帮助你在网页中添加、删除和修改节点。

1.3.1 创建节点
  • document.createElement(tagName):创建一个指定标签名的元素节点。
const newDiv = document.createElement('div');
newDiv.textContent = '这是一个新创建的 div';

1.3.2 添加节点
  • parentNode.appendChild(childNode):将一个节点添加到指定父节点的子节点列表的末尾。
const container = document.getElementById('container');
container.appendChild(newDiv);

  • parentNode.insertBefore(newNode, referenceNode):在指定的参考节点之前插入一个新节点。
const referenceNode = container.firstChild;
container.insertBefore(newDiv, referenceNode);

1.3.3 删除节点

parentNode.removeChild(childNode):从父节点中删除指定的子节点。

container.removeChild(newDiv); // 删除刚才添加的新 div

1.3.4 替换节点
  • parentNode.replaceChild(newNode, oldNode):用新节点替换指定的旧节点。
const replacementDiv = document.createElement('div');
replacementDiv.textContent = '这是替换后的 div';
container.replaceChild(replacementDiv, newDiv);

1.3.5 克隆节点
  • node.cloneNode(deep):克隆一个节点,可以选择是否克隆其子节点。
const clonedDiv = newDiv.cloneNode(true); // deep 为 true 时克隆子节点
container.appendChild(clonedDiv);

1.3.6 修改节点属性
  • element.setAttribute(name, value):设置指定元素的属性值。
newDiv.setAttribute('class', 'my-class');

  • element.removeAttribute(name):移除指定元素的属性。
newDiv.removeAttribute('class');

示例代码
<div id="container"></div>

<script>
    // 创建一个新的 div
    const newDiv = document.createElement('div');
    newDiv.textContent = '这是一个新创建的 div';
    
    // 将新 div 添加到容器中
    const container = document.getElementById('container');
    container.appendChild(newDiv);
    
    // 替换新 div
    const replacementDiv = document.createElement('div');
    replacementDiv.textContent = '这是替换后的 div';
    container.replaceChild(replacementDiv, newDiv);
    
    // 克隆替换后的 div
    const clonedDiv = replacementDiv.cloneNode(true);
    container.appendChild(clonedDiv);
    
    // 修改克隆 div 的属性
    clonedDiv.setAttribute('class', 'my-class');
</script>

2. 常用操作

通过JavaScript,开发者可以进行各种DOM操作:

  • 选择元素:使用document.getElementById()document.querySelector()等方法选择元素。
  • 创建元素:使用document.createElement()方法创建新元素。
  • 添加/删除元素:使用appendChild()removeChild()等方法进行元素的添加和删除。
  • 修改属性和内容:可以通过setAttribute()innerHTML等修改元素的属性和内容。
  • 事件处理:使用addEventListener()方法为元素添加事件监听器。

2.1 选择元素

获取元素节点对象的方式有几种常用的方法,主要使用 JavaScript 提供的 DOM API。以下是一些常见的方法:

2.1.1 getElementById

根据元素的 ID 获取元素节点。

<div id="myElement">Hello LuQian</div>
<script>
  const element = document.getElementById('myElement');
  console.log(element); // 输出:<div id="myElement">Hello LuQian</div>
</script>

 

2.1.2 getElementsByClassName

根据元素的类名获取元素节点集合。

<div class="myClass">Item 1</div>
<div class="myClass">Item 2</div>
<script>
  const elements = document.getElementsByClassName('myClass');
  console.log(elements); // 输出:HTMLCollection(2) [div.myClass, div.myClass]
</script>

 

2.1.3 getElementsByTagName

根据元素的标签名获取元素节点集合。

<p>Paragraph 1</p>
<p>Paragraph 2</p>
<script>
  const elements = document.getElementsByTagName('p');
  console.log(elements); // 输出:HTMLCollection(2) [p, p]
</script>

 

2.1.4 querySelector

使用 CSS 选择器获取第一个匹配的元素节点。

<div class="myClass">Hello LuQian</div>
<script>
  const element = document.querySelector('.myClass');
  console.log(element); // 输出:<div class="myClass">Hello LuQian</div>
</script>

 

2.1.5 querySelectorAll

使用 CSS 选择器获取所有匹配的元素节点集合。

<div class="myClass">Item 1</div>
<div class="myClass">Item 2</div>
<script>
  const elements = document.querySelectorAll('.myClass');
  console.log(elements); // 输出:NodeList(2) [div.myClass, div.myClass]
</script>

 

2.2 创建元素

使用 document.createElement() 方法创建新元素。

// 创建一个新元素
const newDiv = document.createElement('div');
newDiv.textContent = '这是一个新创建的元素'; // 设置新元素的文本内容

 

2.3 添加/删除元素

使用 appendChild() 和 removeChild() 方法进行元素的添加和删除。

2.3.1 appendChild()

appendChild() 方法用于将一个节点添加到指定父节点的子节点列表的末尾。语法如下:

parentNode.appendChild(newChild);
示例:
<div id="container"></div>

<script>
  const container = document.getElementById('container');
  const newElement = document.createElement('p');
  newElement.textContent = '这是一个新添加的段落。';
  
  container.appendChild(newElement);
</script>

2.3.2 removeChild()

removeChild() 方法用于从父节点中删除指定的子节点。语法如下:

parentNode.removeChild(childNode);
示例:
<div id="container">
  <p id="toRemove">这个段落将被删除。</p>
</div>

<script>
  const container = document.getElementById('container');
  const elementToRemove = document.getElementById('toRemove');
  
  container.removeChild(elementToRemove);
</script>

 

综合示例:

下面是一个综合示例,展示了如何添加和删除元素:

<!DOCTYPE html>
<html lang="zh">
	<head>
		<meta charset="UTF-8">
		<title>DOM 示例</title>
	</head>
	<body>
		<div id="container"></div>
		<button id="addButton">添加段落</button>
		<button id="removeButton">删除段落</button>

		<script>
			const container = document.getElementById('container');
			const addButton = document.getElementById('addButton');
			const removeButton = document.getElementById('removeButton');

			addButton.addEventListener('click', () => {
				const newElement = document.createElement('p');
				newElement.textContent = '这是一个新添加的段落。';
				container.appendChild(newElement);
			});

			removeButton.addEventListener('click', () => {
				const lastChild = container.lastChild;
				if (lastChild) {
					container.removeChild(lastChild);
				}
			});
		</script>


	</body>
</html>

在这个示例中,点击“添加段落”按钮会在容器中添加一个新的段落,而点击“删除段落”按钮会删除最后添加的段落。

2.4 修改属性和内容

使用 setAttribute() 和 innerHTML 修改元素的属性和内容。

2.4.1 setAttribute() 

setAttribute()方法用于设置元素的属性值。语法如下:

element.setAttribute(name, value);

这里,name 是你要设置的属性的名称,value 是该属性的值。

示例:
<div id="myElement"></div>

<script>
  const element = document.getElementById('myElement');
  
  // 为元素添加 "href" 属性,值为 "https://www.example.com"
  element.setAttribute('href', 'https://www.example.com');
  
  // 为元素添加 "class" 属性,值为 "myClass"
  element.setAttribute('class', 'myClass');
</script>

 

2.4.2 innerHTML

innerHTML 属性用于设置元素内部的内容(HTML 标记)。语法如下:

element.innerHTML = html;

这里,html 是你想要设置的内容的 HTML 字符串。

示例:
<div id="contentDiv"></div>

<script>
  const contentDiv = document.getElementById('contentDiv');
  
  // 设置 div 内容为一个简单的字符串
  contentDiv.innerHTML = '这是新的内容。';
  
  // 设置 div 内容为一个复杂的 HTML 字符串
  contentDiv.innerHTML = '<div><p>这是嵌套的内容。</p></div>';
</script>

注意:innerHTML 属性会将你指定的 HTML 字符串完全替换掉原来的内容,意味着如果你有多个子元素,使用 innerHTML 将会把整个内容替换成一个新的大段 HTML 代码。如果你的内容仅限于文本,那么使用 textContent 或 innerText 属性可能是更好的选择。

2.5 事件处理

使用addEventListener() 方法用于为指定的元素添加事件监听器。这允许你对特定事件(如点击、鼠标移动、键盘输入等)做出反应。语法如下:

element.addEventListener(event, function, useCapture);
  • event:要监听的事件类型(如 'click''mouseover' 等)。
  • function:当事件发生时调用的函数(事件处理程序)。
  • useCapture(可选):布尔值,指示是否在捕获阶段执行事件处理程序,默认为 false
2.5.1 为按钮添加点击事件监听器

下面是一个简单的示例,展示如何为按钮添加点击事件监听器:

<button id="myButton">点击我</button>

<script>
  const button = document.getElementById('myButton');
  
  // 添加点击事件监听器
  button.addEventListener('click', () => {
    alert('按钮被点击了!');
  });
</script>

 

2.5.2 监听多个事件

你也可以为同一个元素添加多个事件监听器:

<button id="myButton">点击我</button>

<script>
  const button = document.getElementById('myButton');
  
  // 点击事件
  button.addEventListener('click', () => {
    alert('按钮被点击了!');
  });
  
  // 鼠标悬停事件
  button.addEventListener('mouseover', () => {
    button.style.backgroundColor = 'lightblue';
  });

  // 鼠标离开事件
  button.addEventListener('mouseout', () => {
    button.style.backgroundColor = '';
  });
</script>

在这个示例中,当鼠标悬停在按钮上时,按钮的背景颜色会改变,离开时颜色会恢复,点击按钮时会弹出提示框。

2.5.3 移除事件监听器

如果你需要在某个时刻移除事件监听器,可以使用 removeEventListener() 方法。记得使用相同的函数引用来移除监听器。

function handleClick() {
  alert('按钮被点击了!');
}

// 添加事件监听器
button.addEventListener('click', handleClick);

// 移除事件监听器
button.removeEventListener('click', handleClick);

2.5.4 鼠标移入和移出事件

当鼠标移入或移出某个元素时触发的事件。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>鼠标事件示例</title>
    <style>
        #hoverDiv {
            width: 200px;
            height: 100px;
            background-color: lightblue;
            text-align: center;
            line-height: 100px;
        }
    </style>
</head>
<body>
    <div id="hoverDiv">将鼠标移入我</div>
    <p id="hoverMessage"></p>

    <script>
        const hoverDiv = document.getElementById('hoverDiv');
        const hoverMessage = document.getElementById('hoverMessage');

        hoverDiv.addEventListener('mouseenter', () => {
            hoverMessage.textContent = '鼠标已移入!';
        });

        hoverDiv.addEventListener('mouseleave', () => {
            hoverMessage.textContent = '鼠标已移出!';
        });
    </script>
</body>
</html>

2.5.5 键盘事件

当用户在键盘上按下或松开某个键时触发的事件。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>键盘事件示例</title>
</head>
<body>
    <input type="text" id="textInput" placeholder="输入内容" />
    <p id="keyMessage"></p>

    <script>
        const input = document.getElementById('textInput');
        const keyMessage = document.getElementById('keyMessage');

        input.addEventListener('keyup', (event) => {
            keyMessage.textContent = `你输入了:${event.key}`;
        });
    </script>
</body>
</html>

2.5.6 表单事件

处理表单提交事件。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>表单事件示例</title>
</head>
<body>
    <form id="myForm">
        <input type="text" id="nameInput" placeholder="输入你的名字" required />
        <button type="submit">提交</button>
    </form>
    <p id="formMessage"></p>

    <script>
        const form = document.getElementById('myForm');
        const formMessage = document.getElementById('formMessage');

        form.addEventListener('submit', (event) => {
            event.preventDefault(); // 防止表单默认提交
            const name = document.getElementById('nameInput').value;
            formMessage.textContent = `你好,${name}!`;
        });
    </script>
</body>
</html>

2.5.7 窗口加载事件

窗口加载事件通常用于在网页完全加载后执行特定的JavaScript代码。这个事件可以确保所有的HTML元素、样式表和图像都已经加载完毕。

常用的加载事件有 window.onload 和 DOMContentLoaded

如果你只关心DOM结构,并希望在DOM构建完成后立即执行代码,使用 DOMContentLoaded 更合适.
如果你需要确保所有资源都已加载(例如,图像),则使用 window.onload
2.5.7.1 window.onload

window.onload 事件在整个页面,包括所有依赖的资源(如图像、样式等)都加载完成后触发。

window.onload = function() {
    console.log('页面完全加载!');
    // 这里可以放置其他代码
};

2.5.7.2 DOMContentLoaded

DOMContentLoaded 事件在文档的初始 HTML 被完全加载和解析后触发,不需要等待样式表、图像等其他资源加载完成。这使得它通常更快,适用于需要在文档加载后立即执行的代码。

document.addEventListener('DOMContentLoaded', function() {
    console.log('DOM内容已加载!');
    // 这里可以放置其他代码
});

示例:

下面是一个完整的示例,展示如何使用这两个事件:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>窗口加载事件示例</title>
</head>
<body>
    <h1>欢迎来到我的网页</h1>

    <script>
        // 使用 window.onload
        window.onload = function() {
            console.log('整个页面(包括所有资源)已加载!');
        };

        // 使用 DOMContentLoaded
        document.addEventListener('DOMContentLoaded', function() {
            console.log('DOM内容已加载!');
        });
    </script>
</body>
</html>

2.6 动态操作样式

2.6.1 直接操作样式

通过 element.style 直接修改样式属性,适合需要精确控制单个样式的场景。

<!DOCTYPE html>
<html lang="zh">
	<head>
		<meta charset="UTF-8">
		<title>直接操作样式</title>
		<style>
			#myElement {
				width: 100px;
				height: 100px;
				background-color: lightblue;
				transition: all 0.5s ease;
				/* 添加过渡效果 */
			}
		</style>
	</head>
	<body>
		<div id="myElement">直接修改样式</div>
		<button id="changeStyleBtn">改变样式</button>

		<script>
			const element = document.getElementById('myElement');
			const button = document.getElementById('changeStyleBtn');

			button.addEventListener('click', () => {
				// 直接修改样式属性
				element.style.backgroundColor = 'coral';
				element.style.width = '200px';
				element.style.height = '200px';
			});
		</script>
	</body>
</html>

2.6.2 通过类名控制样式

通过添加或移除 CSS 类来改变样式,更加优雅且易于管理,尤其是在需要复用样式时。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>DOM 类名控制样式示例</title>
    <style>
        .highlight {
            background-color: yellow; /* 高亮背景 */
            color: red; /* 字体颜色为红色 */
            font-weight: bold; /* 加粗字体 */
        }
    </style>
</head>
<body>
    <div id="myElement">Hello LuQian</div>
    <button id="toggleButton">切换样式</button>

    <script>
        const element = document.getElementById('myElement');
        const button = document.getElementById('toggleButton');

        // 为按钮添加点击事件
        button.addEventListener('click', () => {
            // 切换类名
            element.classList.toggle('highlight');
        });
    </script>
</body>
</html>

标签:const,DOM,JavaScript,element,getElementById,console,document,节点
From: https://blog.csdn.net/2302_77228054/article/details/142413587

相关文章

  • JavaScript 基础 - 第20天_Node.js入门
    文章目录Day01_Node.js入门提前安装软件目录学习目标01.什么是Node.js目标讲解小结02.fs模块-读写文件目标讲解小结03.path模块-路径处理目标讲解小结04.案例-压缩前端html目标讲解小结05.案例-压缩前端JS目标讲解小结06.认识URL中的端口号目标讲解小结07.http模......
  • HarmonyOs DevEco Studio小技巧18--JavaScript 变量声明与作用域
    在JavaScript中,变量声明和作用域是非常重要的概念。变量声明:var:使用 var 声明的变量,其作用域在函数内,如果在函数外声明,则为全局变量。存在变量提升现象,即在变量声明之前使用该变量不会报错,但值为 undefined。functionexample(){console.log(a);//undefine......
  • JavaScript(输出1-100,输出1-100总和,输出1-100的偶数,奇数和 用while循环和for循环两种方
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • JavaScript --- 3种数组去重的方法
     方法1<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="wi......
  • JavaScript --- 数组常用方法(3)
    foreach遍历<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content=&......
  • JavaScript是前端语言还是后端语言?
    JavaScript主要被称为前端语言,但它也广泛应用于后端开发。以下是其在这两个领域的角色细分:前端开发客户端脚本:JavaScript主要用于在网站上创建交互式和动态元素。这包括表单验证、动画和处理用户交互等任务。框架和库:React、Angular和Vue.js等流行框架和库利用JavaSc......
  • JavaScript 数组操作
    在javascript中操作2d、3d或4d数组对于ai模型训练和图像/音频/视频分析是必要的。下面是一些使用纯javascript进行数组操作的有用函数,无需使用tensorflow.js等矩阵包。二维数组的转置functiontranspose_2d_array(arr){vartranspose_colnum=arr.length;v......
  • JavaScript 数组方法:综合指南
    数组是javascript中最基本的数据结构之一。使用数组,您可以在单个变量中存储多个值。javascript提供了许多内置方法来操作数组,使它们具有令人难以置信的通用性。在这篇文章中,我们将探讨所有内置数组方法以及如何在javascript项目中有效地使用它们。核心方法forea......
  • JavaScript 最佳实践
    遵循javascript最佳实践有助于加快页面加载速度并提高性能,并提高代码可读性以及易于维护和调试。精心编写的代码还可以帮助避免错误和安全问题。01。避免全局变量尽量减少全局变量的使用。这包括所有数据类型、对象和函数。全局变量和函数可以被其他脚本覆盖。使用局部变量并学......
  • JavaScript 模块
    现在我们不再将所有js写在一个文件中并发送给客户端。今天,我们将代码编写到模块中,这些模块之间共享数据并且更易于维护。约定是使用驼峰命名法命名模块。我们甚至可以通过npm存储库将第3方模块包含到我们自己的代码中,例如jquery、react、webpack、babel等。最终的捆绑包是......