154 votes

Pourquoi document.body est-il nul dans mon javascript?

Voici mon bref document HTML. Pourquoi la console Chrome note-t-elle cette erreur: "Uncaught TypeError: impossible d'appeler la méthode 'appendChild' of 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>
 

205voto

Sergio Tulentsev Points 82783

Le corps n'est pas défini à ce point encore. En général, vous voulez créer tous les éléments avant d'exécuter le code javascript qui utilise ces éléments. Dans ce cas, vous avez un peu de javascript dans l' head section qui utilise body. Pas cool.

Vous souhaitez envelopper ce code dans un window.onload gestionnaire ou le placer après l' <body> balise (comme mentionné par e-bacho 2.0).

<head>
    <title>Javascript Tests</title>

    <script type="text/javascript">
      window.onload = function() {
        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>

Voir la démo.

8voto

Martin Hansen Points 1406

Ajouter votre code à l'événement onload. La accepté de réponse montre bien, cependant, que la réponse ainsi que tous les autres au moment de l'écriture suggère de mettre la balise de script après la balise body de clôture, .

Ce n'est pas valide html. Toutefois, il sera la cause de votre code de travail, parce que les navigateurs sont trop gentil ;)

Voir cette réponse pour plus d'info Est-il tort de mettre la balise <script> après la balise </body>?

Downvoted d'autres réponses pour cette raison.

4voto

e-bacho 2.0 Points 432

Ou ajouter cette partie

 <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>
 

après le HTML, comme:

     <html>
    <head>...</head>
    <body>...</body>
   <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>

    </html>
 

1voto

Emmanuel N Points 4090

Le navigateur analyse votre code HTML de haut en bas, votre script s'exécute avant que le corps ne soit chargé. Pour corriger le script après le corps.

   <html>
  <head>
       <title> Javascript Tests </title> 
  </head>
 <body>
 </body>
  <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>
</html>
 

0voto

Christophe Points 7878

document.body n'est pas encore disponible lorsque votre code est exécuté.

Que pouvez-vous faire à la place:

 var docBody=document.getElementsByTagName("body")[0];
docBody.appendChild(mySpan);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X