2016-11-22 8 views
0

Uncaught Typeerror: kann Eigenschaft lesen 'lastchild' von null

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
\t <title>Face Matching Game</title> 
 
\t <h2>Matching Game</h2> 
 
\t <p>Click on the EXTRA face on the left side</p> 
 
\t <style type="text/css"> 
 
\t \t div { position: absolute; width: 640px; height: 550px; background-color: maroon } 
 
\t \t img { position: absolute; width: 100px; height: 100px} 
 
\t \t #rightSide { left: 650px; border-left: 2px solid black; } 
 
\t </style> 
 
\t <script type="text/javascript"> 
 
\t \t var NUM_OF_FACES = 0; 
 
\t \t var THE_LEFT_SIDE, THE_RIGHT_SIDE; 
 
\t \t //Function to generate faces 
 
\t \t function generateFaces() { 
 
\t \t \t THE_LEFT_SIDE = document.getElementById("leftSide"); 
 
\t \t \t THE_RIGHT_SIDE = document.getElementById("rightSide"); 
 
\t \t \t NUM_OF_FACES += 5; 
 
\t \t \t var image; 
 
\t \t \t while(NUM_OF_FACES>0){ 
 
\t \t \t \t image = document.createElement("img"); 
 
\t \t \t \t image.src = "smile.png"; 
 
\t \t \t \t image.style.top = Math.floor(Math.random()* (THE_LEFT_SIDE.offsetHeight - 100)) + "px"; 
 
\t \t \t \t image.style.left = Math.floor(Math.random()* (THE_LEFT_SIDE.offsetWidth - 100)) + "px"; 
 
\t \t \t \t THE_LEFT_SIDE.appendChild(image); 
 
\t \t \t \t NUM_OF_FACES -= 1; 
 
\t \t \t \t //console.log(image.style.top, image.style.left) 
 
\t \t \t } 
 
\t \t \t var leftSideImages = THE_LEFT_SIDE.cloneNode(true); 
 
\t \t \t leftSideImages.removeChild(leftSideImages.lastChild); 
 
\t \t \t THE_RIGHT_SIDE.appendChild(leftSideImages); 
 
\t \t }//end generatefaces() 
 

 
\t \t function deleteFaces(argument) { 
 
\t \t \t while(THE_LEFT_SIDE.firstChild){ 
 
\t \t \t \t THE_LEFT_SIDE.removeChild(THE_LEFT_SIDE.firstChild); 
 
\t \t \t } 
 
\t \t \t while(THE_RIGHT_SIDE.firstChild){ 
 
\t \t \t \t THE_RIGHT_SIDE.removeChild(THE_RIGHT_SIDE.firstChild); 
 
\t \t \t } 
 
\t \t }//end deleteFaces() 
 

 
\t \t var theBody = document.getElementsByTagName("body")[0]; 
 
\t \t THE_LEFT_SIDE = document.getElementById("leftSide"); 
 
\t \t THE_RIGHT_SIDE = document.getElementById("rightSide"); 
 
\t \t //Event handling 
 
\t \t THE_LEFT_SIDE.lastChild.onclick = function goToNextLevel() { 
 
\t \t \t alert("You clicked on correct face."); 
 
\t \t \t deleteFaces(); 
 
\t \t \t generatefaces(); 
 
\t \t }; 
 
\t \t theBody.onclick = function gameOver() { 
 
\t \t \t alert("Game Over!!"); 
 
\t \t \t theBody.onclick = null; 
 
\t \t \t THE_LEFT_SIDE.lastChild.onclick = null; 
 
\t \t }; 
 
\t </script> 
 
</head> 
 
<body onload="generateFaces()"> 
 
\t <div id="leftSide"></div> 
 
\t <div id="rightSide"></div> 
 
</body> 
 
</html>

ich Anfänger bin in Javascript und lief in ein Problem, während eine Zuordnung zu tun. Es ist Fact Matching Spiel und Sie müssen auf das zusätzliche Gesicht auf der linken Seite klicken und das Spiel geht weiter, bis Sie irgendwo anders als extra Gesicht auf der linken Seite klicken. Oben ist die HTML-Datei und der JS-Code eingebettet.

Ich erhalte eine Fehlermeldung wie: Uncaught TypeError: Cannot read property 'lastChild' of null bei der Zeilennummer 48, die auf lastChild von THE_LEFT_SIDE div onclick Event-Handler-Funktion ist. Ich weiß nicht, wie es kommt und was ist das Problem mit meinem Code? Alle Leads werden geschätzt.

+1

Sieht aus wie 'THE_LEFT_SIDE 'ist zu dem Zeitpunkt null, zu dem Sie versuchen, einen Listener hinzuzufügen. Versuchen Sie, die Listener-Additionen in eine Funktion einzufügen, die nach 'generateFaces()' ausgeführt wird. – Todd

+1

