JS / jQuery'de ok tuşlarını bağlama


418

Javascript ve / veya jQuery'de bir işlevi sol ve sağ ok tuşlarına bağlama hakkında nasıl bilgi verebilirim? JQuery için js-hotkey eklentisine baktım (belirli tuşları tanımak için bir argüman eklemek için yerleşik bağlama işlevini sarar), ancak ok tuşlarını desteklemiyor gibi görünüyor.


Yanıtlar:


541
document.onkeydown = function(e) {
    switch(e.which) {
        case 37: // left
        break;

        case 38: // up
        break;

        case 39: // right
        break;

        case 40: // down
        break;

        default: return; // exit this handler for other keys
    }
    e.preventDefault(); // prevent the default action (scroll / move caret)
};

IE8'i desteklemeniz gerekiyorsa, işlev gövdesini olarak başlatın e = e || window.event; switch(e.which || e.keyCode) {.


(düzenleme 2020)
Not KeyboardEvent.whichartık uygun bulunmamaktadır. Ok tuşlarını algılamak için daha modern bir çözüm için bu örneğeKeyboardEvent.key bakın .


28
En iyi cevap. Kullanımları e.whichjQuery gibi kullanır, çapraz tarayıcı için tavsiye e.preventDefault()yerine return false( return falsebir jQuery olay işleyicisi tetikleyiciler hem e.preventDefault()ve e.stopPropagation()etkinliğin kendileri yayılmaz beri herhangi sonradan eklenen olaylar başarısız olmasına neden oluyor ikinci olan,) ve en anahtarın sonunda, diğer anahtar kullanımını engellememek için arananlardan başka bir anahtar varsa arama yapmadan geri döner e.preventDefault()ve bunun yerine $.ui.keyCode.DOWNsayılarla karşılaştırır (ÇOK daha hızlı).
Jimbo Jonny

2
Nathan: Görünüşe göre tüm anahtar kodları tarayıcılar arasında tutarlı değil, ancak ok tuşları bunlardan bazıları. Buraya bakın: stackoverflow.com/questions/5603195/…
Sygmoral

1
@MichaelScheper - 1) değişkenler! = Sabitler, değiştirilmeleri amaçlanıp amaçlanmadığına bakılmaksızın ... ES6 sabitleri jQuery sabitleri kullanabilecek kadar açık olana kadar motorun hala değişkenler gibi davranması gerekir 2) sayılar yanlarında tam olarak ne olduklarını söyleyen bir yorum olduğunda gerçekten sihirli sayılar ve 3) ... devam
Jimbo Jonny

2
... 3) erişirken $.ui.keyCode.DOWNaradığınız $bu bulgu bir seviye yukarı gidiş ... arayan, sizin sözcüksel kapsamına girmeyen $küresel kapsamda kadar tekrarı, küresel üzerinde bulabilirsiniz window, erişim $, erişim penceresinde uiüzerinde window.$erişime, keyCodeüzerinde window.$.ui, erişim DOWNüzerinde window.$.ui.keyCodekarşılaştırmak istediğiniz ilkel değeri elde etmek için, daha sonra karşılaştırarak gerçek yapmak. Bu hızın sizin için önemli olup olmadığı kişisel bir karardır, sadece ilkel yazabildiğim / yorumlayabildiğim bir durum olduğunda 4 erişim seviyesinden kaçınma eğilimim var.
Jimbo Jonny

1
@NathanArthur Klavye tuş kodlarını test etmek için iki iyi çevrimiçi araç buldum: keycode.info asquare.net/javascript/tests/KeyCode.html unixpapa.com/js/key.html
Riccardo Volpe

451
$(document).keydown(function(e){
    if (e.which == 37) { 
       alert("left pressed");
       return false;
    }
});

Karakter kodları:

37 - sol

38 - üstü

39 - sağ

40 - aşağı


4
Geri dönüşün bir amacı var mı?
Alex S

19
Daha fazla tuş vuruşu olayının vurulmasını durdurur.
s_hewitt

9
Gölge: hayır, o, tuşa basma olayının diğer DOM öğelerine ateş etmesini durdurduğu anlamına geliyor
JasonWoof

