2017-01-07 10 views
1

は、完全なエラーメッセージです後に既存の要素にnullを返します:のdocument.getElementByIdは、ここでのdocument.write

mlg.html:41 Uncaught TypeError: Cannot set property 'innerHTML' of null 
    at ml (mlg.html:41) 
    at HTMLButtonElement.onclick (mlg.html:9) 

私は怒っLIBSゲームを作っていたと私はちょうどバグを見つけるために、簡単なテストをしていたし、私はこの問題を見つけた。ここでは、コードは次のとおりです。

<!DOCTYPE html> 
<html> 

<head> 
</head> 

<body> 
    <button type="button" onclick="ml()">Mad Libs!</button> 
    <p id="display"></p> 

    <script> 
    function ml() { 
     var x = Math.floor((Math.random() * 10) + 1); 

     //mad lib 1 
     if (x == 1 || 2) { 
     document.write("test1"); 
     } 
     //mad lib 2 
     if (x == 3 || 4) { 
     document.write("test2"); 
     } 
     //mad lib 3 
     if (x == 5 || 6) { 
     document.write("test3"); 
     } 
     //mad lib 4 
     if (x == 7 || 8) { 
     document.write("test4"); 
     } 
     //mad lib 5 
     if (x == 9 || 10) { 
     document.write("test5"); 
     } 
     document.getElementById("display").innerHTML = x; 
    } 
    </script> 
</body> 
</html> 
+0

問題は、 'document.write'がページ全体の内容を上書きするため、その文に達したときに'#display'要素がないことです。また 'x == 1 || 2'は' x == 1 || x == 2 'である。 – Xufox

+0

関連:http://stackoverflow.com/q/12471249/4642212 – Xufox

答えて

1

document.writeを使用しないでください、それはbad practiceです。ページ全体をtest1などの文字列で上書きします。したがって、document.getElementById("display").innerHTML = x;に達すると、displayのIDを持つ要素は存在しなくなり、document.getElementById("display")nullと評価されます。

ifステートメントをテストする場合は、代わりにconsole.log("test1");を使用してください。 browser console(ほとんどのブラウザでF12)を開くと、そこにメッセージが表示されます。

ifといえば、they’re wrongです。 が真実であるため、if(test == 1 || 2)は常にtrueと評価されます。それはあなたが望むものではありません。あなたが欲しいのはif(test == 1 || test == 2)です。

代替:if([1, 2].includes(test)),if([1, 2].indexOf(test) >= 0)Check variable equality against a list of values)。

関連する問題