2.1.4 - Billentyűparancsok

Röviden a szabványpontról

A WCAG 2.1.4 (Character Key Shortcuts) előírja, hogy ha egy weboldal vagy alkalmazás karakterbillentyűs gyorsbillentyűket használ (egyetlen karakterbillentyű lenyomásával aktivált billentyűparancsok, esetleg módosítókkal), a felhasználóknak képesnek kell lenniük ezeket a gyorsbillentyűket kikapcsolni, átképezni más billentyűkre, vagy csak fókuszban aktiválni. Ez biztosítja, hogy a billentyűparancsok ne zavarják a felhasználók gépelését vagy navigációját.

Mire vonatkozik: Minden olyan webes tartalomra, amely karakterbillentyűs gyorsbillentyűket implementál funkcionalitáshoz, mint gyors hozzáférési parancsok vagy navigációs kiváltók.

Cél: Biztosítani, hogy a billentyűzetes bevitelre támaszkodó felhasználók – különösen a mozgássérült vagy kognitív fogyatékossággal élők – ne kerüljenek csapdába vagy ne zavarják meg őket olyan billentyűparancsok, amelyek ütközhetnek a beviteli módszereikkel. Megakadályozza a parancsok véletlen aktiválását és javítja az általános használhatóságot.

Kiket érint

Elsődleges felhasználók:

  • Mozgássérült felhasználók, akik alternatív beviteli eszközöket vagy kisegítő technológiákat használnak
  • Kognitív fogyatékossággal élő felhasználók, akik zavarba ejtőnek találhatják a váratlan gyorsbillentyűket
  • Csak billentyűzetet használó felhasználók, akik zavarás nélküli gépelésre támaszkodnak

Másodlagos előnyök:

  • Megakadályozza a képernyőolvasókkal vagy más kisegítő technológiákkal való ütközéseket, amelyek hasonló gyorsbillentyűket használhatnak
  • Javítja az általános felhasználói élményt a gyorsbillentyűk testreszabhatóságával vagy letiltásával

Tesztelés

  1. Karakterbillentyűs gyorsbillentyűk azonosítása: Tekintsd át az alkalmazásod vagy oldaladat minden olyan parancsért, amelyet egyetlen karakterbillentyű (módosítókkal vagy anélkül) vált ki
  2. Gyorsbillentyűk letiltásának tesztelése: Ellenőrizd, hogy a felhasználók ki tudják kapcsolni ezeket a gyorsbillentyűket beállításokon keresztül
  3. Gyorsbillentyűk átképezésének tesztelése: Ellenőrizd, hogy a felhasználók megváltoztathatják-e a gyorsbillentyűket az ütközések elkerülése érdekében
  4. Csak fókuszban való aktiválás tesztelése: Győződj meg róla, hogy a gyorsbillentyűk csak akkor aktiválódnak, amikor a releváns elem fókuszban van, nem globálisan
  5. Csak billentyűzetes tesztelés: Navigálj és használd a felületet csak billentyűzettel, hogy megerősítsd, nincs váratlan gyorsbillentyű aktiválás

Jó gyakorlatok

1. Gyorsbillentyű letilthatósága

<div class="shortcut-settings">
  <h3>Billentyűparancs beállítások</h3>
  <label class="toggle-label">
    <input type="checkbox" id="toggleShortcut" />
    <span>Billentyűparancsok engedélyezése</span>
  </label>
  
  <div id="shortcut-info" class="info-box">
    <p>Ha engedélyezve van:</p>
    <ul>
      <li><kbd>S</kbd> - Mentés</li>
      <li><kbd>N</kbd> - Új dokumentum</li>
      <li><kbd>/</kbd> - Keresés</li>
    </ul>
  </div>
</div>

<style>
.shortcut-settings {
  max-width: 400px;
  padding: 20px;
  border: 1px solid #ddd;
  border-radius: 8px;
  margin: 20px;
  background-color: #f8f9fa;
}

