Przechwytywanie kombinacji klawiszy ctrl + z w javascript

85

Próbuję przechwycić kombinację klawiszy ctrl+ zw javascript za pomocą tego kodu:

<html>
<head>
    <title>Untitled Document</title>
</head>
<body>

    <script type='text/javascript'>
        function KeyPress(e) {
            var evtobj = window.event? event : e


            //test1 if (evtobj.ctrlKey) alert("Ctrl");
            //test2 if (evtobj.keyCode == 122) alert("z");
            //test 1 & 2
            if (evtobj.keyCode == 122 && evtobj.ctrlKey) alert("Ctrl+z");
        }

        document.onkeypress = KeyPress;
    </script>

</body>
</html>

Skomentowana linia „test1” generuje alert, jeśli przytrzymam ctrlklawisz i naciśnę dowolny inny klawisz.

Skomentowana linia „test2” generuje alert, jeśli naciśnę zklawisz.

Połącz je zgodnie z linią po „teście 1 i 2”, a przytrzymanie ctrlklawisza, a następnie naciśnięcie zklawisza nie generuje powiadomienia zgodnie z oczekiwaniami.

Co jest nie tak z kodem?

Paul Johnston
źródło

Odpowiedzi:

95
  1. Użyj onkeydown(lub onkeyup), nieonkeypress
  2. Użyj keyCode90, a nie 122

Demo online: http://jsfiddle.net/29sVC/

Aby wyjaśnić, kody klawiszy to nie to samo, co kody znaków.

Kody znaków dotyczą tekstu (różnią się w zależności od kodowania, ale w wielu przypadkach 0-127 pozostają kodami ASCII). Kody klawiszy odpowiadają klawiszom na klawiaturze. Na przykład znak Unicode 0x22909 oznacza 好. Nie ma wielu klawiatur (jeśli w ogóle), które faktycznie mają do tego klucz.

System operacyjny zajmuje się przekształcaniem naciśnięć klawiszy na kody znaków przy użyciu metod wprowadzania skonfigurowanych przez użytkownika. Wyniki są wysyłane do zdarzenia keypress. (Podczas gdy naciśnięcie klawisza i naciśnięcie klawisza reagują na naciskanie przycisków przez użytkownika, a nie na wpisywanie tekstu).

zerkms
źródło
1
Dzięki, to działa. Dlaczego nie działa onkeypress i keyCode 122?
Paul Johnston,
Jak w swoim rozwiązaniu nie ostrzegać () zamiast ostrzeżenia? Testuję pod kątem Ctrl + t.
Surendra Jnawali
@SJnawali: Nie jestem pewien, czy to możliwectrl+t
zerkms Kwietnia
4
dlaczego keyCode 122 nie działa? no cóż, 122jest dla klawisza F11 :)
Baby,
7
@PaulJohnston Ponieważ kod klucza to nie to samo, co kod znaku . Kody znaków dotyczą tekstu (różnią się w zależności od kodowania, ale w wielu przypadkach 0-127 pozostają kodami ASCII). Kody klawiszy odpowiadają klawiszom na klawiaturze. Na przykład znak Unicode 0x22909 oznacza 好. Nie ma wielu klawiatur (jeśli w ogóle), które faktycznie mają do tego klucz. System operacyjny zajmuje się przekształcaniem naciśnięć klawiszy na kody znaków przy użyciu metod wprowadzania skonfigurowanych przez użytkownika. Wyniki są wysyłane na keypresswydarzenie. (Natomiast keydowni keyup
reaguj
28

Dla przyszłych ludzi, którzy natkną się na to pytanie, oto lepsza metoda wykonania zadania:

document.addEventListener('keydown', function(event) {
  if (event.ctrlKey && event.key === 'z') {
    alert('Undo!');
  }
});

Używanie event.keyznacznie upraszcza kod, usuwając zakodowane stałe. Obsługuje IE 9+.

Dodatkowo użycie document.addEventListeneroznacza, że ​​nie będziesz przesyłać innych słuchaczy do tego samego zdarzenia.

Wreszcie nie ma powodu, aby używać window.event. Jest to aktywnie odradzane i może skutkować delikatnym kodem.

lazd
źródło
Ponadto chciałbym dodać, że KeyboardEvent.keyCodeod kilku lat jest to przestarzałe. Najlepszym sposobem na przechwycenie wszystkich przeglądarek jest e.keynajpierw sprawdzenie, a następnie powrót do e.keyCode. Lub możesz użyć tego polyfillu
Tak Barry
9

Ctrl+ tjest również możliwe ... po prostu użyj kodu dostępu jako 84 jak

if (evtobj.ctrlKey && evtobj.keyCode == 84) 
 alert("Ctrl+t");
chandramouli.jamadagni
źródło
6
$(document).keydown(function(e){
  if( e.which === 89 && e.ctrlKey ){
     alert('control + y'); 
  }
  else if( e.which === 90 && e.ctrlKey ){
     alert('control + z'); 
  }          
});

Próbny

Mehtab
źródło
3

90 jest Zkluczem, a to zrobi niezbędne przechwytywanie ...

function KeyPress(e){
     // Ensure event is not null
     e = e || window.event;

     if ((e.which == 90 || e.keyCode == 90) && e.ctrlKey) {
         // Ctrl + Z
         // Do Something
     }
}

W zależności od wymagań możesz chcieć dodać e.preventDefault();w swoim oświadczeniu if, aby wyłącznie wykonywać swoją niestandardową funkcjonalność.

JDandChips
źródło
-3

Ta wtyczka stworzona przeze mnie może być pomocna.

Podłącz

Możesz użyć tej wtyczki, musisz podać kluczowe kody i funkcje, aby działać w ten sposób

simulatorControl([17,90], function(){console.log('You have pressed Ctrl+Z');});

W kodzie pokazałem jak wykonać dla Ctrl+ Z. Otrzymasz szczegółową dokumentację pod linkiem. Wtyczka znajduje się w sekcji kodu JavaScript Mojego pióra na Codepen.

10011101111
źródło
-5

Użyj tego kodu dla CTRL+ Z. keycode dlaZ naciśnięcia klawisza to 122, a CTRL+ Zto 26. Sprawdź ten kod w obszarze konsoli

 $(document).on("keypress", function(e) {
       console.log(e.keyCode);
       /*ctrl+z*/
       if(e.keyCode==26)
       {
          //your code here
       }
    });
karthikeyan ganesan
źródło