Javascript 尝试查找所有HTML注释时出现太多递归错误
下面的脚本用于查找页面中的所有html注释(共4条),并将它们作为一个字符串返回。我运行了下面的脚本,收到了一个“太多递归”错误 我是创建了一个无限循环还是做了其他事情Javascript 尝试查找所有HTML注释时出现太多递归错误,javascript,html,Javascript,Html,下面的脚本用于查找页面中的所有html注释(共4条),并将它们作为一个字符串返回。我运行了下面的脚本,收到了一个“太多递归”错误 我是创建了一个无限循环还是做了其他事情 function findComment() { var olElement = document.getElementById("everything");//this is the id for my body element var comments = new Array();
function findComment()
{
var olElement = document.getElementById("everything");//this is the id for my body element
var comments = new Array();
if (olElement.nodeType == 8)
{
comments[comments.length] = olElement;
} else if(olElement.childNodes.length>0)
{
for (var i = 0; i<olElement.childNodes.length; i++)
{
comments = comments.concat(findComment(olElement.childNodes[i]));
}
}
alert(comments);
}
//window.onload = countListItems;
//window.onload = countTagItems;
//window.onload = getElements;
window.onload = findComment;
函数findComment()
{
var olElement=document.getElementById(“一切”);//这是我的body元素的id
var comments=新数组();
if(olElement.nodeType==8)
{
注释[comments.length]=olElement;
}else if(olement.childNodes.length>0)
{
对于(var i=0;i将olements变量移到函数外部,并传入要搜索的元素
var comments = new Array();
function findComment(element)
{
if (element.nodeType == 8)
{
comments[comments.length] = element;
} else if(element.childNodes.length>0)
{
for (var i = 0; i<element.childNodes.length; i++)
{
comments = comments.concat(findComment(element.childNodes[i]));
}
}
return comments;
}
var olElement = document.getElementById("everything");//this is the id for my body element
alert(findComment(olElement));
var comments=new Array();
函数findComment(元素)
{
if(element.nodeType==8)
{
注释[comments.length]=元素;
}else if(element.childNodes.length>0)
{
对于(var i=0;i这是一个粗略的版本,说明了如何使用递归来实现它。它不是很优雅,但可以完成以下工作:
功能fico(el){
if(el.nodeType==8)返回[el.textContent.trim()]
else返回[…el.childNodes].map(fico);
}
console.log(fico(document.querySelector(“一切”)).toString().replace(/,+/g,,”);
某物
里面有东西
还有更进一步的事情
在…内
信息技术
更规则的文本
够了。
更新:我尝试了上述两种方法,但收到的错误是“element”或“el”为空。因此…进展顺利。我将完整的代码和html放在一起,发布如下:
<!DOCTYPE html>
<html>
<head>
<title>A Simple Page</title>
<script>
var comments = new Array();
function findComment(element)
{
if (element.nodeType == 8)
{
comments[comments.length] = element;
} else if(element.childNodes.length>0)
{
for (var i = 0; i<element.childNodes.length; i++)
{
comments = comments.concat(findComment(element.childNodes[i]));
}
}
return comments;
}
//window.onload = countListItems;
//window.onload = countTagItems;
//window.onload = getElements;
var olElement = document.getElementById("everything");//this is the id for my body element
window.onload = alert(findComment(olElement));
</script>
</head>
<body>
<div id="everything">
<h1>Things to Do</h1><!--this is a title-->
<ol id="toDoList"><!--this is a list-->
<li>Mow the lawn</li><!--this is a list item-->
<li>Clean the windows</li>
<li>Answer your email</li>
</ol>
<p id="toDoNotes">Make sure all these things are done so you can get some rest.</p>
</div>
</body>
</html>
简单的一页
var comments=新数组();
函数findComment(元素)
{
if(element.nodeType==8)
{
注释[comments.length]=元素;
}else if(element.childNodes.length>0)
{
对于(var i=0;i
如果findComment
不返回任何内容,并且没有任何参数,那么这将不起作用:comments.concat(findComment(oleelement.childNodes[i]))
。它将计算为comments.concat(未定义)
。您的代码具有硬编码的ID,而不是使用传入的参数。您的代码始终查找相同的ID,然后查找其子项。无限次每次从for循环调用findComment
方法时,您都会从everything
节点开始搜索。函数应该具有从childnodes您似乎仍然忘记了在findComments()
函数中返回注释。