Das 'THE_LEFT_SIDE' ist leer, bis die 'generateFaces'-Funktion bei' onload' von 'body' aufgerufen wird. Setzen Sie den 'event handlers' Code in' 'in der letzten oder innerhalb der' generateFaces' Funktion. –

Antwort

2

Sie versuchen, auf das Element mit der ID leftSide zuzugreifen, bevor es zum DOM hinzugefügt wurde.

Wenn Sie Ihr Skript an das Ende der Seite Körper bewegen, werden Sie sehen nicht mehr um diesen Fehler, aber eine andere, nicht verwandte man stattdessen:

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
\t <title>Face Matching Game</title> 
 
\t <h2>Matching Game</h2> 
 
\t <p>Click on the EXTRA face on the left side</p> 
 
\t <style type="text/css"> 
 
\t \t div { position: absolute; width: 640px; height: 550px; background-color: maroon } 
 
\t \t img { position: absolute; width: 100px; height: 100px} 
 
\t \t #rightSide { left: 650px; border-left: 2px solid black; } 
 
\t </style> 
 
    
 
</head> 
 
<body onload="generateFaces()"> 
 
\t <div id="leftSide"></div> 
 
\t <div id="rightSide"></div> 
 

 
    \t  <script type="text/javascript"> 
 
\t \t var NUM_OF_FACES = 0; 
 
\t \t var THE_LEFT_SIDE, THE_RIGHT_SIDE; 
 
\t \t //Function to generate faces 
 
\t \t function generateFaces() { 
 
\t \t \t THE_LEFT_SIDE = document.getElementById("leftSide"); 
 
\t \t \t THE_RIGHT_SIDE = document.getElementById("rightSide"); 
 
\t \t \t NUM_OF_FACES += 5; 
 
\t \t \t var image; 
 
\t \t \t while(NUM_OF_FACES>0){ 
 
\t \t \t \t image = document.createElement("img"); 
 
\t \t \t \t image.src = "smile.png"; 
 
\t \t \t \t image.style.top = Math.floor(Math.random()* (THE_LEFT_SIDE.offsetHeight - 100)) + "px"; 
 
\t \t \t \t image.style.left = Math.floor(Math.random()* (THE_LEFT_SIDE.offsetWidth - 100)) + "px"; 
 
\t \t \t \t THE_LEFT_SIDE.appendChild(image); 
 
\t \t \t \t NUM_OF_FACES -= 1; 
 
\t \t \t \t //console.log(image.style.top, image.style.left) 
 
\t \t \t } 
 
\t \t \t var leftSideImages = THE_LEFT_SIDE.cloneNode(true); 
 
\t \t \t leftSideImages.removeChild(leftSideImages.lastChild); 
 
\t \t \t THE_RIGHT_SIDE.appendChild(leftSideImages); 
 
\t \t }//end generatefaces() 
 

 
\t \t function deleteFaces(argument) { 
 
\t \t \t while(THE_LEFT_SIDE.firstChild){ 
 
\t \t \t \t THE_LEFT_SIDE.removeChild(THE_LEFT_SIDE.firstChild); 
 
\t \t \t } 
 
\t \t \t while(THE_RIGHT_SIDE.firstChild){ 
 
\t \t \t \t THE_RIGHT_SIDE.removeChild(THE_RIGHT_SIDE.firstChild); 
 
\t \t \t } 
 
\t \t }//end deleteFaces() 
 

 
\t \t var theBody = document.getElementsByTagName("body")[0]; 
 
\t \t THE_LEFT_SIDE = document.getElementById("leftSide"); 
 
\t \t THE_RIGHT_SIDE = document.getElementById("rightSide"); 
 
\t \t //Event handling 
 
\t \t THE_LEFT_SIDE.lastChild.onclick = function goToNextLevel() { 
 
\t \t \t alert("You clicked on correct face."); 
 
\t \t \t deleteFaces(); 
 
\t \t \t generatefaces(); 
 
\t \t }; 
 
\t \t theBody.onclick = function gameOver() { 
 
\t \t \t alert("Game Over!!"); 
 
\t \t \t theBody.onclick = null; 
 
\t \t \t THE_LEFT_SIDE.lastChild.onclick = null; 
 
\t \t }; 
 
\t </script> 
 
</body> 
 
</html>

+0

Ja. Warum das? – vvs14

+0

Ihr Code wird sequentiell ausgeführt. Wenn der Browser das JavaScript vor den HTML-Elementen findet, wird das JavaScript ausgeführt, bevor die HTML-Elemente gerendert werden. Verschieben Sie Ihren Code in den onload-Event-Handler des Körpers, um das zu vermeiden - dies wird ausgeführt, nachdem der gesamte Körper gerendert wurde. – Timo

+0

Ich habe diesen Event-Handler THE_LEFT_SIDE.lastChild.onclick in inside generateFaces() eingefügt und es funktioniert gut. Welchen Unterschied hat es gemacht und wie unterscheidet es sich vom vorherigen? – vvs14

Verwandte Themen