html - Skapa knapp-element i JavaScript


Jag försöker skapa ett knappelement i javascript utan att använda jQuery.

Jag får hela tiden ett felmeddelande när jag försöker lägga till det i DOM:en.

Kan inte läsa egenskapen 'appendChild' av null

Jag har letat överallt och kunde inte ta reda på hur man skapar en knapp. I w3Schools-exemplet använder de en funktion på ett knapp-element som redan skapats i HTML, vilket inte är vad jag försöker göra. Här är vad jag har.

HTML:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
meta charset="UTF-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1.0"> 
<meta http-equiv="X-UA-Compatible" content="ie=edge"> 
<title>Document</title> 
<script src="myapp.js"></script> 
</head> 
<body> 
<div id="btn">Button Here</div> 
</body> 
</html>

myapp.js

var element = document.createElement("button");
element.appendChild(document.createTextNode("Click Me!"));
var page = document.getElementById("btn");
page.appendChild(element);
console.log(element);

Svar #1

Ditt skript körs innan DOM har hunnit laddas klart, alltså innan din 'btn'-div existerar. Det finns några enkla lösningar på detta. En är att flytta din script-tagg till slutet av body, t.ex.:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="UTF-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1.0"> 
<meta http-equiv="X-UA-Compatible" content="ie=edge"> 
<title>Document</title> 
</head> 
<body> 
<div id="btn">Button Here</div> 
<script src="myapp.js"></script> 
</body> 
</html>

Den andra, bättre, lösningen är att lägga till en rad i ditt skript för att säkerställa att HTML har laddats innan skriptet körs.

document.addEventListener("DOMContentLoaded", function() {
     var element = document.createElement("button");
     element.appendChild(document.createTextNode("Click Me!"));
     var page = document.getElementById("btn");
     page.appendChild(element);
     console.log(element);
 });

 // Corrected "meta charset="UTF-8"".

Svar #2

Det är troligt att page är objektet som är odefinierat. Här är ett exempel i en fiddle som fungerar:

https://jsfiddle.net/2Lon63uj/