javascript - Är det fel att placera <script>-taggen efter </body>-taggen?


Hur fel är det att placera script-taggen efter stängningstaggen för body (</body>)?

<html>
  ....
  <body>
     ....
  </body>
  <script type="text/javascript" src="theJs.js"></script>
</html>

Svar #1

Det kommer inte att validera utanför <body> eller <head> taggarna. Det kommer heller inte att göra så stor skillnad — om du inte utför DOM-manipulationer som kan krascha IE innan body-elementet är fullständigt laddat — att placera det precis före avslutande </body>.

<html>
  ....
  <body>
     ....
     <script type="text/javascript" src="theJs.js"></script>
  </body>
</html>

Svar #2

Endast kommentarer och sluttaggen för html-elementet är tillåtna efter sluttaggen för body.

Du kan bekräfta detta med specifikationen eller en validator.

Webbläsare kan utföra felåterställning, och HTML-specifikationen beskriver till och med hur man återställer i den situationen, men du bör aldrig förlita dig på det.


Det är också värt att notera att den vanliga anledningen till att placera skriptelementet i slutet är att säkerställa att de element som skriptet kan försöka komma åt via DOM existerar innan skriptet körs.

Med ankomsten av defer-attributet kan vi placera script i head och ändå få den fördelen samtidigt som JS laddas ner av webbläsaren parallellt med HTML för bättre prestanda.

Svar #3

Som Andy sa, dokumentet kommer inte att vara giltigt, men ändå kommer skriptet fortfarande att tolkas. Se utdraget från WebKit till exempel:

void HTMLParser::processCloseTag(Token* t)
{
    // Support for really broken HTML.
    // we never close the body tag, since some stupid web pages close it before
    // the actual end of the doc.
    // let's rely on the end() call to close things.
    if (t->tagName == htmlTag || t->tagName == bodyTag
                              || t->tagName == commentAtom)
        return;
    ...

Relaterade artiklar