One Time Password (OTP) – Eingabe von Einmalpasswörtern
-
Akkordeon -
Anker -
Audio-Player -
Bild -
Bot -
Breaking News -
Button -
Card update -
Chip -
Copyright -
Details -
Exposé -
Fetch -
Flip-Card -
Footer -
Formular: Block -
Formular: Checkbox -
Formular: Combobox -
Formular: Fehlerliste -
Formular: Filter -
Formular: Fortschrittsanzeige -
Formular: Input -
Formular: Layouts -
Formular: Radio -
Formular: Select -
Formular: Switch -
Formular: Textfeld -
Formular: Upload -
Formular: Validierung -
Galerie -
Grid -
Header -
Hervorgehobener Link -
Hervorhebung -
Icon -
In-Page Navigation -
Infobox -
Karussell -
Kontakt -
Links -
Liste update -
Logo -
Map -
Meldung -
Menü -
Modal -
Newsletter -
One Time Password (OTP) – Eingabe von Einmalpasswörtern -
Pager -
Paginierung -
Quicklink-Liste -
Reiter -
Section -
Sidebar -
Skip Link -
Social Media -
Stack -
Stage -
Status -
Suche -
Tabelle -
Tag update -
Trenner neu -
Video-Player -
Vorspann -
Zeitstempel -
Zitat
Komponente zur Eingabe eines einmaligen Passworts (OTP). Sie besteht aus mehreren Eingabefeldern, die zusammen einen Code bilden. Sie kann zur Anmeldung oder Bestätigung von Aktionen eingesetzt werden. Die Komponente ist eigenständig, das heißt, es öffnet sich ein Screen, in dem nur diese Aktion durchführbar ist.
Die Komponente unterstützt Formulare, Validierung, das Einfügen eines kompletten Codes, ein verstecktes Autocomplete-Feld für One-Time-Codes sowie optional einen Countdown.
Verhalten
Alle Eingaben werden zu einem Wert zusammengefasst. Dieser Wert ist über die Eigenschaft value verfügbar.
Eingabe
Im Modus numeric sind nur Zahlen erlaubt. Im Modus text sind alle Zeichen erlaubt, aber nur bis zur maximalen Anzahl der Felder.
Formularintegration
Die Komponente verwendet die Form-Associated API.
Der Wert wird über ein verstecktes Eingabefeld an das Formular übergeben. Der Name dieses Feldes kommt von der Eigenschaft name.
Validierung
Wenn required aktiv ist, müssen alle Felder ausgefüllt sein. Sonst ist die Eingabe ungültig.
Eigene Fehler können über error gesetzt werden. Mit reportValidity() wird die Eingabe geprüft.
Events
Das Event input wird bei jeder Änderung ausgelöst.
Das Event change wird ausgelöst, wenn die Eingabe geändert wurde und das Feld den Fokus verliert.
Wenn alle Felder ausgefüllt sind, werden complete und wm-filled ausgelöst.
Wenn die Zeit abläuft, wird wm-timed-out gesendet.
Countdown
Der Timer wird mit startTimer() gestartet.
Nach der Zeit countdownTime wird ein Text angezeigt. Dabei wird auch das Event wm-timed-out ausgelöst.
OTP: Anmeldung mit einem 6-stelligen Code
Gemischter Code aus Buchstaben und Zahlen.
<wm-otp name="signin-code-6" label="SMS-Code" value="1234a6" required numberOfFields="6" inputMode="text"></wm-otp>OTP: Anmeldung mit einem 4-stelligen Code
Der Code enthält nur Zahlen.
<wm-otp name="signin-code-4" label="SMS-Code" value="2222" required numberOfFields="4" inputMode="numeric"></wm-otp>OTP: Anmeldung mit einem 6-stelligen Code
Ein 6-stelliger Code mit individuellem Pflichttext und Hilfetext.
<wm-otp
name="recovery-code"
label="Wiederherstellungscode"
numberOfFields="6"
required
requiredText="Bitte den Wiederherstellungscode eingeben"
hideAsterisk
>
<div slot="hint">Wir senden den Code an Ihre hinterlegte E-Mail-Adresse.</div>
</wm-otp>OTP: Fehlerzustand bei Validierung
Zeigt, wie ein ungültiger oder abgelaufener Code den Nutzer*innen mitgeteilt wird.
<wm-otp
name="invalid-code"
label="Code bestätigen"
value="1111"
error="Der eingegebene Code ist ungültig."
required
></wm-otp>OTP: Ablauf eines zeitbasierten Codes
Countdown-Mitteilung für kurzlebige Verifikationscodes.
<wm-otp
id="countdown-demo"
name="countdown-code"
label="Code läuft bald ab"
numberOfFields="6"
countdownTime="10"
countdownText="Der Code läuft in [COUNTDOWNTIME] Sekunden ab."
countdownEndedText="Der Code ist abgelaufen. Bitte fordern Sie einen neuen an."
required
></wm-otp>
<script type="module">
const initCountdownDemo = async () => {
if (!customElements.get('wm-otp')) {
await customElements.whenDefined('wm-otp');
}
const otp = document.getElementById('countdown-demo');
if (!otp) {
return;
}
otp.startTimer();
otp.addEventListener('wm-timed-out', () => {
console.log('Countdown ended for OTP component.');
});
};
initCountdownDemo();
</script>OTP: Deaktivierter/schreibgeschützter Zustand
Wird für Prüf- oder Review-Szenarien verwendet, in denen die Nutzer*innen den Wert nicht ändern können.
<wm-otp name="disabled-code" label="Code im Prüfmodus" value="987654" disabled></wm-otp>OTP: Fehlerbehandlung mit anschließend gültigem Code
Zeigt einen Fehlerzustand bei falscher Eingabe und löscht ihn, sobald der vollständige Code korrigiert (korrekter Code lautet 1234) wurde.
<wm-otp
id="error-recovery-demo"
name="error-recovery-demo"
label="Code überprüfen"
numberOfFields="4"
required
></wm-otp>
<p id="error-recovery-status" aria-live="polite"></p>
<script type="module">
const initErrorRecoveryDemo = async () => {
if (!customElements.get('wm-otp')) {
await customElements.whenDefined('wm-otp');
}
const otp = document.getElementById('error-recovery-demo');
const status = document.getElementById('error-recovery-status');
if (!otp || !status) {
return;
}
const showStatus = (message) => {
status.textContent = message;
};
otp.addEventListener('complete', () => {
const value = otp.value || '';
if (value === '1234') {
otp.error = '';
showStatus('Der Code wurde korrekt eingegeben. Der Fehlerzustand wurde entfernt.');
} else {
otp.error = 'Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.';
showStatus('Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.');
}
});
otp.addEventListener('input', () => {
if (!otp.error) {
return;
}
if (otp.value?.length === otp.numberOfFields) {
const currentValue = otp.value || '';
if (currentValue === '1234') {
otp.error = '';
showStatus('Der Code wurde korrekt eingegeben. Der Fehlerzustand wurde entfernt.');
}
}
});
otp.addEventListener('change', () => {
if (!otp.error) {
return;
}
if ((otp.value || '').length === otp.numberOfFields && otp.value !== '1234') {
otp.error = 'Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.';
showStatus('Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.');
}
});
};
initErrorRecoveryDemo();
</script>OTP: Weiterleitung nach erfolgreicher Eingabe
Zeigt eine Weiterleitung zum nächsten Schritt nach vollständiger Eingabe (korrekter Code lautet 1234).
<wm-otp id="redirect-demo" name="redirect-demo" label="Weiterleitungstest" numberOfFields="4" required></wm-otp>
<p id="redirect-demo-status" aria-live="polite"></p>
<script type="module">
const initRedirectDemo = async () => {
if (!customElements.get('wm-otp')) {
await customElements.whenDefined('wm-otp');
}
const otp = document.getElementById('redirect-demo');
const status = document.getElementById('redirect-demo-status');
if (!otp || !status) {
return;
}
const showStatus = (message) => {
status.textContent = message;
};
otp.addEventListener('complete', () => {
const value = otp.value || '';
if (value === '1234') {
otp.error = '';
showStatus('Der Code wurde korrekt eingegeben. Der Fehlerzustand wurde entfernt.');
showStatus('Weiterleitung zum nächsten Schritt…');
window.location.href = '/pattern-library/patterns/OneTimePassword/otp/#redirect-demo';
} else {
otp.error = 'Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.';
showStatus('Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.');
}
});
};
initRedirectDemo();
</script>OTP: Public-API-Playground
Testet die Host-API direkt mit Beispielaktionen.
<wm-otp
id="api-playground"
name="api-playground-code"
label="API Playground"
required
numberOfFields="4"
countdownTime="5"
inputMode="text"
countdownText="Der Code läuft in [COUNTDOWNTIME] Sekunden ab."
countdownEndedText="Der Code ist abgelaufen. Bitte fordern Sie einen <a href='#'>neuen Code</a> an."
required></wm-otp>
<wm-stack horizontal="true" gap="xxs" wrap="true">
<button type="button" data-action="set-value">Beispielwert</button>
<button type="button" data-action="reset">Zurücksetzen</button>
<button type="button" data-action="validate">Validieren</button>
<button type="button" data-action="start-timer">Countdown starten</button>
<button type="button" data-action="set-error">Fehler setzen</button>
<button type="button" data-action="clear-error">Fehler löschen</button>
</wm-stack>
<p id="api-playground-status" aria-live="polite"></p>
<script type="module">
const setStatus = (message) => {
const output = document.getElementById('api-playground-status');
if (output) {
output.textContent = message;
}
};
const initApiPlayground = async () => {
if (!customElements.get('wm-otp')) {
await customElements.whenDefined('wm-otp');
}
const otp = document.getElementById('api-playground');
if (!otp) {
return;
}
document.querySelectorAll('[data-action]').forEach((button) => {
button.addEventListener('click', () => {
const action = button.getAttribute('data-action');
switch (action) {
case 'set-value': {
otp.value = '1234';
setStatus('Beispielwert auf dem Host gesetzt.');
break;
}
case 'reset': {
otp.reset();
setStatus('OTP-Komponente zurückgesetzt.');
break;
}
case 'validate': {
const valid = otp.reportValidity();
setStatus(valid ? 'Validierung erfolgreich.' : 'Validierung fehlgeschlagen.');
break;
}
case 'start-timer': {
otp.startTimer();
setStatus('Countdown-Timer gestartet.');
break;
}
case 'set-error': {
otp.error = 'Der eingegebene Code ist ungültig.';
setStatus('Benutzerdefinierter Fehlerzustand gesetzt.');
break;
}
case 'clear-error': {
otp.error = '';
setStatus('Benutzerdefinierter Fehlerzustand gelöscht.');
break;
}
default:
break;
}
});
});
};
initApiPlayground();
</script>wm-otp
Eigenschaften
| Eigenschaft | Beschreibung | Werte | Default |
|---|---|---|---|
label
|
Setzt die sichtbare Beschriftung der OTP-Gruppe. |
string
|
|
countdownText
|
Setzt den Countdown-Text mit optionalem Platzhalter. |
string
|
|
countdownEndedText
|
Setzt den Text für den abgelaufenen Countdown. Unsafe HTML ist erlaubt, um Links einzubinden. |
string
|
|
requiredText
|
Setzt den Pflichtfeld-Text. |
string
|
|
error
|
Setzt die Fehlermeldung und aktualisiert den Error-State der Komponente. |
string
|
|
value
|
Setzt den OTP-Wert und normalisiert ihn entsprechend den aktuellen Regeln. |
string
|
""
|
numberOfFields
|
Setzt die Anzahl der sichtbaren OTP-Felder. |
number
|
4
|
inputMode
|
Setzt den Eingabemodus. |
string
|
"numeric"
|
complete
|
Gibt zurück, ob alle sichtbaren OTP-Felder befüllt sind. |
|
|
name
|
Name für die Teilnahme an Formularen und die Form-Submission. |
string
|
""
|
required
|
Markiert das Feld als Pflichtfeld. |
boolean
|
false
|
disabled
|
Deaktiviert alle sichtbaren Eingabefelder und das versteckte Hidden-Input. |
boolean
|
false
|
hideAsterisk
|
Blendet den visuellen Pflichtstern aus und verwendet stattdessen den Pflichttext. |
boolean
|
false
|
countdownTime
|
Countdown-Dauer in Sekunden. |
number
|
60
|
Slots
| Name | Beschreibung |
|---|---|
hint
|
Optionaler Hinweistext unterhalb der Beschriftung. |
Methoden
| Eigenschaft | Optionen | Argumente |
|---|---|---|
reset
|
Löscht den aktuellen OTP-Wert und setzt den internen Änderungsstatus zurück. | / |
startTimer
|
Startet den Countdown mit der aktuellen Dauer aus countdownTime. | / |
Events
| Event | Beschreibung | Rückgabewert |
|---|---|---|
wm-filled
|
Wird ausgelöst, wenn alle Felder befüllt sind. |
|
complete
|
Wird ausgelöst, wenn alle Felder befüllt sind. |
|
input
|
Wird bei jeder Änderung des OTP-Werts ausgelöst. |
|
change
|
Wird nach Verlassen des Steuerelements bei einer bestätigten Änderung ausgelöst. |
|
invalid
|
Wird über reportValidity() bei einem ungültigen Zustand ausgelöst. |
|
wm-timed-out
|
Wird ausgelöst, wenn der Countdown abgelaufen ist. |
|
Kontakt
Haben Sie noch Fragen, Feedback oder brauchen Sie ein Element, das die Pattern Library noch nicht
bietet?
handbuch@ma53.wien.gv.at