.toggle-label {
  display: flex;
  align-items: center;
  cursor: pointer;
  padding: 10px;
  border-radius: 4px;
  transition: background-color 0.2s;
}

.toggle-label:hover {
  background-color: #e9ecef;
}

.toggle-label input {
  margin-right: 10px;
  width: 20px;
  height: 20px;
  cursor: pointer;
}

.info-box {
  margin-top: 15px;
  padding: 15px;
  background-color: #e7f3ff;
  border-radius: 4px;
  font-size: 14px;
}

.info-box.disabled {
  opacity: 0.5;
}

kbd {
  display: inline-block;
  padding: 2px 6px;
  font-family: monospace;
  font-size: 12px;
  background-color: #f7f7f7;
  border: 1px solid #ccc;
  border-radius: 3px;
  box-shadow: 0 1px 0 rgba(0,0,0,0.2);
}
</style>

<script>
document.addEventListener('DOMContentLoaded', function() {
  const toggle = document.getElementById('toggleShortcut');
  const infoBox = document.getElementById('shortcut-info');
  
  // Állapot betöltése localStorage-ból
  let shortcutsEnabled = localStorage.getItem('shortcutsEnabled') === 'true';
  toggle.checked = shortcutsEnabled;
  updateInfoBox();

  toggle.addEventListener('change', () => {
    shortcutsEnabled = toggle.checked;
    localStorage.setItem('shortcutsEnabled', shortcutsEnabled);
    updateInfoBox();
    
    // Visszajelzés a felhasználónak
    const status = shortcutsEnabled ? 'engedélyezve' : 'letiltva';
    alert(`Billentyűparancsok ${status}`);
  });

  function updateInfoBox() {
    if (shortcutsEnabled) {
      infoBox.classList.remove('disabled');
    } else {
      infoBox.classList.add('disabled');
    }
  }

  // Billentyűparancs kezelő
  document.addEventListener('keydown', (e) => {
    // Csak akkor működik, ha engedélyezve van
    if (!shortcutsEnabled) return;
    
    // Ne aktiválódjon input mezőkben
    if (['INPUT', 'TEXTAREA', 'SELECT'].includes(e.target.tagName)) return;
    
    switch(e.key.toLowerCase()) {
      case 's':
        e.preventDefault();
        console.log('Mentés parancs aktiválva');
        showNotification('Dokumentum mentve');
        break;
      case 'n':
        e.preventDefault();
        console.log('Új dokumentum parancs aktiválva');
        showNotification('Új dokumentum létrehozva');
        break;
      case '/':
        e.preventDefault();
        console.log('Keresés parancs aktiválva');
        document.querySelector('#search-input')?.focus();
        showNotification('Keresés megnyitva');
        break;
    }
  });
  
  function showNotification(message) {
    const notification = document.createElement('div');
    notification.textContent = message;
    notification.style.cssText = `
      position: fixed;
      bottom: 20px;
      right: 20px;
      background-color: #28a745;
      color: white;
      padding: 15px 20px;
      border-radius: 4px;
      box-shadow: 0 2px 5px rgba(0,0,0,0.2);
      z-index: 1000;
    `;
    document.body.appendChild(notification);
    
    setTimeout(() => {
      notification.remove();
    }, 3000);
  }
});
</script>

Magyarázat: A gyorsbillentyűk csak akkor működnek, ha a felhasználó engedélyezi őket. Az állapot localStorage-ban mentésre kerül, így a beállítás megmarad.

2. Aktiválás csak fókuszban

<div class="focus-shortcut-example">
  <h3>Dokumentum szerkesztő</h3>
  
  <div class="editor-toolbar">
    <button id="saveBtn" tabindex="0" class="toolbar-btn">
      <span class="icon">💾</span> Mentés (S)
    </button>
    <button id="boldBtn" tabindex="0" class="toolbar-btn">
      <span class="icon">B</span> Félkövér (B)
    </button>
    <button id="italicBtn" tabindex="0" class="toolbar-btn">
      <span class="icon">I</span> Dőlt (I)
    </button>
  </div>
  
  <textarea id="editor" class="editor-content" placeholder="Kezdj el gépelni..."></textarea>
  
  <div class="status-bar">
    <span id="status">Készen áll</span>
  </div>
