2015-04-14 96 views
1

這是「Eloquent JavaScript」一書中示例的一個修改版本。需要了解爲什麼它總是返回「true1」。這個想法是在DOM中找到某個文本,但即使我給出了HTML中不存在的文本,仍然會在控制檯上獲得「true1」。爲什麼此函數總是返回「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

你用瀏覽器工具調試過代碼嗎? –

+3

''true1'''''''''(字符串)都是'true'(boolean),所以不管'塊。 –

回答

9

你的函數使用talksAbout()函數的返回值就好像它是一個布爾值。但是,函數可能會返回布爾型,它可能會返回這兩個字符串值之一,即"true1""false1"。在遞歸調用周圍的語句中使用類似if語句的布爾上下文中時,這兩者似乎都是true

+0

這是正確的,但請注意,在我的答案中還有另一個問題。 –

3

Pointy的回答描述了兩個關鍵問題之一。另一個是你的搜索字符串實際上在文檔中!

您將包含搜索字符串的腳本標記包含爲文檔的一部分。它會得到遏制,以及你走的DOM,你修復布爾值,所以即使以後,你仍然會在文檔中返回true只要你有線路是這樣的:

<script>console.log(talksAbout(document.body, "Tester123"));</script> 
               ^^^^^^^^^ 

你可以簡單地運行來自Web開發者控制檯的測試看到這個運行沒有這樣的問題。

+0

是的,我同意,字符串在文檔中! – Pointy

相關問題