2016-10-22 19 views
1

JavaScriptを使用して推測ゲームを作成しました。当初、私はそれがうまく走ったcodepenで書いていました。ブラウザでスタンドアローンとしてテストするために崇高に動かすと、コードは機能しませんでした。私はこのエラーが発生しています: "Uncaught TypeError:推測でnullのプロパティ '値'を読み取ることができません"行14 var guessValue = parseInt(guessIn.value);推測である20行目のHTMLにリンクします。単純な推測ゲームの関数でnullを返すJavaScript

nullがどこから来ているのか分かりません。何が間違っているのか、それともヌルを引き起こしているのか正しく定義していないのですか?私はそれを空白のスレートにCSSを削除し、それが何かをねじ込んでいないことを確認します。

//Generate random number between 1 and 500 
 

 
var randomNumber = Math.floor((Math.random() * 500) + 1); 
 

 
//Create variables to store info for loops and displaying info back to user 
 
var guessIn = document.getElementById('userGuess'); 
 
var guessOut = document.getElementById('guessesMade'); 
 
var counter = 0; 
 

 
//function runs when the guess button is hit 
 

 
function guess() { 
 
    //declare temp local var and store as an integer for conditional testing 
 
    var guessValue = parseInt(guessIn.value); 
 
    
 
    //if statement for finding the value and reporting to the user 
 
    //check if the counter is less than 10 and guessValue is not empty 
 
    if (counter < 10 && guessValue) { 
 
     counter++; 
 
    } 
 
    //the guess is correct 
 
    if (guessValue == randomNumber) { 
 
     guessOut.value = guessOut.value + '\n' + "Guess " + counter + " is " + guessIn.value + ':' + ' You have correctly guessed the number. You may escape.'; 
 
    } 
 
    // the guess is greater 
 
    if (guessValue > randomNumber) { 
 
     guessOut.value = guessOut.value + '\n' +"Guess " + counter + " is " + guessIn.value + ':' + ' Your guess is incorrect. The number I am thinking of is lower.'; 
 
    } 
 
    //the guess is lower 
 
    if (guessValue < randomNumber) { 
 
     guessOut.value = guessOut.value + '\n' + "Guess " + counter + " is " + guessIn.value + ':' + ' Your guess is incorrect. The number I am thinking of is higher.'; 
 
    } 
 
    //when all 10 guesses are used 
 
    else if (counter == 10) { 
 
    guessOut.value = guessOut.value + '\n' + "You did not guess the number I was thinking, " + randomNumber + "." + " You have met your end. Goodbye."; 
 
    } 
 
    return false; 
 
} 
 

 
//Show the number to guess upon clicking the checkbox for Cheat 
 
function cheat() { 
 
    if (document.getElementById('cheat').checked) { document.getElementById('cheatNumber').value = randomNumber; 
 
    document.getElementById('cheatShow').style.display = 'inline'; 
 
    } 
 
    else { document.getElementById('cheatNumber').value = ''; 
 
document.getElementById('cheatShow').style.display = 'none'; 
 
    } 
 
} 
 

 
//function to reset the game 
 
function reset() { 
 
    //reset guess value 
 
    userGuess.value = ""; 
 
//reset text area 
 
    guessesMade.value = ""; 
 
    //reset counter 
 
    counter = 0; 
 
    //set new random number for play 
 
    randomNumber = Math.floor((Math.random() * 500) + 1); 
 
    return false; 
 
}
<html> 
 
<head> 
 
<title>Do You Wanna Play A Game?</title> 
 

 
<script src="game.js"></script> 
 
</head> 
 

 
<body> 
 
<h1>Do You Wanna Play A Game?</h1> 
 
<h3>A Guessing Game</h3> 
 

 
<fieldset> 
 
\t <legend>The Game Starts Now</legend> 
 
\t <p>Welcome. You have stumbled upon this page. As a consequence, you have been trapped. To get out, the objective is simple.</p> 
 
    <p>I am thinking of a number. This number is between 1 and 500. You get ten guesses.</p> 
 
\t <p>Good luck.</p> 
 

 
    <div id="guessingarea"> 
 
\t <input type="text" id="userGuess" value="394" /><br /> 
 
    <button onClick="guess();">Guess</button> 
 
    <button onClick="reset();">Reset</button> 
 
    <br /> 
 
    <input id="cheat" type="checkbox" value="cheat" onClick="cheat();" /> 
 
    <label for="cheat">Cheat</label> 
 
    <div id="cheatShow" style="display: none;"> 
 
    <input id="cheatNumber" type="text"/> 
 
    </div> 
 
    </div> 
 
</fieldset> 
 
<p></p> 
 
    <fieldset> 
 
    <legend>Let's examine your guess, shall we?</legend> 
 
    <textarea id="guessesMade" rows="14" style="width: 100%;"></textarea> 
 
    </fieldset> 
 
</body> 
 
</html>

+1

デバッグをやってみましたか? – Carcigenicate

答えて

0

要素が利用可能である前に、スクリプトが含まれています。パーサがJSファイルにヒットすると、ページのレンダリングが停止され、javascriptの解析が試行されます。スクリプトに遭遇すると、要素はまだ利用できません。

あなたには2つのオプションがあります。

body要素を閉じる前にスクリプトタグを移動します。これは、ページを操作する前に利用可能な要素があることを確認します。

 <fieldset> 
     <legend>Let's examine your guess, shall we?</legend> 
     <textarea id="guessesMade" rows="14" style="width: 100%;"></textarea> 
    </fieldset> 

    <script src="game.js"></script> 
</body> 

クエリの要素、それが唯一のページがレンダリングされた後にのみ起こるクリックアクション、上で呼び出されているためguessメソッド内で毎回。

function guess() { 

    var guessIn = document.getElementById('userGuess'); 
    var guessOut = document.getElementById('guessesMade'); 

    //declare temp local var and store as an integer for conditional testing 
    var guessValue = parseInt(guessIn.value); 

    ...... 
    ...... 

それがコードペンで働く理由は、実行されるスクリプトは、要素がページ上の利用可能な確認しますどのonLoadに延期されているからです。

+0

ありがとう!ああ私のおかげで、とてもシンプルで、それは私のクレイジーを運転していた! –

0

htmlドキュメントの前にスクリプトを含めるようです。

document.getElementById('userGuess'); 

は、 'userGuess'要素が存在する前に呼び出されます。

私はむしろそのような冒頭で、それを宣言するよりも、あなたがそれを必要とする場合にのみ、これには2つの解決策を考える、いずれかの文書の末尾にスクリプトが含まれ、またはこの要素にアクセスすることができます。

var guessValue = parseInt(document.getElementById('userGuess').value); 
+0

ありがとうございます!それは私がそれを見ると非常に意味があります。 –

0

関数内で変数宣言を動かすと、関数が動作します。問題は、ドキュメントの準備が整う前にJavaScriptコードが実行されるため、guessInおよびguessOut変数がnullに初期化されることです。

また、JavaScriptコードは、DOMの完了時に実行される関数でラップすることもできます。

document.onreadystatechange = function() { 
    if (document.readyState === "complete") { 
    // your code goes in here 
    } 
} 

詳細については、MDNを参照してください。

関連する問題