addEventListener(‘click’, function(){}で、クリックごとに、btn inactiveのクラスを追加していってます。数字の初期値はランダム、時間はsetTimeoutで、現在時間からスタート時間を引いています。
reference
appendChild(): method appends a node as the last child of a node.
Tip: If you want create a new paragraph, with text, remember to create the text as a Text node which you append to the paragraph, then append the paragraph to the document.
Document.createElement() :method creates the HTML element specified by tagName, or an HTMLUnknownElement if tagName isn’t recognized. In a XUL document, it creates the specified XUL element. In other documents, it creates an element with a null namespace URI.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Run Time for Button touch</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {
background: #e0e0e0;
font-family: Arial, sans-serif;
text-align: center;
color: #0088cc;
font-size: 16px;
}
#scoreArea{
text-shadow: 0 1px 0 rgba(255, 255,255, 0.5);
margin: 30px auto;
}
#scoreText{
font-weight: bold;
font-size: 24px;
}
#startButton{
margin: 30px auto;
width: 180px;
border-radius: 5px;
box-shadow: 0 4px 0 #e91b0c;
background: #f44336;
color: #fff;
cursor: pointer;
padding: 7px;
}
#startButton:hover{
opacity: 0.8;
}
#startButton.pushed{
margin-top: 32px;
box-shadow: 0 2px 0 #e91b0c;
}
.btn {
position: relative;
display: inline-block;
width: 30px;
padding: 7px;
border-radius: 5px;
box-shadow: 0 4px 0 #0088cc;
color: #fff;
background: #00aaff;
cursor: pointer;
margin-bottom: 10px;
}
.btn.hidden:after{
content: '?';
position: absolute;
top: 0;
left: 0;
width: 30px;
padding: 7px;
border-radius: 5px;
background: #00aaff;
}
.btn + .btn {
margin-left: 10px;
}
.btn.inactive {
opacity: 0.5;
}
</style>
</head>
<body>
<div id="scoreArea">Your Score: <span id="scoreText">0.0</span></div>
<div id="board">
<!--<div class="btn">0</div>
<div class="btn">1</div><br>
<div class="btn">2</div>
<div class="btn">3</div> -->
</div>
<div id="startButton" class="pushed">START</div>
<script>
(function(){
'use strict';
var size = 3;
var currentNum = 0;
var startTime;
var timerId;
var board = document.getElementById('board');
var scoreText = document.getElementById('scoreText');
var startButton = document.getElementById('startButton');
initBoard();
startButton.addEventListener('click', function(){
initBoard();
var btns = document.getElementsByClassName('btn');
for (var i = 0; i < btns.length; i++){
btns[i].className = 'btn';
}
currentNum = 0;
startTime = Date.now();
if(timerId !== null) clearTimeout(timerId);
runTimer();
});
startButton.addEventListener('mousedown', function(){
this.className = 'pushed';
});
startButton.addEventListener('mouseup', function(){
this.className = '';
});
function runTimer(){
scoreText.innerHTML = ((Date.now() - startTime) / 1000).toFixed(2);
timerId = setTimeout(function(){
runTimer();
}, 10);
}
function createButton(num){
var button;
button = document.createElement('div');
button.className = 'btn hidden';
button.innerHTML = num;
button.addEventListener('click', function(){
if ((this.innerHTML - 0) === currentNum){
this.className = 'btn inactive';
currentNum++;
}
if (currentNum == size * size){
clearTimeout(timerId);
}
});
return button;
}
function initBoard(){
var buttons = [];
while (board.firstChild){
board.removeChild(board.firstChild);
}
for (var i = 0; i < size * size; i ++){
buttons.push(createButton(i));
}
while (buttons.length){
var button = buttons.splice(Math.floor(Math.random() * buttons.length), 1);
board.appendChild(button[0]);
if (buttons.length % size === 0){
board.appendChild(document.createElement('br'));
}
}
}
})();
</script>
</body>
</html>