2017-02-08 3 views
0

Ich habe ein Problem mit meinem innerenHTML nicht aktualisieren die Anzeige, wenn ich eine Taste drücke. Ich benutze console.log und ich kann sehen, dass die Werte tatsächlich das erste Mal aktualisieren, aber die Seite nicht. Im Bild unten habe ich den Startknopf einmal und zweimal höher gedrückt und Sie können die Werte im Protokoll ändern sehen. Dieser Effekt tritt bei beiden Schaltflächen auf, bei denen der Wert einmal und bei nachfolgenden Klicks nicht erneut aktualisiert wird. Außerdem wird die Webseite überhaupt nicht aktualisiert. Das Ziel des Programms ist es, ein Spiel zu machen, bei dem der Computer die Zahl, an die Sie denken, in einem bestimmten Bereich errät und Sie können entweder höher, niedriger oder richtig wählen. Ich bin neu hier, also lassen Sie mich bitte wissen, ob es irgendeinen Weg gibt, wie ich meine Beiträge in Zukunft verbessern kann.InnerHTML nicht in JavaScript aktualisieren

Image of webpage with log open

Hier ist der Code:

var guess = 0; // Number of guesses remaining 
 
var currentGuess = 0; 
 

 
function runGame() { 
 

 
    //get variables from the input fields in HTML form and convert to integer 
 
    var low = parseInt(document.getElementById('lowNum').value); 
 
    var high = parseInt(document.getElementById('highNum').value); 
 
    
 
    //boolean that checks if the game is won 
 
    if (document.getElementById('compGuess').value !== '' ) { 
 
     guess = parseInt(document.getElementById('compGuess').value); 
 
    } else { 
 
     alert ("You have to let the computer have at least one guess!"); 
 
    } 
 
    
 
    //input validation 
 
    if(low < high && low > 0 && high <= 50 && guess > 0 && guess <= 10) { 
 
     // Input validated 
 
     //alert("Low number: " + low + "\nHigh Number: " + high + "\nComputer Guesses: " + guess); 
 
     
 
     currentGuess = getRndInteger(low, high); 
 
     setElementValues();  
 
     showButtons(); 
 
    } else { 
 
     alert("Invalid selection. Make sure that the number range is between 1 and 50 and guesses are higher than zero."); 
 
    } 
 
    
 
} 
 

 
function processGuess(status, currentGuess) { 
 
    if (status == 'high') { 
 
     currentGuess = currentGuess - 1; 
 
    } else if (status == 'low') { 
 
     currentGuess = currentGuess + 1; 
 
    } else if (status == 'correct') { 
 
     wonGame(); 
 
    } 
 
//troubleshooting code 
 
console.log(status) ; 
 
console.log(currentGuess); 
 
setElementValues(); 
 
    return; 
 
} 
 

 
function setElementValues() { 
 
    
 
    
 
    console.log('setting values'); 
 
    document.getElementById("computerGuessVal").innerHTML = currentGuess; 
 
    document.getElementById("guessesLeft").innerHTML = guess; 
 

 
} 
 

 
//generate computer guess 
 
function getRndInteger(low, high) { 
 
    
 
    high = Math.floor(high); 
 
    low = Math.ceil(low); 
 
    return Math.floor(Math.random() * (high - low + 1)) + low; 
 
} 
 
    
 
//make bottom buttons visibile 
 
function showButtons() { 
 
    
 
    document.getElementById("higher").style.visibility = 'visible'; 
 
    document.getElementById("lower").style.visibility = 'visible'; 
 
    document.getElementById("correct").style.visibility = 'visible'; 
 
} 
 
//hide bottom buttons 
 
