JavaScript在一个简单的猜谜游戏函数上返回null
JavaScript returning null on a function for a simple guessing game
我使用JavaScript创建了一个猜谜游戏。最初,我用codepen编写它,它运行得很好,当我把它转移到sublime,在浏览器中作为一个独立的测试时,代码不能工作。我得到这个错误:"未捕获的类型错误:无法读取属性'值'的null在猜测",这是第14行var guessValue = parseInt(guessIn.value);并链接到第20行HTML,即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 && 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>
看起来你在html文档之前包含了脚本。
document.getElementById('userGuess');
在元素'userGuess'存在之前被调用。
我可以想到两种解决方案,要么在文档末尾包含脚本,要么只在需要时访问该元素,而不是像这样在开头声明它:var guessValue = parseInt(document.getElementById('userGuess').value);
在元素可用之前已经包含了脚本。一旦解析器碰到JS文件,它就会停止页面的呈现并尝试解析javascript。当遇到脚本时,元素仍然不可用。
你有两种选择来完成这个工作。
将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);
......
......
它在代码笔上工作的原因是,脚本被执行延迟到onLoad
,以确保元素在页面上可用。
如果将变量声明移到函数内部,它将正常工作。问题是JavaScript代码在文档准备好之前执行,所以guessIn和guessOut变量初始化为null。
或者你可以把JavaScript代码包装在一个函数中,当DOM完成后执行。
document.onreadystatechange = function () {
if (document.readyState === "complete") {
// your code goes in here
}
}
相关文章:
- 新手Javascript函数返回未定义的石头剪刀游戏
- 基本的Javascript/jQuery数学游戏:为什么可以't我第二次运行此函数时进行评估
- 类型错误:游戏.HexRenderer 不是 Linux Mint 上的构造函数
- JavaScript函数游戏
- JavaScript事件/函数不仅从按钮触发,而且从整个页面触发,增量游戏
- 使用 requestAnimationFrame 的 JS 游戏循环 - 对象函数只调用一次
- 在javascript游戏中添加暂停函数时遇到问题
- 编写一个时间函数,在游戏中清除倒计时并重新启动
- Javascript游戏循环-如何知道循环外的函数经过了多少时间
- 退出Javascript中的函数.简单的石头,纸,剪刀游戏
- 需要帮助更正文本游戏中的函数
- 简单的javascript游戏:由于构造函数或条件操作符导致的对象创建错误
- 如何在运行的JS函数中执行函数-修改JS游戏
- 用于循环游戏骰子的函数
- JavaScript在一个简单的猜谜游戏函数上返回null
- post - back后调用java-script函数启动flash游戏
- Javascript文字游戏如何使函数不替换元素
- Javascript函数并不适用于canvas游戏
- JavaScript MadLib游戏-不能在提交时调用函数
- 试图在井字游戏中设置移动,但当我调用该函数时,我一直没有定义