</div>

<style>
.focus-shortcut-example {
  max-width: 600px;
  margin: 20px;
  border: 1px solid #ddd;
  border-radius: 8px;
  overflow: hidden;
}

.editor-toolbar {
  display: flex;
  gap: 10px;
  padding: 10px;
  background-color: #f8f9fa;
  border-bottom: 1px solid #ddd;
}

.toolbar-btn {
  padding: 8px 16px;
  border: 1px solid #ccc;
  background-color: white;
  border-radius: 4px;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 5px;
  transition: all 0.2s;
}

.toolbar-btn:hover {
  background-color: #e9ecef;
  border-color: #007bff;
}

.toolbar-btn:focus {
  outline: 2px solid #007bff;
  outline-offset: 2px;
  background-color: #e7f3ff;
}

.toolbar-btn.active {
  background-color: #007bff;
  color: white;
  border-color: #0056b3;
}

.icon {
  font-size: 16px;
}

.editor-content {
  width: 100%;
  min-height: 200px;
  padding: 15px;
  border: none;
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  font-size: 16px;
  resize: vertical;
  box-sizing: border-box;
}

.editor-content:focus {
  outline: none;
  background-color: #fffbf0;
}

.status-bar {
  padding: 10px;
  background-color: #f8f9fa;
  border-top: 1px solid #ddd;
  font-size: 14px;
  color: #666;
}
</style>

<script>
document.addEventListener('DOMContentLoaded', function() {
  const saveBtn = document.getElementById('saveBtn');
  const boldBtn = document.getElementById('boldBtn');
  const italicBtn = document.getElementById('italicBtn');
  const editor = document.getElementById('editor');
  const status = document.getElementById('status');
  
  let isBold = false;
  let isItalic = false;

  // Gomb események
  saveBtn.addEventListener('click', () => performSave());
  boldBtn.addEventListener('click', () => toggleBold());
  italicBtn.addEventListener('click', () => toggleItalic());

  // Billentyűparancs kezelő - csak fókuszban
  document.addEventListener('keydown', (e) => {
    // Mentés - csak ha a mentés gomb fókuszban van
    if (document.activeElement === saveBtn && e.key.toLowerCase() === 's') {
      e.preventDefault();
      performSave();
      return;
    }
    
    // Félkövér - csak ha a félkövér gomb fókuszban van
    if (document.activeElement === boldBtn && e.key.toLowerCase() === 'b') {
      e.preventDefault();
      toggleBold();
      return;
    }
    
    // Dőlt - csak ha a dőlt gomb fókuszban van
    if (document.activeElement === italicBtn && e.key.toLowerCase() === 'i') {
      e.preventDefault();
      toggleItalic();
      return;
    }
    
    // Szerkesztő területen belüli gyorsbillentyűk (Ctrl/Cmd kombináció)
    if (document.activeElement === editor) {
      if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 's') {
        e.preventDefault();
        performSave();
      } else if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'b') {
        e.preventDefault();
        toggleBold();
      } else if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'i') {
        e.preventDefault();
        toggleItalic();
      }
    }
  });

  function performSave() {
    updateStatus('Dokumentum mentve!');
    saveBtn.classList.add('active');
    setTimeout(() => {
      saveBtn.classList.remove('active');
    }, 300);
    
    // Itt lenne a tényleges mentési logika
    console.log('Tartalom mentve:', editor.value);
  }

  function toggleBold() {
    isBold = !isBold;
    boldBtn.classList.toggle('active', isBold);
    updateStatus(isBold ? 'Félkövér bekapcsolva' : 'Félkövér kikapcsolva');
    
    // Alkalmazás a kijelölt szövegre
    if (document.activeElement === editor) {
      document.execCommand('bold');
    }
  }

  function toggleItalic() {
    isItalic = !isItalic;
    italicBtn.classList.toggle('active', isItalic);
    updateStatus(isItalic ? 'Dőlt bekapcsolva' : 'Dőlt kikapcsolva');
    
    // Alkalmazás a kijelölt szövegre
    if (document.activeElement === editor) {
      document.execCommand('italic');
    }
  }

  function updateStatus(message) {
    status.textContent = message;
    setTimeout(() => {
      status.textContent = 'Készen áll';
    }, 2000);
  }
});
</script>

