JavaScript, возвращающий null для функции для простой игры в угадайку

#javascript #function #null #typeerror

#javascript #функция #null #ошибка типа

Вопрос:

Я создал игру в угадайку, используя JavaScript. Изначально я написал это в codepen, где оно работало нормально, и когда я перенес его на sublime, чтобы протестировать его в браузерах как автономный, код не работал. Я получаю эту ошибку: «Неперехваченная ошибка типа: не удается прочитать значение свойства null при угадывании», которое является строкой 14 var guessValue = parseInt(guessIn.value); и ссылается на HTML строки 20, которая является Guess

Я не могу понять, откуда берется null. Что я делаю неправильно или неправильно не определил, что вызывает значение 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 amp;amp; 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>
	<legend>The Game Starts Now</legend>
	<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>
	<p>Good luck.</p>

  <div id="guessingarea">
	<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. Вы пробовали выполнять какую-либо отладку?

Ответ №1:

Похоже, что вы включаете скрипт перед своим HTML-документом.

 document.getElementById('userGuess');
  

вызывается до того, как элемент ‘userGuess’ существует.

Я могу придумать два решения для этого: либо включить скрипт в конец документа, либо обращаться к этому элементу только тогда, когда он вам нужен, вместо того, чтобы объявлять его в начале вот так:

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

Комментарии:

1. Большое вам спасибо! Теперь, когда я это вижу, в этом так много смысла.

Ответ №2:

Вы включили скрипт до того, как элемент стал доступен. Как только анализатор попадет в JS-файл, он остановит рендеринг страницы и попытается проанализировать javascript. При обнаружении скрипта элемент по-прежнему недоступен.

У вас есть 2 варианта, чтобы заставить это работать.

Переместите тег script в перед закрытием 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);

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

Причина, по которой это работает в code pen, заключается в том, что выполнение скриптов откладывается на onLoad , что гарантирует доступность элементов на странице.

Комментарии:

1. Спасибо! Боже мой, так просто, и это сводило меня с ума!

Ответ №3:

Если вы переместите объявления переменных внутри функции, это сработает. Проблема в том, что код JavaScript выполняется до того, как документ готов, поэтому переменные guessIn и guessOut инициализируются значением null.

В качестве альтернативы вы можете обернуть свой код JavaScript в функцию, которая будет выполняться после завершения DOM.

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

Смотрите MDN для получения более подробной информации.