3
39 hariç kesme işareti de var, değil mi?
Paul D.Waite

25
JQuery kullanırken , daha fazla tarayıcı desteği e.whichyerine kullanın e.keyCode. Aşağıdaki yorumuma bakın.
Sygmoral

108

Ok tuşlarının keyCode'unu kullanabilirsiniz (sol, yukarı, sağ ve aşağı için 37, 38, 39 ve 40):

$('.selector').keydown(function (e) {
  var arrow = { left: 37, up: 38, right: 39, down: 40 };

  switch (e.which) {
    case arrow.left:
      //..
      break;
    case arrow.up:
      //..
      break;
    case arrow.right:
      //..
      break;
    case arrow.down:
      //..
      break;
  }
});

Yukarıdaki örneği buradan kontrol edin .


1
|| 'yı kullandığınızdan emin değilim 2. satırda sıfır veya sıfır olmayan uygulama dışında bir değer spesifik değil ve garanti edilmiyor mu? Daha çok benzer bir şey kullanırdım: var keyCode = (e.keyCode? E.keyCode: e.which); Olgulara okunabilir adlar vermek için ok nesnesinin kullanımı için +1.
Mnebuerquo

6
JQuery kullanıyorsanız, e.which için test yapmanız gerekmez: The event.which property normalizes event.keyCode and event.charCode- api.jquery.com/event.which
JCM

Bir masaya önemli bir olay dinleyicisi koymaya çalışıyorum, ama işe yaramaz. Önemli olay dinleyicilerini destekleyen sınırlı sayıda seçici türü var mı?
Arman Bimatov

23

Bu biraz geç, ancak HotKeys, bir öğeye birden fazla kısayol tuşu eklerseniz olayların birden çok kez yürütülmesine neden olan çok büyük bir hataya sahiptir. Sadece düz jQuery kullanın.

$(element).keydown(function(ev) {
    if(ev.which == $.ui.keyCode.DOWN) {
        // your code
        ev.preventDefault();
    }
});

2
Ui anahtar kodu nesnesini kullanmak için +1. Anlamak çok daha kolay 37, 38, 39 veya 40. jQuery belgeleri açıkça tarayıcı farklılıklarını hesaba katmak için e.which belirtiyorsa, en iyi yanıtın neden e.keyCode kullandığından emin değilim. Umarım bu cevap doğru yapmak için daha fazla tanınırlık kazanır.
Hiçbiri

2
Her tuşa basıldığında $ .ui.keyCode.DOWN komutunun kullanılması, sayıyı kullanmaktan çok daha yavaştır. Özellikle herhangi bir tuşa her basıldığında çalıştırılması gerektiğinden, netlikle ilgili bir yorum ekleyin.
Jimbo Jonny

16

Diğer cevapların en iyi bitlerini birleştirdim:

$(document).keydown(function(e){
    switch(e.which) {
        case $.ui.keyCode.LEFT:
        // your code here
        break;

        case $.ui.keyCode.UP:
        // your code here
        break;

        case $.ui.keyCode.RIGHT:
        // your code here
        break;

        case $.ui.keyCode.DOWN:
        // your code here
        break;

        default: return; // allow other keys to be handled
    }

    // prevent default action (eg. page moving up/down)
    // but consider accessibility (eg. user may want to use keys to choose a radio button)
    e.preventDefault();
});

1
"Ui" nereden geliyor? "TypeError: $ .ui tanımsız" alma EDIT - JQuery UI eksikti. Yüklendi - artık hata yok.
bir kodlayıcı

3
Görünüşe göre bu numaraya sahip olması gereken jQuery UI kullanıyor. Sadece bunun için jQuery UI içermezdim, btw.
Jethro Larson

14

KeyboardJS'yi kullanabilirsiniz. Kütüphaneyi böyle işler için yazdım.

KeyboardJS.on('up', function() { console.log('up'); });
KeyboardJS.on('down', function() { console.log('down'); });
KeyboardJS.on('left', function() { console.log('right'); });
KeyboardJS.on('right', function() { console.log('left'); });

