我正在尝试编写一个纯javascript函数,该函数将从页面中获取一个元素(通常是一个&lt; div&gt;),然后从那里找出它是否具有任何特定的子元素。这基本上是表示文字内容的任何标记,因此:<p>
或任何标题标记(<h1>
.. <h6>
)或列表等。
我不打算操纵这些元素只是检查它们的存在。
因此该函数采用
形式/**
* Takes an element and returns whether
* the element contains content
* @return boolean (true/false)
*/
var isContent = function (elementToCheck) {
};
我目前正在使用document.getElementsByTagName('div')
来获取网页的所有<div>
元素。然后我将一次解析这些函数。
我现在已经把它弄下来了
var isContent = function (elementToCheck) {
if (elementToCheck.hasChildNodes()) {
var children = elementToCheck.childNodes;
for (var i = 0; i < children.length; i++) {
// handle children[i]
}
}
}
我一直在尝试使用chilren[i].nodeValue
并测试各种事物的相等性,但我无法通过它们。
最好的方法是什么?我认为它正在变成一个混乱的函数,因为我必须得到所有元素以外的东西,循环它们并在这里解析它们然后执行另一个循环。我开始怀疑是否可以使用正则表达式来实现它?
答案 0 :(得分:1)
如果你想要的是找到至少有一个子节点具有非空内容模型的所有<div>
元素,那么这样的东西在所有浏览器中都可以回到(包括)IE8:< / p>
function findDivWithContents() {
var allDivs = document.getElementsByTagName('div');
var di, divs = [];
for (di = 0; di < allDivs.length; ++di) {
if (allDivs[di].querySelectorAll('p, span, h1, h2, h3, h4, ... ').length > 0)
divs.push(allDivs[di]);
return divs;
}
使用.querySelectorAll()
查找容器元素。 (你必须完成课程清单。)
编辑或者,您可以向后执行:迭代您感兴趣的所有容器类型元素,并检查其父级是否为<div>
:
function findTheDivs() {
var containers = document.querySelectorAll('p, span, div, h1, h2, h3, ... ');
var i, divs = [];
for (i = 0; i < containers.length; ++i) {
if (containers[i].parentNode.tagName === 'DIV')
divs.push(containers[i].parentNode);
return divs;
}
我认为这可能更有效率。 (可能需要为每个<div>
添加一个无意义的“类”标记,以避免多次将其添加到列表中。)
答案 1 :(得分:0)
虽然Pointy已经提到了一个名为querySelectorAll()
的新功能,但可能会让你删除containsTextElements
循环。
var textTags = ["h1", "h2", "h3", "h4", "h5", "h6", "p"];
var containsTextElements = function(elementToCheck) {
for (var i = 0; i < textTags.length; i++) {
if(elementToCheck.getElementsByTagName(textTags[i]).length > 0)
return true;
}
return false;
}
var doStuffToDivsWithText = function(callback) {
var divs = document.getElementsByTagName("div");
for(var i = 0; i < divs.length; i++ ) {
if(containsTextElements(divs[i]))
callback(divs[i]);
};
}
doStuffToDivsWithText(function(div) {
console.log(div.id);
});
答案 2 :(得分:0)
这样你不需要jQuery,不需要(但可以)指定你想要文本内容的标签,并且可以将正则表达式应用于找到的文本。
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
function logTextContent(elem) {
var childNodes = elem.childNodes;
for(var i=0; i<childNodes.length; i++) {
var nodex = childNodes[i];
if(nodex.nodeType == 3 /* text node */) {
var textContent = nodex.nodeValue;
if(textContent.match(/\S+/) /* apply regex */) {
console.log("found text: "+textContent);
}
}
else if (nodex.nodeType == 1 /* element node*/) {
logTextContent(nodex)
}
}
}
function findDocumentTexts() {
var docElems = document.getElementsByTagName("body");
for(var i=0; i<docElems.length; i++) {
var elem = docElems[i];
logTextContent(elem);
}
}
</script>
</head>
<body>
<button onclick="findDocumentTexts()">find document texts</button>
<!-- I will fail -->
<div>
<!-- I will pass -->
<div>
<h1>Heading</h1>
<p>
I should be found straight away
</p>
</div>
<!-- I will fail -->
<div>
<!-- I will pass -->
<div>
<p>
I will be missed by the first div but found by the second
</p>
</div>
</div>
</div>
</body>
</html>