DOM遍历

本文介绍了DOM遍历的三种主要情况:查找父元素、查找子元素以及查找兄弟元素。在JavaScript中,可以利用如childNodes、firstChild、lastChild以及children、firstElementChild、lastElementChild等方法来实现这些操作。注意,childNodes包含所有子节点,包括元素节点和文本节点,而children只包含元素节点。

DOM遍历可以分为以下三种情况:

  • 查找父元素
  • 查找子元素
  • 查找兄弟元素

查找父元素

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
	<style type="text/css">
		table{border-collapse: collapse;}
		table,tr,td{border: 1px solid gray;}
	</style>
	<script type="text/javascript">
		window.onload=function(){
			var oTd=document.getElementsByTagName("td");

			for(var i=0;i<oTd.length;i++){
				oTd[i].onclick=function(){
					var oParent=this.parentNode;//查找td的父元素

					oParent.style.color="white";
					oParent.style.backgroundColor="yellow";
				};
			}
		}
	</script>
</head>
<body>
	<table>
		<caption>考试成绩</caption>
		<tr>
			<td>小明</td>
			<td>80</td>
			<td>80</td>
			<td>80</td>
		</tr>
		<tr>
			<td>小红</td>
			<td>90</td>
			<td>90</td>
			<td>90</td>
		</tr>
		<tr>
			<td>小杰</td>
			<td>100</td>
			<td>100</td>
			<td>100</td>
		</tr>
	</table>

</body>
</html>

查找子元素

在Javascript中,可以使用两组方法来获得父元素中所有子元素或某个子元素

  • childNodes、firstChild、lastChild
  • children、firstElementChild、lastElementChild

其中,childNodes获取的是所有的子节点,这个子节点是包括元素节点以及文本节点的,而children获取的是所有元素节点,不包括文本节点。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
	<script type="text/javascript">
		window.onload=function(){
			var oUl=document.getElementById("list");
			var childNodeLen=oUl.childNodes.length;
			var childrenLen=oUl.children.length;

			alert("childNodes的长度为:"+childNodeLen+"children的长度为:"+childrenLen);
		}
		
	</script>
	
</head>
<body>
	<ul id="list">
		<li>HTML</li>
		<li>CSS</li>
		<li>JavaScript</li>
	</ul>
</body>
</html>

### 遍历 DOM 元素并统计页面中的单词数量 在 JavaScript 中,遍历 DOM 元素并统计页面中单词数量可以通过以下方式实现。首先,遍历页面中的所有文本节点,然后提取文本内容,最后对文本中的单词进行统计。 #### 遍历 DOM 元素 为了遍历页面中的所有文本节点,可以使用递归方法遍历 DOM 树。以下是一个遍历 DOM 元素的示例代码: ```javascript function traverseDOM(node) { if (node.nodeType === Node.TEXT_NODE) { // 处理文本节点 console.log(node.textContent); } else { // 遍历子节点 for (let child of node.childNodes) { traverseDOM(child); } } } // 从 document.body 开始遍历 traverseDOM(document.body); ``` 此代码通过递归方式遍历 `document.body` 下的所有子节点,并检查每个节点的类型。如果节点是文本节点(`Node.TEXT_NODE`),则提取其内容进行处理。 #### 统计单词数量 在提取文本内容后,需要将文本分割为单词并统计数量。以下是一个统计单词数量的示例代码: ```javascript function countWords(text) { // 使用正则表达式匹配单词 const words = text.match(/\b\w+\b/g); return words ? words.length : 0; } function traverseAndCountWords(node) { let totalWordCount = 0; if (node.nodeType === Node.TEXT_NODE) { // 统计当前文本节点的单词数量 totalWordCount += countWords(node.textContent); } else { for (let child of node.childNodes) { totalWordCount += traverseAndCountWords(child); } } return totalWordCount; } // 从 document.body 开始遍历并统计单词数量 const wordCount = traverseAndCountWords(document.body); console.log(`页面中的单词总数为: ${wordCount}`); ``` 上述代码通过 `countWords` 函数统计每个文本节点中的单词数量,并将所有文本节点的结果相加,最终输出页面中的单词总数。 #### 使用 `Node.childNodes` 和 `Node.nodeType` 在遍历过程中,`Node.childNodes` 属性返回一个包含当前节点所有子节点的类数组对象。通过检查 `nodeType`,可以确定当前节点的类型。例如,`Node.TEXT_NODE` 表示文本节点,而 `Node.ELEMENT_NODE` 表示元素节点。 需要注意的是,遍历 DOM 树时应避免使用 `for..in` 循环,因为 `for..in` 会遍历所有可枚举的属性,包括一些额外的属性,这可能导致意外的结果。 #### 示例代码 以下是一个完整的示例代码,展示了如何遍历 DOM 元素并统计页面中的单词数量: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>DOM 遍历与单词统计</title> </head> <body> <h1>这是一个示例标题</h1> <p>这是一个段落,包含一些文本内容。</p> <p>这是另一个段落,包含更多的文本内容。</p> <script> function countWords(text) { const words = text.match(/\b\w+\b/g); return words ? words.length : 0; } function traverseAndCountWords(node) { let totalWordCount = 0; if (node.nodeType === Node.TEXT_NODE) { totalWordCount += countWords(node.textContent); } else { for (let child of node.childNodes) { totalWordCount += traverseAndCountWords(child); } } return totalWordCount; } const wordCount = traverseAndCountWords(document.body); console.log(`页面中的单词总数为: ${wordCount}`); </script> </body> </html> ``` 此代码通过遍历 `document.body` 下的所有文本节点,统计页面中的单词数量,并在控制台输出结果。 #### 注意事项 - 在遍历 DOM 树时,应避免使用 `document.writeln` 或 `alert` 等方法,因为这些方法可能会影响页面的渲染和性能。 - 如果需要处理复杂的 DOM 操作,建议使用 `querySelector` 或 `querySelectorAll` 方法获取元素,而不是使用传统的 `getElementById` 或 `getElementsByClassName` 方法。 - 在统计单词数量时,应使用正则表达式匹配单词,以确保统计结果的准确性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值