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?

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).


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.


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");

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


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ść.


-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.


-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
       }
    });
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.