-m "Copy & Paste wird unterbunden"

This commit is contained in:
jamulix 2025-10-24 09:18:00 +02:00 committed by jamulix (aider)
commit ae8b313dea
3 changed files with 96 additions and 8 deletions

View file

@ -98,6 +98,11 @@
"lesson": 20,
"title": "JSON Parsing",
"text": "{\n\"user\": \"dev\",\n\"skills\": [\"Python\", \"C++\", \"JSON\"],\n\"active\": true,\n\"projects\": [{\n \"title\": \"Tipptrainer\",\n \"completed\": false\n }]\n} // Beachte Anführungszeichen und Doppelpunkte"
},
{
"lesson": 21,
"title": "Kurze Test Lektion",
"text": "Dies ist nur ein kurzer Text."
}
]

View file

@ -130,6 +130,10 @@ body {
font-weight: 500;
line-height: 1.6;
letter-spacing: 0.5px;
user-select: none; /* Verhindert Textauswahl */
-webkit-user-select: none; /* Für Safari */
-moz-user-select: none; /* Für Firefox */
-ms-user-select: none; /* Für Internet Explorer/Edge */
}
#user-input {

View file

@ -32,7 +32,7 @@ document.addEventListener('DOMContentLoaded', function() {
document.getElementById('theme-toggle').addEventListener('click', toggleTheme);
const userInput = document.getElementById('user-input');
const targetText = document.getElementById('target-text');
const targetTextElement = document.getElementById('target-text');
const nextBtn = document.getElementById('next-btn');
const endBtn = document.getElementById('end-btn');
@ -57,9 +57,90 @@ document.addEventListener('DOMContentLoaded', function() {
// Zeige die erste Zeile an
updateLineDisplay();
// Verhindere Copy & Paste für das Vorlagenfeld
targetTextElement.addEventListener('copy', function(event) {
event.preventDefault();
alert('Kopieren aus der Vorlage ist nicht erlaubt! Bitte tippen Sie den Text manuell.');
});
targetTextElement.addEventListener('cut', function(event) {
event.preventDefault();
alert('Ausschneiden aus der Vorlage ist nicht erlaubt!');
});
targetTextElement.addEventListener('contextmenu', function(event) {
event.preventDefault();
return false;
});
// Fokus auf das Eingabefeld setzen
userInput.focus();
// Verhindere Copy & Paste für das Eingabefeld
userInput.addEventListener('paste', function(event) {
event.preventDefault();
alert('Einfügen (Paste) ist nicht erlaubt! Bitte tippen Sie den Text manuell.');
});
userInput.addEventListener('copy', function(event) {
event.preventDefault();
alert('Kopieren (Copy) ist nicht erlaubt!');
});
userInput.addEventListener('cut', function(event) {
event.preventDefault();
alert('Ausschneiden (Cut) ist nicht erlaubt!');
});
// Verhindere Drag & Drop
userInput.addEventListener('drop', function(event) {
event.preventDefault();
alert('Drag & Drop ist nicht erlaubt! Bitte tippen Sie den Text manuell.');
});
// Verhindere das Einfügen über das Kontextmenü (rechte Maustaste)
userInput.addEventListener('contextmenu', function(event) {
event.preventDefault();
return false;
});
// Verhindere das Einfügen über Tastenkombinationen (Strg+V, Cmd+V, etc.)
userInput.addEventListener('keydown', function(event) {
// Strg+V oder Cmd+V
if ((event.ctrlKey || event.metaKey) && event.key === 'v') {
event.preventDefault();
alert('Einfügen (Strg+V / Cmd+V) ist nicht erlaubt! Bitte tippen Sie den Text manuell.');
return false;
}
// Strg+C oder Cmd+C
if ((event.ctrlKey || event.metaKey) && event.key === 'c') {
event.preventDefault();
alert('Kopieren (Strg+C / Cmd+C) ist nicht erlaubt!');
return false;
}
// Strg+X oder Cmd+X
if ((event.ctrlKey || event.metaKey) && event.key === 'x') {
event.preventDefault();
alert('Ausschneiden (Strg+X / Cmd+X) ist nicht erlaubt!');
return false;
}
// Strg+A oder Cmd+A (Selektion verhindern)
if ((event.ctrlKey || event.metaKey) && event.key === 'a') {
event.preventDefault();
alert('Selektion (Strg+A / Cmd+A) ist nicht erlaubt!');
return false;
}
// Rechtsklick-Menü-Tasten (Context Menu key)
if (event.key === 'ContextMenu') {
event.preventDefault();
return false;
}
});
// Starte die Zeitmessung beim ersten Tastendruck und zähle Tastaturanschläge
userInput.addEventListener('keydown', function(event) {
const cursorPosition = userInput.selectionStart;
@ -186,11 +267,11 @@ document.addEventListener('DOMContentLoaded', function() {
if (data.error) {
alert('Fehler: ' + data.error);
} else {
lines = data.text.split('\n');
lines = data.text.split(/\r?\n/);
currentLineIndex = 0;
completedLines = [];
currentLineInput = '';
fullText = lines.join('\n');
fullText = data.text;
startTime = null;
keyStrokeCount = 0; // Zurücksetzen des Tastaturanschlagszählers
updateLineDisplay();
@ -223,11 +304,11 @@ document.addEventListener('DOMContentLoaded', function() {
})
.then(response => response.json())
.then(data => {
lines = data.text.split('\n');
lines = data.text.split(/\r?\n/);
currentLineIndex = 0;
completedLines = [];
currentLineInput = '';
fullText = lines.join('\n');
fullText = data.text;
startTime = null;
keyStrokeCount = 0; // Zurücksetzen des Tastaturanschlagszählers
updateLineDisplay();
@ -308,7 +389,6 @@ document.addEventListener('DOMContentLoaded', function() {
// Text hervorheben
function updateTextHighlighting(userInput, currentText) {
const targetElement = document.getElementById('target-text');
let highlightedText = '';
// Verwende den ursprünglichen Text für die Anzeige
@ -354,12 +434,11 @@ document.addEventListener('DOMContentLoaded', function() {
}
}
targetElement.innerHTML = highlightedText;
targetTextElement.innerHTML = highlightedText;
}
// Hilfsfunktion zum Aktualisieren der Zeilenanzeige
function updateLineDisplay() {
const targetElement = document.getElementById('target-text');
// Setze nur die aktuelle Zeile mit Hervorhebung
updateTextHighlighting('', lines[currentLineIndex]);
}