javascript - 组合 getElementsByTagName 和 getElementsByClassName

标签 javascript html

我尝试结合 getElementsByTagName 和 getElementsByClassName 来缩小搜索范围并计算结果节点的数量,但第二次搜索的结果总是长度为 0,我不知道为什么。

<!DOCTYPE html>
<html>
	<head></head>
	<body>
		<p>Stuff</p>
		<p class="content">Stuff2</p>
		<p>Stuff</p>
		<p class="content">Stuff2</p>
		<script type="text/javascript">
			pElements = document.getElementsByTagName("p");
			console.log(pElements);
			for(i = 0; i < pElements.length; i++) {
				console.log(pElements[i].getElementsByClassName("content").length);
			}
			//console.log(document.querySelectorAll('p.content').length);
		</script>
	</body>
</html>

我知道我可以使用 querySelectorAll 来实现此目的,就像我注释掉的行一样,但我想了解为什么第一个解决方案不起作用,以及我可以采取哪些措施来修复它。

谢谢!

最佳答案

第一个示例的问题在于:

pElements[i].getElementsByClassName("content")

搜索 p 元素的子元素。但由于它实际上位于同一个元素上,因此找不到它们。

W3C reference : “getElementsByClassName() 方法返回具有指定类名的元素的子元素的集合”

编辑:要查找 p 元素是否具有内容类,您可以使用

而不是 getElementsByClassName()
pElements[i].classList.contains("content")

如果元素具有该类,则返回 true。 Reference

EDIT2:一种更向后兼容的方法是获取 className 属性,将其拆分为空格并迭代数组以查看该类是否存在。

var names = pElements[i].className.split(" ");
var found = false;
for(var i = 0; i < names.length; i++){
  if(names[i] === "content"){
    found = true;
    break;
  }
}
if(found){
 //Your code here
}

关于javascript - 组合 getElementsByTagName 和 getElementsByClassName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29254398/

相关文章:

Javascript Fetch 没有得到响应

javascript - 为什么在 Canvas 中创建的行为不遵循规定的宽度和高度?

javascript - 如何使用 JavaScript 检查 "Group"中的特定单选框

html - 选择 ul li child 而不是孙子

javascript - 如何向数组中的对象添加一个值,该值是另一个对象中键的值?

javascript - 如何使用不和谐机器人返回变量

javascript - ExtJS--在展开/折叠时调整面板高度

html - 我正在从 Bootstrap 应用模态,但它没有正确关闭

javascript - 鼠标离开时在 anchor 标签上反向悬停

javascript - 在 AJAX 调用中返回上一页