2016-04-21 96 views
0

我試圖從一開始就瞭解JavaScript。爲什麼我的瀏覽器在body標籤內強制使用script標籤?

我在這裏要做的是輸出在<body>標記中找到的每個元素的nodeTypes。據我所知,還有的<body>的子元素之間無形的文本一些未知的原因,這使得輸出

3 1 3 1 

我把<script>標籤<body>標籤之外,但它仍然在for循環計數,導致3 1 3 1循環序列中的1的最後一位數字。爲什麼?爲什麼<script>標籤被瀏覽器強制在<body>標籤內?

<html> 
    <body id = "bodyTest"> 
     <p>Some Text</p> 
    </body> 

    <script type="text/javascript"> 
     var c = document.body.childNodes; 

     var txt = ""; 
     for(var k = 0; k < c.length; k++) { 
      txt += c[k].nodeType + " "; 
      console.log(txt); 
      console.log(c[k].nodeName); 
     } 
     alert(txt); 
    </script> 
</html> 

這是我使用的代碼。

<html> 
    <body id = "bodyTest"> 
     <p>Some Text</p> 
    </body> 

    <script type="text/javascript"> 
     // Code above 
    </script> 
</html> 

回答

7

這不是有效的HTML。 <html>標籤只能包含<head><body>標籤,而不是<script>

the specification

允許的內容
一個頭元素,其次是一個body元素

當你的瀏覽器遇到損壞的HTML,它試圖解決它。在這種情況下,這意味着將您的<script>標籤視爲在<body>中。

+0

謝謝!所以一個html標籤只能包含這些元素(body和head)。任何其他標籤應該在這些元素內?這是一些很好的信息。我一直在編寫錯誤的方法太久了,這就是爲什麼我要學習最微小的一點。再次感謝。 – Wax

+0

@Carnal這是正確的。樂意效勞! –

0

您的瀏覽器正在通過將<script>放置在<html>元素<body>內有效的最接近的元素中來糾正您形成不良的HTML。

1

html規範對根html元素可以包含哪些元素有一些限制。腳本不是其中之一,所以你給我們展示的這些確實是無效的。不過,瀏覽器將盡最大努力繼續處理大部分源代碼。例如,您可以擁有一個沒有html,head和body的html文件,並且瀏覽器仍然會通過將輸入封裝在body和html標記中來顯示頁面。

關於隱形節點:它們是具有單個空間的文本節點。根據規範,任何空格序列都應該被視爲一個空格,並且元素(空格,換行符)之間的空格仍然被視爲文本。試試這個,看看會發生什麼:

<html> 
 
    <body id="bodyTest"> 
 
    <p>Some Text</p><script type="text/javascript"> 
 
     var c = document.body.childNodes; 
 

 
     var txt = ""; 
 
     for(var k = 0; k < c.length; k++) { 
 
      txt += c[k].nodeType + " "; 
 
      console.log(txt); 
 
      console.log(c[k].nodeName); 
 
     } 
 
     alert(txt); 
 
    </script> 
 
    </body> 
 
</html>