这是一本关于Eloquent JavaScript'中的一个例子的修改版本。需要理解为什么它总是返回" true1"。我的想法是在DOM中找到某个文本,但不知何故,即使我提供了一个html中不存在的文本仍然得到" true1"在控制台上。
请帮助
我的HTML文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title> My first JS page</title>
<script src="script1.js"></script>
</head>
<body>
<h1>My first page</h1>
<p> Hello , I am Mehdi and this is my first page</p>
<p> And this is the second paragraph on this page and</p>
</body>
<script>console.log(talksAbout(document.body, "Tester123"));</script>
</html>
我的Javascript文件
function talksAbout(node, string){
if(node.nodeType == document.ELEMENT_NODE){
for(var i=0; i<node.childNodes.length; i++){
if(talksAbout(node.childNodes[i], string))
return "true1";
}
return "false1";
}else if(node.nodeType == document.TEXT_NODE){
return node.nodeValue.indexOf(string) > -1;
}
}
答案 0 :(得分:9)
您的函数使用talksAbout()
函数的返回值,就好像它是一个布尔值。但是,该函数可能会返回一个布尔或,它可能会返回这两个字符串值"true1"
或"false1"
中的一个。当在布尔上下文中使用时,这两个看起来都是true
,就像递归调用周围的if
语句一样。
答案 1 :(得分:3)
Pointy的回答描述了两个关键问题之一。另一个是你的搜索字符串实际上在文档中!
您将脚本标记与搜索字符串一起包含在文档中。它将被检查以及你走DOM,所以即使你修复了布尔值,只要你在文档中有这样的行,你仍然会返回true
:
<script>console.log(talksAbout(document.body, "Tester123"));</script>
^^^^^^^^^
您可以简单地从Web开发人员那里运行测试。控制台看到这种运行没有这样的问题。