clearInterval не останавливает время последовательно - PullRequest
0 голосов
/ 18 ноября 2018

Я создаю простую игру, которая ограничивает пользователя до 30 секунд.По истечении этого времени игра заканчивается и результаты отображаются.Проблема в том, что ИНОГДА все работает нормально, а html «таймер» показывает Times Up.В других случаях обратный отсчет начинает обратный отсчет.Моя переменная id интервала является глобальной и изначально имеет значение null.Я не уверен, что происходит.

function words(x)
{
	switch (x)
	{
	case 1:
		var word = new Array("balte","table","hat","tab","belt","lab","eat","tea","ate","tale","bale","let","bet","teal","late","beat");
		break;		
	case 2:
		var word = new Array("atwre","water","wet","wear","tear","war","ret","rate","eat","ate","tea","awe","raw","rat","wart","art","tar");
		break;
	case 3:
		var word = new Array("dclaen","can","cane","and","clan","lane","lean","lend","land","den","dean","dance","lance","clean","deal","ale","dale","candle","clad");
		break;
	case 4:
		var word = new Array("aepinlar","air","airplane","plane","plan","lane","lean","pane","ear","near","nap","nape","lair","pen","pan","ape","leap","ale","peal","nap","rap","par", "pare", "pale", "are", "rail", "ail", "pail", "nail", "air", "pair", "ran", "pin", "pine", "line", "nip", "rip", "ripe", "lip", "earn", "learn", "ire");
		break;
	case 5:
		var word = new Array("redykboa","keyboard","key","board","bored","bore","bark","dark","dork","oar","boar","ark","dare","bare","are","red","rod","road","bode","rode","ode","bread", "read", "bead", "bred", "break", "drey", "day", "boy", "broke", "rake", "bake", "ear", "dear", "bear", "dye", "dyer", "doer", "oak", "boa", "doe", "okay","dab", "bade", "ade", "drake", "bard", "yard", "year", "beak", "beard", "bad", "bed", "bay");
		break;
            
    case 6:
		var word = new Array("evtsaedri","advertise","side","eat","sad","sat","rat","rate","vet","advise","read","rest","vest","serve","served","aside","east","tread","dear","deer","tear","trade","starve","steer","stare","veer","seat","seed","tree","drives","strive");
		break;
	case 7:
		var word = new Array("rcseanbh","branches","bra","she","ran","bran","car","cab","race","ranch","share","bench","bar","char","can","crane","ban","hear","hare");
		break;
	case 8:
		var word = new Array("vradntseue","adventures","vent","dent","stun","dust","rust","vase","sure","ensure","star","vend","dare","tar","starve","trade","sad","eat veer","tear","seat","seed","sand","tree","rest");
		break;
	case 9:
		var word = new Array("wokcnalgede","acknowledge","and","land","wand","wage","ledge","led","lead","lend","leg","gown","know","now","no","lean","wean","week","wed","lack","leak","deal","deck","knew","kneel");
		break;
	case 10:
		var word = new Array("muprith","triumph","hit","hurt","pit","trim","rum","rump","tip","thump","put","rim","him","hum","hip","rut");
		break;
	}    
	return word;
}
<html>
<head>
	<title>Greg's Gambits | Greg's Game of Boggle</title>
	<link href="greg.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="gregBoggle2.js"></script>
    <script>
        
        compWords = new Array(); notAword = new Array();
        playWords = new Array();
        var play = ""; /*var today;*/ var count = 30;
        var score = 0; var interval = null; 
        var quit = false;
        
        function start()
        {
            /*var start = new Date();
            today = start.getTime();*/
            timeIt();
            boggle();
        }
        function displayLetters()
        {
            var num = Math.floor(Math.random()*10) +1;
            compWords = words(num);
            yourWord = compWords[0];
            document.getElementById("letters").innerHTML = yourWord;
        }  
        function timeIt()
        {
            interval = window.setInterval("countdown()",1000);
        }
        function countdown()
        {
            count--;
        if (count == 0)
            {
                window.clearInterval(interval);
                interval = null;
                document.getElementById("timer").innerHTML = "Time's Up";
                var btn =document.getElementById("start");
                btn.disabled = true;
                quit = true;
                checkWin();
                return;
            }
        document.getElementById("timer").innerHTML = count;
        }
        
        function boggle()
        {
            play = document.getElementById("words").value;
            if (!quit)
            {
                playWords.push(play);
                displayEntries();
                document.getElementById("words").value = "";
                document.getElementById("words").focus();
            } 
            else    
            {
                document.getElementById("words").value = "";
                document.getElementById("words").focus();
                checkWin();
            }    
                    
        }
        function displayEntries()
        {
            document.getElementById("entries").innerHTML = playWords.toString();
                
        }
        
        /*function toMinutesAndSeconds(millis)
        {
            var minutes = Math.floor(millis/60000);
            var seconds = ((millis%60000)/1000).toFixed(0);
            
            return minutes + ":" + ((seconds < 10 ? '0' : "")+ seconds);
        }*/
        function checkWin()
        {
            // check winning score and list bad words
            var complgth = compWords.length;
            var playlgth = (playWords.length);
            var flag; var timePlayed;
            /*var endTime = new Date().getTime();
            var diff = endTime - today;
            timePlayed = toMinutesAndSeconds(diff);*/
            for (var i = 0; i < playlgth; i++)
                {
                    flag = 0;
                    for (var k = 0; k < complgth; k++)
                        {
                             if (playWords[i] == compWords[k])
                                 {
                                     score= score + 1;
                                     flag = 1;
                                 }
                        }
                    
                    if (flag == 0)
                        notAword.push(playWords[i]);
                }
            document.getElementById("result").innerHTML = ("Your score is " +
                score + ". The following entries " + "are not valid words: <br />" +
                notAword.toString());
            /*document.getElementById("timer").innerHTML = ("Your time: " + timePlayed);*/

        }    
    </script>
    
