Calculator Tools Calculator Tools
Create

Speed Typing Test

Dec 31, 2023

About this app

Test your typing speed with this fun speed typing game.

Speed Typing Test Speed Typing Test Type the given words as fast as you can! Words per Minute: 0 Start Game

Related apps

Put this on your site

Source

                    <html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">

<title>Speed Typing Test</title>
<meta name="description" content="Test your typing speed with this fun speed typing game.">
<meta name="keywords" content="typing, speed, test, game">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">

<script type="text/javascript">
try {
// App Javascript Goes Here. Place your entire script content inside the try block for error handling.
document.addEventListener("DOMContentLoaded", function() {
let startTime;
let endTime;
let timeElapsed;
let errorCount = 0;
let currentWordIndex = 0;
let words = [];
let typedWords = [];
let gameStarted = false;

const textElement = document.getElementById("text");
const inputElement = document.getElementById("input");
const startButton = document.getElementById("start-button");

// Add event listener to start button
startButton.addEventListener("click", startGame);

// Add event listener to input element
inputElement.addEventListener("input", checkInput);

function startGame() {
words = generateWords();
typedWords = [];
errorCount = 0;
currentWordIndex = 0;
gameStarted = true;

inputElement.value = "";
inputElement.disabled = false;
inputElement.focus();
startButton.disabled = true;

startTime = new Date().getTime();
updateText();
}

function checkInput() {
if (!gameStarted) {
return;
}

const typedWord = inputElement.value.trim();

if (typedWord === words[currentWordIndex]) {
typedWords.push(typedWord);
currentWordIndex++;

if (currentWordIndex === words.length) {
endGame();
} else {
updateText();
}

inputElement.value = "";
inputElement.classList.remove("is-invalid");
} else {
inputElement.classList.add("is-invalid");
errorCount++;
}
}

function endGame() {
gameStarted = false;
inputElement.disabled = true;
startButton.disabled = false;

endTime = new Date().getTime();
timeElapsed = (endTime - startTime) / 1000;
const wordsPerMinute = Math.round(typedWords.length / timeElapsed * 60);

inputElement.value = "";
inputElement.classList.remove("is-invalid");

updateText();
updateWPM(wordsPerMinute);
updateTextColor(wordsPerMinute);
}

function updateText() {
textElement.innerText = words.slice(currentWordIndex).join(" ");
}

function updateWPM(wordsPerMinute) {
const wpmElement = document.getElementById("wpm");
wpmElement.innerText = wordsPerMinute;
}

function updateTextColor(wordsPerMinute) {
const colorRange = 100;
const minWPM = 0;
const maxWPM = 20;

let colorValue = Math.round((wordsPerMinute - minWPM) / (maxWPM - minWPM) * colorRange);
if (colorValue < 0) {
colorValue = 0;
}
if (colorValue > colorRange) {
colorValue = colorRange;
}

const redValue = 255 - Math.round(colorValue / colorRange * 255);
const textColor = `rgb(${redValue}, 0, 0)`;

textElement.style.color = textColor;
}

function generateWords() {
const words = [
"Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", "sed", "do",
"eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore", "magna", "aliqua", "Ut",
"enim", "ad", "minim", "veniam", "quis", "nostrud", "exercitation", "ullamco", "laboris",
"nisi", "ut", "aliquip", "ex", "ea", "commodo", "consequat", "Duis", "aute", "irure", "dolor",
"in", "reprehenderit", "in", "voluptate", "velit", "esse", "cillum", "dolore", "eu",
"fugiat", "nulla", "pariatur", "Excepteur", "sint", "occaecat", "cupidatat", "non",
"proident", "sunt", "in", "culpa", "qui", "officia", "deserunt", "mollit", "anim", "id", "est",
"laborum"
];

// Shuffle the words array
for (let i = words.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[words[i], words[j]] = [words[j], words[i]];
}

return words;
}
});

} catch (error) {
// This will throw the error to the parent window.
throw error;
}
</script>

<style>
body {
font-family: 'Open Sans', sans-serif;
background-color: #f8f9fa;
}

h1 {
text-align: center;
margin-bottom: 2rem;
color: #343a40;
font-weight: bold;
font-size: 2rem;
}

.container {
max-width: 800px;
margin: 0 auto;
padding: 2rem;
}

#text {
margin-bottom: 1rem;
color: black;
font-size: 1.5rem;
font-weight: bold;
transition: color 0.5s;
}

#input {
font-size: 1.5rem;
}

#input.is-invalid {
border-color: red;
box-shadow: 0 0 0 0.25rem rgba(255, 0, 0, 0.25);
}

#wpm {
font-size: 2rem;
font-weight: bold;
color: #343a40;
}

#start-button {
margin-top: 2rem;
}
</style>
</head>
<body>
<div id="main-container" class="container">
<h1>Speed Typing Test</h1>
<p>Type the given words as fast as you can!</p>
<p id="text"></p>
<input id="input" type="text" class="form-control" disabled>
<p>Words per Minute: <span id="wpm">0</span></p>
<button id="start-button" class="btn btn-primary">Start Game</button>
</div>
</body>
</html>