function hideButtons() { 
 
    
 
    document.getElementById("higher").style.visibility = 'none'; 
 
    document.getElementById("lower").style.visibility = 'none'; 
 
    document.getElementById("correct").style.visibility = 'none';  
 

 
} 
 

 
function wonGame() { 
 

 
/* document.getElementById("lowNum").innerHTML = 1; 
 
    document.getElementById("highNum").innerHTML = 1; 
 
    document.getElementById("guess").innerHTML = 1; 
 
    document.getElementById("computerGuessVal").innerHTML =" ";  
 
    document.getElementById("guessesLeft").innerHTML = " "; 
 
    alert("Looks like the computer guessed correctly. Thanks for playing!"); 
 
    */ 
 
    
 
    alert("Function yo"); 
 
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
 
<html> 
 
    <head> 
 
    <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
 
    <meta name="generator" content="PSPad editor, www.pspad.com"> 
 
    <title>ITEC345-101 Assignment 1</title> 
 
    <script language="JavaScript" src="ITEC345_101_FERGUSON_LAB1.js"></script> 
 
    </head> 
 
    <body> 
 
    <h1>Welcome to the number guessing game. Select a range of numbers between 1 and 50 and the 
 
    computer will try to guess it.<br> Tell the computer how many guesses it gets and see if you can stump it!</h1><br> 
 
    <h2>Pick a number range between 1 and 50</h2> 
 
     Low Number: <input type="number" value = "1" name="lowNum" id="lowNum" ><br> 
 
     High Number: <input type="number" value= "1" name="highNum" id="highNum"><br> 
 
     <br> 
 
     <br> 
 
     <h2>Now think of a number inside that range</h2> 
 
     Number of guesses computer gets (Max 10):<input type="number" value = "1" name="compGuess" id="compGuess"> 
 
     <br> 
 
     <br> 
 
     <input type="button" value="Start" onclick="runGame()"> 
 
     <br> 
 
     <br> 
 
     <br> 
 
     <font size="12">Current Computer Guess:</font> <h1 id="computerGuessVal"> </h1> <font size="10">Guesses left:</font><h1 id="guessesLeft"></h1> 
 
     <br> 
 
     <br> 
 
     <input type="button" value="Higher" id="higher" style= "visibility:hidden" onclick="processGuess('high', currentGuess)"> 
 
     <input type="button" value="Lower" id="lower" style= "visibility:hidden"  onclick="processGuess('low', currentGuess)"> 
 
     <input type="button" value="Correct" id="correct" style= "visibility:hidden" onclick="processGuess('correct', currentGuess)"> 
 
     
 
    
 
    </body> 
 
</html>

Antwort

1

Die Variable currentGuess in der processGuess() Funktion ist lokal für diese Funktion, weil Funktionsparameter immer lokale Variablen sind. Wenn diese Variable aktualisiert wird, wirkt sich dies nicht auf die globale Variable aus, die setElementValues() in .innerHTML steckt.

Sie müssen konsistent sein, ob Sie Informationen über Parameter übergeben oder globale Variablen verwenden. Wenn Sie die aktuelle Schätzung als Parameter übergeben, sollte sie den aktualisierten Wert zurückgeben, und der Aufrufer kann die globale Variable z.

onclick="currentGuess = processGuess('high', currentGuess);" 

Oder Sie könnten nur Stick die globale Variable zu verwenden, so dass Sie es nicht als Parameter übergeben müssen. Es wäre dann nur:

onclick="processGuess('high')" 

Hier ist Ihr Code mit der letzteren Methode.

var guess = 0; // Number of guesses remaining 
 
var currentGuess = 0; 
 

 
function runGame() { 
 

 
    //get variables from the input fields in HTML form and convert to integer 
 
    var low = parseInt(document.getElementById('lowNum').value); 
 
    var high = parseInt(document.getElementById('highNum').value); 
 
    
 
    //boolean that checks if the game is won 
 
    if (document.getElementById('compGuess').value !== '' ) { 
 
     guess = parseInt(document.getElementById('compGuess').value); 
 
    } else { 
 
     alert ("You have to let the computer have at least one guess!"); 
 
    } 
 
    
 
    //input validation 
 
    if(low < high && low > 0 && high <= 50 && guess > 0 && guess <= 10) { 
 
     // Input validated 
 
     //alert("Low number: " + low + "\nHigh Number: " + high + "\nComputer Guesses: " + guess); 
 
     
 
     currentGuess = getRndInteger(low, high); 
 
     setElementValues();  
 
     showButtons(); 
 
    } else { 
 
     alert("Invalid selection. Make sure that the number range is between 1 and 50 and guesses are higher than zero."); 
 
    } 
 
    
 
} 
 

 
function processGuess(status) { 
 
    if (status == 'high') { 
 
     currentGuess = currentGuess - 1; 
 
    } else if (status == 'low') { 
 
     currentGuess = currentGuess + 1; 
 
    } else if (status == 'correct') { 
 
     wonGame(); 
 
    } 
 
//troubleshooting code 
 
console.log(status) ; 
 
console.log(currentGuess); 
 
setElementValues(); 
 
    return; 
 
} 
 

 
function setElementValues() { 
 
    
 
    
 
    console.log('setting values'); 
 
    document.getElementById("computerGuessVal").innerHTML = currentGuess; 
 
    document.getElementById("guessesLeft").innerHTML = guess; 
 

 
} 
 

 
//generate computer guess 
 
function getRndInteger(low, high) { 
 
    
 
    high = Math.floor(high); 
 
    low = Math.ceil(low); 
 
    return Math.floor(Math.random() * (high - low + 1)) + low; 
 
} 
 
    
 
//make bottom buttons visibile 
 
function showButtons() { 
 
    
 
    document.getElementById("higher").style.visibility = 'visible'; 
 
    document.getElementById("lower").style.visibility = 'visible'; 
 
    document.getElementById("correct").style.visibility = 'visible'; 
 
} 
 
//hide bottom buttons 
 
function hideButtons() { 
 
    
 
    document.getElementById("higher").style.visibility = 'none'; 
 
    document.getElementById("lower").style.visibility = 'none'; 
 
    document.getElementById("correct").style.visibility = 'none';  
 

 
} 
 

 
function wonGame() { 
 

 
/* document.getElementById("lowNum").innerHTML = 1; 
 
    document.getElementById("highNum").innerHTML = 1; 
 
    document.getElementById("guess").innerHTML = 1; 
 
    document.getElementById("computerGuessVal").innerHTML =" ";  
 
    document.getElementById("guessesLeft").innerHTML = " "; 
 
    alert("Looks like the computer guessed correctly. Thanks for playing!"); 
 
    */ 
 
    
 
    alert("Function yo"); 
 
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
 
<html> 
 
    <head> 
 
    <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
 
    <meta name="generator" content="PSPad editor, www.pspad.com"> 
 
    <title>ITEC345-101 Assignment 1</title> 
 
    <script language="JavaScript" src="ITEC345_101_FERGUSON_LAB1.js"></script> 
 
    </head> 
 
    <body> 
 
    <h1>Welcome to the number guessing game. Select a range of numbers between 1 and 50 and the 
 
    computer will try to guess it.<br> Tell the computer how many guesses it gets and see if you can stump it!</h1><br> 
 
    <h2>Pick a number range between 1 and 50</h2> 
 
     Low Number: <input type="number" value = "1" name="lowNum" id="lowNum" ><br> 
 
     High Number: <input type="number" value= "1" name="highNum" id="highNum"><br> 
 
     <br> 
 
     <br> 
 
     <h2>Now think of a number inside that range</h2> 
 
     Number of guesses computer gets (Max 10):<input type="number" value = "1" name="compGuess" id="compGuess"> 
 
     <br> 
 
     <br> 
 
     <input type="button" value="Start" onclick="runGame()"> 
 
     <br> 
 
     <br> 
 
     <br> 
 
     <font size="12">Current Computer Guess:</font> <h1 id="computerGuessVal"> </h1> <font size="10">Guesses left:</font><h1 id="guessesLeft"></h1> 
 
     <br> 
 
     <br> 
 
     <input type="button" value="Higher" id="higher" style= "visibility:hidden" onclick="processGuess('high')"> 
 
     <input type="button" value="Lower" id="lower" style= "visibility:hidden"  onclick="processGuess('low')"> 
 
     <input type="button" value="Correct" id="correct" style= "visibility:hidden" onclick="processGuess('correct')"> 
 
     
 
    
 
    </body> 
 
</html>

+0

Works jetzt perfekt. Vielen Dank! –