</head>
<body>
<div id="container">
 <img src="images/superhero.jpg" width="120" height="120" class="floatleft" />
    <h1 align="center"><em>Greg's Game of Boggle</em></h1>
    <div style = "clear:both;"></div>
    <div id = "nav">
        <p><a href="index.html">Home</a>
        <a href = "greg.html">About</a>
        <a href = "play_games.html">Play a Game</a>
        <a href="signin.html">Sign In</a>
        <a href = "contact.html">Contact Us</a></p>            
    </div>
<div id="content">
    <p>The object of the game is to create as many words as
    you can. Please click the Display letters button and your letters will
    be shown below. You have 10 possible letter combinations and 30 seconds. When you are ready to begin, enter the word then click the Submit Word button. The timer will start after first entered word.</p>
    <p><input type="button" value="Display letters" onclick="displayLetters();" /><br/>
        <input type="text" id="words">
        <input type="button" id="start" value="Submit Word" onclick="start();" />
    </p>
    
    <h2><br /><br />Letters you can use:<br /><div id="letters">&nbsp;</div><br /></h2>
    <h2>Your words so far: <br /><div id="entries">&nbsp;</div><br /></h2>
    <h2>Results:<br /><div id="result">&nbsp;</div></h2> 
    <h2>Timer: <br /><div id="timer">&nbsp;</div></h2>
</div>
<div id="footer">Copyright &copy; 2013 Greg's Gambits<br />
<a href="mailto:foulksy@gmail.com">foulksy@gmail.com</a>
</div>
</div>    
</body>
</html>

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Вы должны заменить эту строку

interval = window.setInterval("countdown()",1000);

со следующим

interval = window.setInterval(countdown, 1000);

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

Подробнее здесь.

0 голосов
/ 18 ноября 2018

Не уверен, что по этой причине происходит сбой, но setInterval принимает функцию в качестве первого аргумента, а не строку.Это должно быть setInterval(countdown, 1000), а не setInterval("countdown()", 1000).

0 голосов
/ 18 ноября 2018

Каждый раз, когда вы отправляете слово, вы вызываете функцию start (), которая вызывает timeIt (). Ваше решение работает, если вы отправляете только одно слово, но если вы отправляете несколько, вы столкнетесь с проблемой, когда увидите отрицательный таймер.

Полагаю, вам нужно очистить предыдущий setInterval, прежде чем создавать новый и сохранять его в переменной интервала:

    function timeIt()
    {
        window.clearInterval(interval);
        interval = window.setInterval(countdown, 1000);
    }
...