Voici mon bref document HTML.
Pourquoi la console Chrome note-t-elle cette erreur:
"Uncaught TypeError: Impossible d'appeler la méthode 'appendChild' de
null
"?
<html>
<head>
<title>Javascript Tests</title>
<script type="text/javascript">
var mySpan = document.createElement("span");
mySpan.innerHTML = "This is my span!";
mySpan.style.color = "red";
document.body.appendChild(mySpan);
alert("Why does the span change after this alert? Not before?");
</script>
</head>
<body>
</body>
</html>
javascript
google-chrome
John Hoffman
la source
la source
Réponses:
Le corps n'a pas encore été défini à ce stade. En général, vous souhaitez créer tous les éléments avant d'exécuter du javascript qui utilise ces éléments. Dans ce cas, vous avez du javascript dans la
head
section qui utilisebody
. Pas cool.Vous voulez envelopper ce code dans un
window.onload
gestionnaire ou le placer après la<body>
balise (comme mentionné par e-bacho 2.0 ).Voir la démo .
la source
head
section en cours d'exécution. Mais unebody
partie du HTML n'a peut-être même pas encore été téléchargée. Ou il est téléchargé, mais il n'est toujours pas évalué à ce stade. Donc ça n'existe pas dans le DOM.<body>
tag"Votre script est exécuté avant même que l'
body
élément ne soit chargé.Il existe plusieurs façons de contourner ce problème.
Enveloppez votre code dans un rappel de chargement DOM:
Enveloppez votre logique dans un écouteur d'événements pour
DOMContentLoaded
.Ce faisant, le rappel sera exécuté lorsque l'
body
élément sera chargé.En fonction de vos besoins, vous pouvez également attacher un
load
écouteur d'événements à l'window
objet:Pour connaître la différence entre les événements
DOMContentLoaded
etload
, consultez cette question .Déplacez la position de votre
<script>
élément et chargez JavaScript en dernier:En ce moment, votre
<script>
élément est en cours de chargement dans l'<head>
élément de votre document. Cela signifie qu'il sera exécuté avant lebody
chargement de. Les développeurs Google recommandent de déplacer les<script>
balises à la fin de votre page afin que tout le contenu HTML soit rendu avant le traitement du JavaScript.la source
Ajoutez votre code à l'événement onload. La réponse acceptée le montre correctement, mais cette réponse ainsi que toutes les autres au moment de la rédaction suggèrent également de placer la balise script après la balise body de fermeture,.
Ce n'est pas du HTML valide. Cependant, cela fera fonctionner votre code, car les navigateurs sont trop gentils;)
Voir cette réponse pour plus d'informations. Est-il incorrect de placer la balise <script> après la balise </body>?
Pour cette raison, les autres réponses ont été rejetées.
la source
Ou ajoutez cette partie
après le HTML, comme:
la source
Le navigateur analyse votre html de haut en bas, votre script s'exécute avant le chargement du corps. Pour corriger, mettez le script après le corps.
la source
document.body
n'est pas encore disponible lorsque votre code s'exécute.Ce que vous pouvez faire à la place:
la source