Magyarázat: A gyorsbillentyűk csak akkor aktiválódnak, amikor a gomb fókuszban van, megakadályozva a véletlen aktiválást máshol. A szerkesztő területen belül csak módosító billentyűkkel (Ctrl/Cmd) működnek.

3. Gyorsbillentyű átképezési felület

<div class="shortcut-remapping">
  <h3>Gyorsbillentyű testreszabás</h3>
  
  <div class="shortcut-list">
    <div class="shortcut-item">
      <span class="action-name">Mentés</span>
      <div class="key-input-wrapper">
        <input type="text" 
               id="save-shortcut" 
               class="key-input" 
               value="S" 
               readonly
               aria-label="Mentés gyorsbillentyű">
        <button class="change-btn" data-action="save">Módosítás</button>
      </div>
    </div>
    
    <div class="shortcut-item">
      <span class="action-name">Másolás</span>
      <div class="key-input-wrapper">
        <input type="text" 
               id="copy-shortcut" 
               class="key-input" 
               value="C" 
               readonly
               aria-label="Másolás gyorsbillentyű">
        <button class="change-btn" data-action="copy">Módosítás</button>
      </div>
    </div>
    
    <div class="shortcut-item">
      <span class="action-name">Beillesztés</span>
      <div class="key-input-wrapper">
        <input type="text" 
               id="paste-shortcut" 
               class="key-input" 
               value="V" 
               readonly
               aria-label="Beillesztés gyorsbillentyű">
        <button class="change-btn" data-action="paste">Módosítás</button>
      </div>
    </div>
  </div>
  
  <div class="instructions">
    <p><strong>Használat:</strong> Kattints a "Módosítás" gombra, majd nyomd meg az új billentyűt.</p>
    <p><small>Megjegyzés: A gyorsbillentyűk Ctrl (Windows) vagy Cmd (Mac) billentyűvel kombinálva működnek.</small></p>
  </div>
  
  <button id="reset-shortcuts" class="reset-btn">Alapértelmezett beállítások visszaállítása</button>
</div>

<style>
.shortcut-remapping {
  max-width: 500px;
  margin: 20px;
  padding: 20px;
  border: 1px solid #ddd;
  border-radius: 8px;
  background-color: #f8f9fa;
}

.shortcut-list {
  margin: 20px 0;
}

.shortcut-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 12px;
  margin-bottom: 10px;
  background-color: white;
  border: 1px solid #e9ecef;
  border-radius: 4px;
}

.action-name {
  font-weight: 500;
  min-width: 100px;
}

.key-input-wrapper {
  display: flex;
  align-items: center;
  gap: 10px;
}

.key-input {
  width: 60px;
  padding: 6px;
  text-align: center;
  font-family: monospace;
  font-size: 16px;
  font-weight: bold;
  border: 2px solid #ced4da;
  border-radius: 4px;
  background-color: #f8f9fa;
}

.key-input:focus {
  outline: 2px solid #007bff;
  outline-offset: 2px;
  border-color: #007bff;
  background-color: #fff;
}

.key-input.recording {
  background-color: #fff3cd;
  border-color: #ffc107;
  animation: pulse 1s infinite;
}

@keyframes pulse {
  0% { opacity: 1; }
  50% { opacity: 0.7; }
  100% { opacity: 1; }
}

.change-btn {
  padding: 6px 12px;
  background-color: #007bff;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 14px;
}

.change-btn:hover {
  background-color: #0056b3;
}

.change-btn:focus {
  outline: 2px solid #80bdff;
  outline-offset: 2px;
}