Kütüphaneye buradan göz atın => http://robertwhurst.github.com/KeyboardJS/


14

Düz Javascript kullanan kısa bir çözüm (önerilen iyileştirmeler için Sygmoral sayesinde):

document.onkeydown = function(e) {
    switch (e.keyCode) {
        case 37:
            alert('left');
            break;
        case 39:
            alert('right');
            break;
    }
};

Ayrıca bkz. Https://stackoverflow.com/a/17929007/1397061 .


Muhtemelen ayrıca bağlayıcı değerdocument.addEventListener('keydown', myFunction);
nathanbirrell

9

JQuery.HotKeys'in ok tuşlarını desteklemediğinden emin misiniz? Daha önce demolarıyla uğraştım ve IE7, Firefox 3.5.2 ve Google Chrome 2.0.172'de test ettiğimde sol, sağ, yukarı ve aşağı çalışırken gözlemledim ...

EDIT : Görünüşe göre jquery.hotkeys Github'a taşındı: https://github.com/jeresig/jquery.hotkeys


Başka bir kütüphaneye dayandığını söylediği yeri okuyordum ve desteklenen anahtarlar listesinin hala uygulandığını varsayıyordum.
Alex S


4

Sağa veya sola giden saf js örneği

        window.addEventListener('keydown', function (e) {
            // go to the right
            if (e.keyCode == 39) {

            }
            // go to the left
            if (e.keyCode == 37) {

            }
        });

3

JQuery bağlama kullanabilirsiniz:

$(window).bind('keydown', function(e){
    if (e.keyCode == 37) {
        console.log('left');
    } else if (e.keyCode == 38) {
        console.log('up');
    } else if (e.keyCode == 39) {
        console.log('right');
    } else if (e.keyCode == 40) {
        console.log('down');
    }
});

2

Bir tuşunun arrow keybasılı olup olmadığını kontrol edebilirsiniz :

$(document).keydown(function(e){
    if (e.keyCode > 36 && e.keyCode < 41) { 
       alert( "arrowkey pressed" );
       return false;
    }
});

0

ok sadece başka herhangi bir nesne için kullanılabilir önlemek SEÇ, iyi aslında ben başka bir nesne LOL tes yok. ancak sayfadaki ok olayını ve giriş türünü durdurabilir.

zaten "kepress" "keydown" ve "keyup" olayında "e.preventDefault ()" veya "return false" kullanarak SELECT nesnesinin değerini değiştirmek için sol ve sağ oku engellemeye çalışıyorum ama yine de nesne değerini değiştiriyor. ancak olay hala okun basılı olduğunu söylüyor.


0

Girilen klavye girişini ve tuş kombinasyonlarını yakalamak için sağlam bir Javascript kütüphanesi. Bağımlılığı yoktur.

http://jaywcjlove.github.io/hotkeys/

hotkeys('right,left,up,down', function(e, handler){
    switch(handler.key){
        case "right":console.log('right');break
        case "left":console.log('left');break
        case "up":console.log('up');break
        case "down":console.log('down');break
    }
});

0

Buraya, kullanıcının bir girişe odaklandığında sayısal bir girişi + 1 veya -1 yapmak için ok tuşlarını kullanmasına izin vermek için basit bir yol aramaya geldim. Asla iyi bir cevap bulamadım ama harika çalışıyor gibi görünen aşağıdaki kodu yaptı - şimdi bu site çapında yapma.

$("input").bind('keydown', function (e) {
    if(e.keyCode == 40 && $.isNumeric($(this).val()) ) {
        $(this).val(parseFloat($(this).val())-1.0);
    } else if(e.keyCode == 38  && $.isNumeric($(this).val()) ) { 
        $(this).val(parseFloat($(this).val())+1.0);
    }
}); 

-1

Kahve ve Jquery ile

  $(document).on 'keydown', (e) ->
    switch e.which
      when 37 then console.log('left key')
      when 38 then console.log('up key')
      when 39 then console.log('right key')
      when 40 then console.log('down key')
    e.preventDefault()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.