2017-09-09 4 views
1

J'ai un programme qui est censé ceci: Si j'appuie sur la barre d'espace, il est censé changer la couleur d'un élément en rouge, puis, s'il est encore pressé après 700 millisecondes, il est supposé changer le fond d'un autre élément en vert. Si j'arrête d'appuyer sur la barre d'espace avant 700 millisecondes, il devrait devenir noir. Ensuite, après qu'un élément devient vert, il doit démarrer une minuterie, et également "clignoter" les éléments (alterner rapidement entre le noir et le rouge/vert toutes les 200 millisecondes). Cependant, cela ne fonctionne pas correctement. Voici mon code:JS - changer les couleurs des éléments avec des presses de barre d'espace

//This is my main.js file 
 
var toggleBtn = document.getElementById('toggle'); 
 
var redDiv = document.getElementById('red'); 
 
var greenDiv = document.getElementById('green'); 
 
var done = false; 
 
var watchIsOn = false;//this is actually done in my timer.js 
 

 
function blink() { 
 
    redDiv.style.background="red"; 
 
    greenDiv.style.background="green"; 
 
} 
 

 
function f1() { 
 
    if ((watchIsOn) && (!done)) { 
 
    //watch.stop(); This is a function in my timer.js 
 
    redDiv.style.background = "#111"; 
 
    greenDiv.style.background = "#111"; 
 
    toggleBtn.textContent = "start"; 
 
    done = true; 
 
    } 
 
    else if ((!watchIsOn) && (!done)) { 
 
    //watch.start(); This is a function in my timer.js 
 
    toggleBtn.textContent = "stop"; 
 
    setInterval(blink, 200); 
 
    redDiv.style.background = "#111"; 
 
    greenDiv.style.background = "#111"; 
 
    } 
 
    else if ((!watchIsOn) && (done)) { 
 
    //watch.reset(); This is a function in my timer.js 
 
    done = false; 
 
    f1(); 
 
    } 
 
} 
 

 
function f2() { 
 
    //watch.reset(); This is a function in my timer.js 
 
} 
 

 
function green() { 
 
    window.onkeydown = function(Event) { 
 
    if ((Event.which == 32) && (!done)) { 
 
     greenDiv.style.background = "green"; 
 
    } 
 
    } 
 
} 
 

 
window.onkeydown = function(Event) { 
 
    if ((Event.which == 32) && (!done)) { 
 
    redDiv.style.background = "red"; 
 
    setTimeout(green, 700); 
 
    } 
 
} 
 

 
window.onkeyup = function(event) { 
 
    if (event.which == 32) { 
 
    f1(); 
 
    } 
 
    else if ((watchIsOn) && (!done)) { 
 
    done = true; 
 
    //watch.stop(); This is a function in my timer.js 
 
    toggleBtn.textContent = "start"; 
 
    } 
 
}
.timer { 
 
    background-color: #111; 
 
    color: aliceblue; 
 
    padding: 1%; 
 
    text-align: center; 
 
} 
 

 
#red, #green { 
 
    border-radius: 5px; 
 
    margin: 3%; 
 
    padding: 1px; 
 
    width: 41%; 
 
    height: 35px; 
 
    background-color: #111; 
 
} 
 

 
#red { 
 
    float: left; 
 
} 
 

 
#green { 
 
    float: right; 
 
}
<html> 
 
    <head> 
 
    <title>My website</title> 
 
    </head> 
 
    <body> 
 
    <header><h1>My website</h1></header> 
 
    <div class="timer"> 
 
     <div id="red"></div> <div id="green"></div> 
 
     <h1 id="timer">0:00.000</h1><!-- I have a timer.js file that calculates the time and updates it over here. --> 
 
     <button id="toggle" onclick="f1();, watchisOn=true;">start</button> 
 
     <button onclick="f2()">reset</button> 
 
     <script src="timer.js"></script> 
 
     <script src="main.js"></script> 
 
    </div> 
 
    </body> 
 
</html>

+0

https://stacksnippets.net/js a un problème de syntaxe sur la ligne n ° 42 – Amit

+0