.change-btn:disabled {
  background-color: #6c757d;
  cursor: not-allowed;
}

.instructions {
  margin: 20px 0;
  padding: 15px;
  background-color: #e7f3ff;
  border-radius: 4px;
  font-size: 14px;
}

.reset-btn {
  width: 100%;
  padding: 10px;
  background-color: #dc3545;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 14px;
}

.reset-btn:hover {
  background-color: #c82333;
}

.reset-btn:focus {
  outline: 2px solid #f5c6cb;
  outline-offset: 2px;
}
</style>

<script>
document.addEventListener('DOMContentLoaded', function() {
  // Alapértelmezett gyorsbillentyűk
  const defaultShortcuts = {
    save: 'S',
    copy: 'C',
    paste: 'V'
  };
  
  // Aktuális gyorsbillentyűk (localStorage-ból betöltve)
  let shortcuts = loadShortcuts();
  
  // UI elemek
  const changeButtons = document.querySelectorAll('.change-btn');
  const resetButton = document.getElementById('reset-shortcuts');
  
  let recordingAction = null;

  // Gyorsbillentyűk betöltése
  function loadShortcuts() {
    const saved = localStorage.getItem('customShortcuts');
    if (saved) {
      return JSON.parse(saved);
    }
    return { ...defaultShortcuts };
  }

  // Gyorsbillentyűk mentése
  function saveShortcuts() {
    localStorage.setItem('customShortcuts', JSON.stringify(shortcuts));
  }

  // UI frissítése
  function updateUI() {
    Object.keys(shortcuts).forEach(action => {
      const input = document.getElementById(`${action}-shortcut`);
      if (input) {
        input.value = shortcuts[action].toUpperCase();
      }
    });
  }

  // Módosítás gomb kezelő
  changeButtons.forEach(btn => {
    btn.addEventListener('click', function() {
      const action = this.getAttribute('data-action');
      startRecording(action);
    });
  });

  // Felvétel indítása
  function startRecording(action) {
    if (recordingAction) {
      stopRecording();
    }
    
    recordingAction = action;
    const input = document.getElementById(`${action}-shortcut`);
    const button = document.querySelector(`[data-action="${action}"]`);
    
    input.classList.add('recording');
    input.value = '...';
    button.textContent = 'Mégse';
    button.disabled = false;
    
    // Billentyű figyelő
    document.addEventListener('keydown', recordKey);
    
    // Mégse gomb
    button.onclick = () => stopRecording();
  }

  // Felvétel leállítása
  function stopRecording() {
    if (!recordingAction) return;
    
    const input = document.getElementById(`${recordingAction}-shortcut`);
    const button = document.querySelector(`[data-action="${recordingAction}"]`);
    
    input.classList.remove('recording');
    input.value = shortcuts[recordingAction].toUpperCase();
    button.textContent = 'Módosítás';
    button.onclick = () => startRecording(recordingAction);
    
    document.removeEventListener('keydown', recordKey);
    recordingAction = null;
  }

  // Billentyű rögzítése
  function recordKey(e) {
    e.preventDefault();
    
    // Csak betűk, számok és néhány speciális karakter engedélyezett
    const validKeys = /^[a-zA-Z0-9\-=\[\];',./\\`]$/;
    
    if (validKeys.test(e.key)) {
      // Ellenőrzés, hogy nincs-e már használatban
      const existingAction = Object.keys(shortcuts).find(
        action => shortcuts[action].toLowerCase() === e.key.toLowerCase() && action !== recordingAction
      );
      
      if (existingAction) {
        alert(`A(z) "${e.key.toUpperCase()}" billentyű már használatban van: ${existingAction}`);
        return;
      }
      
      // Új billentyű mentése
      shortcuts[recordingAction] = e.key.toUpperCase();
      saveShortcuts();
      stopRecording();
      updateUI();
      
      showNotification(`Gyorsbillentyű módosítva: ${e.key.toUpperCase()}`);
    } else if (e.key === 'Escape') {
      stopRecording();
    } else {
      alert('Érvénytelen billentyű. Használj betűket, számokat vagy alapvető írásjeleket.');
    }
  }

  // Alapértelmezett visszaállítása
  resetButton.addEventListener('click', function() {
    if (confirm('Biztosan visszaállítod az alapértelmezett gyorsbillentyűket?')) {
      shortcuts = { ...defaultShortcuts };
      saveShortcuts();
      updateUI();
      showNotification('Gyorsbillentyűk visszaállítva');
    }
  });

  // Értesítés megjelenítése
  function showNotification(message) {
    const notification = document.createElement('div');
    notification.textContent = message;
    notification.style.cssText = `
      position: fixed;
      top: 20px;
      right: 20px;
      background-color: #28a745;
      color: white;
      padding: 15px 20px;
      border-radius: 4px;
      box-shadow: 0 2px 5px rgba(0,0,0,0.2);
      z-index: 1000;
    `;
    document.body.appendChild(notification);
    
    setTimeout(() => {
      notification.remove();
    }, 3000);
  }

  // Globális gyorsbillentyű kezelő (példa)
  document.addEventListener('keydown', (e) => {
    // Csak Ctrl/Cmd kombináció esetén
    if (!e.ctrlKey && !e.metaKey) return;
    
    // Input mezőkben ne működjön
    if (['INPUT', 'TEXTAREA', 'SELECT'].includes(e.target.tagName)) return;
    
    const key = e.key.toUpperCase();
    
    Object.keys(shortcuts).forEach(action => {
      if (shortcuts[action] === key) {
        e.preventDefault();
        console.log(`${action} művelet végrehajtva`);
        showNotification(`${action} aktiválva`);
      }
    });
  });

  // Kezdeti UI frissítés
  updateUI();
});
</script>

Magyarázat: A felhasználók testreszabhatják a gyorsbillentyűket egy intuitív felületen keresztül. A beállítások localStorage-ban mentésre kerülnek, és a rendszer ellenőrzi az ütközéseket.

Rossz gyakorlatok

Globális gyorsbillentyűk letiltás/átképezés nélkül

<script>
// ROSSZ: Globális gyorsbillentyű kontroll nélkül
document.addEventListener('keydown', (e) => {
  // Egyetlen karakter, módosító nélkül
  if (e.key === 'a') {
    e.preventDefault();
    alert('A gyorsbillentyű aktiválva');
    // Probléma: Megzavarja a normál gépelést
  }
  
  if (e.key === 's') {
    e.preventDefault();
    document.querySelector('form').submit();
    // Probléma: Nem lehet kikapcsolni vagy módosítani
  }
  
  if (e.key === '/') {
    e.preventDefault();
    document.querySelector('#search').focus();
    // Probléma: Ütközhet más alkalmazásokkal
  }
});

// ROSSZ: Még input mezőkben is aktiválódik
document.addEventListener('keypress', (e) => {
  if (e.key === 'd') {
    deleteCurrentItem(); // Veszélyes!
  }
});
</script>

Probléma: A gyorsbillentyű bárhol aktiválódik, zavarja a gépelést vagy a kisegítő technológiákat. Nincs lehetőség kikapcsolni vagy módosítani.

Nincs felhasználói kontroll a gyorsbillentyűk felett

<script>
// ROSSZ: Keménykódolt gyorsbillentyűk
const SHORTCUTS = {
  'j': 'nextItem',
  'k': 'previousItem',
  'l': 'likeItem',
  'r': 'replyItem',
  'x': 'deleteItem'
};

document.addEventListener('keydown', (e) => {
  if (SHORTCUTS[e.key]) {
    e.preventDefault();
    executeAction(SHORTCUTS[e.key]);
    // Probléma: Felhasználó nem tudja megváltoztatni
    // Probléma: Nem lehet kikapcsolni
    // Probléma: Ütközhet képernyőolvasókkal
  }
});

function executeAction(action) {
  // Művelet végrehajtása
  console.log(`Végrehajtva: ${action}`);
}
</script>

Probléma: A felhasználók nem tudják letiltani vagy megváltoztatni az ütköző billentyűket. Ez különösen problémás lehet alternatív beviteli eszközök használata esetén.

Gyorsbillentyűk aktiválódnak fókusztól függetlenül

<div class="app-container">
  <input type="text" id="username" placeholder="Felhasználónév">
  <textarea id="message" placeholder="Írj üzenetet..."></textarea>
  <button id="send">Küldés</button>
</div>

<script>
// ROSSZ: Mindenhol aktiválódik, még szövegmezőkben is
document.addEventListener('keydown', (e) => {
  // Enter - küldés (probléma: többsoros szövegmezőben is)
  if (e.key === 'Enter') {
    e.preventDefault();
    document.getElementById('send').click();
  }
  
  // Escape - törlés (probléma: más dialógusokat is bezárhat)
  if (e.key === 'Escape') {
    e.preventDefault();
    clearAllFields();
  }
  
  // Betűk - gyorsműveletek (probléma: gépelés közben is)
  if (e.key === 'n') {
    e.preventDefault();
    createNewItem();
  }
});

function clearAllFields() {
  document.getElementById('username').value = '';
  document.getElementById('message').value = '';
}

function createNewItem() {
  console.log('Új elem létrehozva');
}
</script>

Probléma: A gyorsbillentyűk váratlan viselkedést és zavart okoznak azáltal, hogy akkor is aktiválódnak, amikor a felhasználó gépel vagy más interakciót végez.

Ütköző gyorsbillentyűk képernyőolvasókkal

<script>
// ROSSZ: Gyakori képernyőolvasó parancsokkal ütköző billentyűk
document.addEventListener('keydown', (e) => {
  // H - képernyőolvasókban címsorokra ugrik
  if (e.key === 'h') {
    e.preventDefault();
    showHelp(); // Ütközik!
  }
  
  // K - NVDA-ban link lista
  if (e.key === 'k') {
    e.preventDefault();
    showKeyboardShortcuts(); // Ütközik!
  }
  
  // F - képernyőolvasókban űrlap mezőkre ugrik
  if (e.key === 'f') {
    e.preventDefault();
    focusSearchField(); // Ütközik!
  }
});
</script>

Probléma: Ezek a billentyűk fontos navigációs funkciókhoz vannak rendelve a képernyőolvasókban. Az ilyen ütközések használhatatlanná tehetik az oldalt a képernyőolvasó felhasználók számára.

Dokumentálatlan és felfedezhetetlen gyorsbillentyűk

<!-- ROSSZ: Nincs információ a gyorsbillentyűkről -->
<div class="app">
  <h1>Alkalmazás</h1>
  <!-- Sehol sincs említve, hogy vannak gyorsbillentyűk -->
</div>

<script>
// ROSSZ: Rejtett gyorsbillentyűk
document.addEventListener('keydown', (e) => {
  // Felhasználó nem tudja, hogy ezek léteznek
  switch(e.key) {
    case '?':
      // Nincs jelezve, hogy létezik súgó
      showHiddenHelp();
      break;
    case 'g':
      // Nincs jelezve, hogy van gyors navigáció
      if (e.shiftKey) {
        goToTop();
      }
      break;
    case '.':
      // Nincs jelezve, hogy van beállítás menü
      openSettings();
      break;
  }
});

// Nincs UI elem, ami jelezné ezeket a funkciókat
</script>

Probléma: A felhasználók nem tudják, hogy léteznek gyorsbillentyűk, és véletlenül aktiválhatják őket. Nincs mód a felfedezésükre vagy a súgó elérésére.

Források

Iratkozz fel hírlevelünkre!

Amennyiben szeretnél első kézből értesülni az új bejegyzésekről, iratkozz fel hírlevelünkre!

Ez a weboldal sütiket használ a böngészési élmény javítása és a webhely megfelelő működésének biztosítása érdekében. A webhely használatának folytatásával elismeri és elfogadja a sütik használatát.

Összes elfogadása Csak a szükségesek elfogadása