Wie falsch ist es, das Skript-Tag nach dem schließenden Tag des body ( </body>
) zu platzieren. ?
<html>
....
<body>
....
</body>
<script type="text/javascript" src="theJs.js"></script>
</html>
Wie falsch ist es, das Skript-Tag nach dem schließenden Tag des body ( </body>
) zu platzieren. ?
<html>
....
<body>
....
</body>
<script type="text/javascript" src="theJs.js"></script>
</html>
Antworten:
Es wird nicht außerhalb der Tags oder validiert . Es macht auch keinen großen Unterschied - es sei denn, Sie führen DOM-Manipulationen durch, die den IE beschädigen könnten , bevor das Body-Element vollständig geladen ist -, es kurz vor dem Schließen zu platzieren .<body>
<head>
</body>
<html>
....
<body>
....
<script type="text/javascript" src="theJs.js"></script>
</body>
</html>
<script src="..." defer>
, was in allen gängigen Browsern funktioniert (allerdings mit einem potenziell fehlerhaften Fehler in IE9 und niedriger).
Ja. Nach dem End-Tag für den Body sind nur Kommentare und das End-Tag für das HTML-Element zulässig.
Browser führen möglicherweise eine Fehlerbehebung durch, aber Sie sollten sich niemals darauf verlassen.
Wie Andy sagte, wird das Dokument nicht gültig sein, aber das Skript wird trotzdem interpretiert. Siehe das Snippet aus WebKit zum Beispiel:
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;
...
IE erlaubt dies nicht mehr (seit Version 10, glaube ich) und wird solche Skripte ignorieren. FF und Chrome tolerieren sie immer noch, aber es besteht die Möglichkeit, dass sie dies eines Tages als nicht standardmäßig fallen lassen.
Das prozedurale Einfügen von "Elementskript" nach "Elementkörper" ist "Analysefehler" gemäß dem von W3C empfohlenen Prozess . Erstellen Sie in "Tree Construction" einen Fehler und führen Sie "tokenize again" aus, um diesen Inhalt zu verarbeiten. Es ist also wie ein zusätzlicher Schritt. Nur dann kann "Script Execution" ausgeführt werden - siehe Schema-Prozess .
Alles andere "Analysefehler". Schalten Sie den "Einfügemodus" auf "in body" und verarbeiten Sie den Token erneut.
Technisch gesehen ist es per Browser ein interner Prozess, wie sie ihn markieren und optimieren.
Ich hoffe ich habe jemandem geholfen.
Ja. Aber wenn Sie den Code außerhalb hinzufügen, ist dies höchstwahrscheinlich nicht das Ende der Welt, da die meisten Browser ihn beheben werden, aber es ist immer noch eine schlechte Praxis, sich darauf einzulassen.
Google empfiehlt dies tatsächlich im Hinblick auf die "CSS-Optimierung". Sie empfehlen, kritische Stile über dem Falz einzulegen und den Rest (CSS-Datei) aufzuschieben.
Beispiel:
<html>
<head>
<style>
.blue{color:blue;}
</style>
</head>
<body>
<div class="blue">
Hello, world!
</div>
</body>
</html>
<noscript><link rel="stylesheet" href="small.css"></noscript>
Siehe: https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery
body
Elements platzieren. Dieser Google-Artikel rät niemandem, so etwas zu tun.
Moderne Browser nehmen Skript-Tags wie folgt in den Text auf:
<body>
<script src="scripts/main.js"></script>
</body>
Grundsätzlich bedeutet dies, dass das Skript geladen wird, sobald die Seite fertig ist, was in bestimmten Fällen nützlich sein kann (nämlich DOM-Manipulation). Ich empfehle jedoch dringend, dass Sie dasselbe Skript verwenden und es mit "defer" in das Head-Tag einfügen, da es den gleichen Effekt erzielt.
<head>
<script src="scripts/main.js" defer></script>
</head>
script
Tags ein event
Attribut hätten, das definiert werden könnte, um zu bestimmen, wann das Skript analysiert werden soll. Sie müssen also event="load" event="DOMContentLoaded"
das Skript ausführen, nachdem das DOM erstellt wurde oder event="beforeunload"
auf dem Fensterereignis beforeunload
. Beispiel , <script src="scripts/main.js" event="DOMContentLoaded"></script>
.