Je ne sais pas pourquoi il dit que, parce que "window.onkeydown = function (Événement) {"est la ligne n ° 42! – Cubetastic

+0

f1() code de la fonction génère ce numéro – Amit

Répondre

0

Puisque vous êtes intéressé à savoir quand la barre d'espace a été libéré, vous devez utiliser onkeyup et onkeydown événements. Vos gestionnaires d'événements peuvent alors démarrer et arrêter les minuteurs en conséquence. Voici une solution "rapide et sale" que vous pouvez affiner davantage.

var stage = 0; // 0 = reset, 1 = red, 2 = blinking 
 
var red = document.getElementById('red'); 
 
var green = document.getElementById('green'); 
 
var timerId1 = null; 
 
var timerId2 = null; 
 

 
function doBlink() { 
 
    stage = 2; 
 
    timerId2 = setInterval(function() { 
 
    if (red.className === "") { 
 
     red.className = "hidden"; 
 
     green.className = ""; 
 
    } else { 
 
     red.className = ""; 
 
     green.className = "hidden"; 
 
    } 
 
    }, 200); 
 
} 
 

 
function setupGreen() { 
 
    timerId1 = setTimeout(function() { 
 
    if (stage === 1) { 
 
     green.className = ""; 
 
     doBlink(); 
 
    } 
 
    }, 700); 
 
} 
 

 
function reset() { 
 
    stage = 0; 
 
    green.className = "hidden"; 
 
    red.className = "hidden"; 
 
    if (timerId1) { 
 
    clearTimeout(timerId1); 
 
    timerId1 = null; 
 
    } 
 
    if (timerId2) { 
 
    clearTimeout(timerId2); 
 
    timerId2 = null; 
 
    } 
 

 
} 
 

 
document.body.onkeydown = function(e) { 
 
    if (e.keyCode == 32) { 
 
    if (stage === 0) { 
 
     stage = 1; 
 
     red.className = ""; 
 
     setupGreen(); 
 
    } 
 
    } 
 
} 
 

 
document.body.onkeyup = function(e) { 
 
    if (e.keyCode == 32) { 
 
    if (stage === 1) { 
 
     reset(); 
 
    } 
 
    } 
 
}
.timer { 
 
    background-color: #111; 
 
    color: aliceblue; 
 
    padding: 1%; 
 
    text-align: center; 
 
} 
 

 
#red, 
 
#green { 
 
    border-radius: 5px; 
 
    margin: 3%; 
 
    padding: 1px; 
 
    width: 41%; 
 
    height: 35px; 
 
    background-color: #111; 
 
} 
 

 
#red { 
 
    float: left; 
 
    background: red; 
 
} 
 

 
#green { 
 
    float: right; 
 
    background: green; 
 
} 
 

 
.hidden { 
 
    background: black !important; 
 
}
<html> 
 

 
<head> 
 
    <title>My website</title> 
 
</head> 
 

 
<body> 
 
    <header> 
 
    <h1>My website</h1> 
 
    </header> 
 
    <div class="timer"> 
 
    <div id="red" class="hidden"></div> 
 
    <div id="green" class="hidden"></div> 
 
    <button onclick="reset()">reset</button> 
 
    </div> 
 
</body> 
 

 
</html>

+0

Pouvez-vous s'il vous plaît dites-moi pourquoi vous avez utilisé "===" au lieu de "=="? – Cubetastic

+0

Vous pouvez utiliser soit dans ce cas.La différence est qu'aucune conversion implicite n'a lieu lorsque vous utilisez '===' donc par exemple '" 1 "== 1' est' true' mais '" 1 "=== 1 'est faux.Généralement, vous devriez utiliser' === 'et'! == 'sauf si vous avez des raisons de ne pas le faire.Pour plus d'exemples, voir https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Equality_comparisons_and_sameness –

+0

Ok, j'ai fait quelques changements, comme je l'ai mis "red.style.background =" red "" avec "red.className =" "", au lieu de le changer en utilisant css (cela ne fonctionnerait pas pour une raison), et des trucs comme ça, et ça marche! Merci! – Cubetastic