jQuery Olay Tuşuna Basma: Hangi tuşa basıldı?


706

JQuery ile, keypress olayına bağlandığımda hangi tuşa basıldığını nasıl öğrenebilirim?

$('#searchbox input').bind('keypress', function(e) {});

ENTERBasıldığında bir gönderimi tetiklemek istiyorum .

[Güncelleme]

Kendim (veya daha iyisi: bir) cevabı bulduğum halde, varyasyon için bir yer var gibi görünüyor;)

Arasında bir fark var mı keyCodeve which- Sadece arıyorum özellikle ENTERunicode anahtarı asla, hangi?

Bazı tarayıcılar bir mülk, diğerleri ise diğer mülkleri sağlıyor mu?


295
** Bunu Google'dan (benim yaptığım gibi) herkes yaptıysa, "keypress" yerine "keyup" in Firefox, IE ve Chrome'da çalıştığını bilin. "keypress" görünüşe göre sadece Firefox'ta çalışıyor.
Tyler

17
Ayrıca, tuşa basıldıktan SONRA bir olayı tetiklemek için "tuşlar" daha iyi çalışır (açıkçası), ancak bir metin alanı boşsa İKİNCİ arka alanda bir olayı tetiklemek istiyorsanız, bu çok önemlidir
Tyler

12
E.keyCode VS e.which için ... Testlerimden Chrome ve IE8: keypress () işleyicisi yalnızca normal karakterler (yani Yukarı / Aşağı / Ctrl için değil) ve hem e.keyCode hem de e. ASCII kodunu döndürür. Ancak Firefox'ta tüm tuşlar keypress (), AMA: normal karakterler için ASCII kodunu döndürecek ve e.keyCode 0 döndürecek ve özel karakterler için (örn. Yukarı / Aşağı / Ctrl) e.keyCode dönecektir klavye kodu ve e. 0 döndürecek. Ne kadar eğlenceli.
jackocnr

4
Uyarı: Google kodundaki kodu KULLANMAYIN. Jquery'nin yazarı sadece github deposunda (ve John Resig'in çatalı) bir yama sundu : github.com/tzuryby/jquery.hotkeys . Google kodundaki kod, aynı dom düğümüne birden fazla anahtar olay bağlandığında yanlış davranır. Yeni olan çözer.
Daniel Ribeiro

4
Örneğin bir tuşa uzun süre bastığınızda "keyup" çok geç tetiklenir. Buraya bakın jsbin.com/aquxit/3/edit böylece tuş takımı gitmek için bir yol
Toskan

Yanıtlar:


844

Aslında bu daha iyi:

 var code = e.keyCode || e.which;
 if(code == 13) { //Enter keycode
   //Do something
 }

84
if ((e.keyCode || e.which) == 13)? ;)
Kezzer

49
Bu sayfadaki bir açıklamaya göre, jQuery her seferinde olay nesnesinde 'hangisinin' tanımlanacağı şekilde normalleşir. Bu nedenle, 'keyCode'u kontrol etmek gereksizdir.
Ztyx

197
Neden muazzam bir artış var? Soru, bu şeyleri normalleştiren jQuery hakkındadır, bu nedenle hangi etkinliği kullanırsanız kullanın, başka bir şey kullanmanıza gerek yokture.which .
Tim Down

48
@Tim: Ne yazık ki, bunu api.jquery.com/keypress kullanarak Firefox ile test ettim : <Sekme> tuşuna bastığımdae.which ayarlanmadı (kalıyor 0), ancak e.keyCode( 9). Bunun neden önemli olduğu stackoverflow.com/questions/4793233/… adresine bakın .
Marcel Korpel

3
@Marcel: Evet, jQuery'nin anahtar yönetiminin eksiklikleri var ve bu talihsiz bir örnek, ancak Enter tuşu için, bu sorunun sorduğu şey, durum son derece basit.
Tim Down

133

Bunu dene

$('#searchbox input').bind('keypress', function(e) {
    if(e.keyCode==13){
        // Enter pressed... do anything here...
    }
});

5
@VladimirPrudnikov Oh, oh, Ahhhh! Ahh! bu bağlantıda mac'in her yerinde vardı - insanlık !!!
Ben DeMott

1
Peki, biz de Windows uygulaması ile yeni bir sürüm başlattı .. check out snippets.me
Vladimir Prudnikov

2
@VladimirPrudnikov Linux sürümüne ne dersiniz?
Arda

@Arda linux sürümü için planımız yok. Bir web uygulaması ve genel bir API olacak, bu yüzden birisi oluşturacak :)
Vladimir Prudnikov

1
Ha ha ha, linux için planları olmayan bir geliştirici aracı. Zengin!
Ziggy

61

JQuery UI kullanıyorsanız, ortak anahtar kodları için çevirileriniz vardır. Gelen ui / ui / ui.core.js :

$.ui.keyCode = { 
    ...
    ENTER: 13, 
    ...
};

Testler / simulate / jquery.simulate.js'de bazı çeviriler de var, ancak çekirdek JS kütüphanesinde bulamadım. Dikkat et, ben sadece kaynakları gittim. Belki de bu sihirli sayılardan kurtulmanın başka bir yolu var.

String.charCodeAt ve .fromCharCode öğelerini de kullanabilirsiniz:

>>> String.charCodeAt('\r') == 13
true
>>> String.fromCharCode(13) == '\r'
true

13
Düzeltme * $. Ui.keyCode.ENTER ** değil * $. KeyCode.ENTER - ipucu için thx olsa bir cazibe gibi çalışır!
daniellmb

Uncaught TypeError: String.charCodeAt is not a function Bence demek istedin '\r'.charCodeAt(0) == 13
Patrick Roberts

39

JQuery kullandığınız göz önüne alındığında, kesinlikle .which kullanmalısınız. Evet, farklı tarayıcılar farklı özellikler ayarlar, ancak jQuery bunları normalleştirir ve her durumda .which değerini ayarlar. Http://api.jquery.com/keydown/ adresindeki belgelere bakın :

Hangi tuşa basıldığını belirlemek için, işleyici işlevine iletilen olay nesnesini inceleyebiliriz. Tarayıcılar bu bilgileri saklamak için farklı özellikler kullanırken, jQuery .which özelliğini normalleştirir, böylece anahtar kodunu almak için güvenilir bir şekilde kullanabiliriz.


2
Event.which kullanarak ve $ .ui.keyCode ile karşılaştırmaya çalışırken gördüklerimden belirsiz davranışlar ortaya çıkıyor. Özellikle $ .ui.keyCode.NUMPAD_ENTER ile eşleşen küçük harf [L] tuşu. Şirin.
Danny

4
Bu hatayı gösteren bir repro var mı? Bunu, çalışmalarını yeniden uygulamaya çalışmak yerine jQuery sahiplerine rapor etmek tercih edilir.
Frank Schwieterman

31

... bu örnek form gönderilmesini önler (tuş vuruşu # 13'ü yakalarken düzenli olarak temel niyet):

$('input#search').keypress(function(e) {
  if (e.which == '13') {
     e.preventDefault();
     doSomethingWith(this.value);
   }
});

28

edit: Bu sadece IE için çalışıyor ...

Bunun eski bir gönderi olduğunu anlıyorum, ancak birisi bunu faydalı bulabilir.

Anahtar olaylar eşlenir, bu nedenle anahtar kodu değerini kullanmak yerine anahtar değerini biraz daha okunabilir hale getirmek için de kullanabilirsiniz.

$(document).ready( function() {
    $('#searchbox input').keydown(function(e)
    {
     setTimeout(function ()
     { 
       //rather than using keyup, you can use keydown to capture 
       //the input as it's being typed.
       //You may need to use a timeout in order to allow the input to be updated
     }, 5);
    }); 
    if(e.key == "Enter")
    {
       //Enter key was pressed, do stuff
    }else if(e.key == "Spacebar")
    {
       //Spacebar was pressed, do stuff
    }
});

İşte bu blogdan aldığım eşlenmiş anahtarları içeren bir hile sayfası resim açıklamasını buraya girin


5
e.keyMülk yok .
SLaks

3
Hmm, IE'ye özgü bir özellik gibi görünüyor. IE'deki uygulamam için çalışıyor ancak Chrome'da çalışmıyor. Sanırım anahtar kodu kullanıyorum.
Kevin

28
 // in jquery source code...
 if (!event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode)) {
     event.which = event.charCode || event.keyCode;
 }

 // So you have just to use
 $('#searchbox input').bind('keypress', function(e) {
     if (e.which === 13) {
         alert('ENTER WAS PRESSED');
     }
 });

1
Gerçek cevap bu. Kabul edilen, bazı anahtarlar için (enter gibi) çalışacak, ancak diğerleri için başarısız olacaktır (a ile karıştırılacak supr gibi).
Oscar Foley

19
Bu, jQuery kaynağından gelen doğrudan bir yapıştırmadır ve jQuery'nin .which olay özelliğini normalleştirmek için kullandığı koddur.
Ian Clelland

@Ian Clelland: Senin fikrini anlayamıyorum, bu doğru çalışıyor mu değil mi? lol
Luca Filosofi

13
Çalışıyor; Eminim, çünkü jQuery tam olarak bu kodu kullanır :) Zaten jQuery varsa, o zaman sadece kullanın - kendi kodunda bu gerekmez.
Ian Clelland

1
@aSeptik: Soru "Ben jQuery var; anahtarı nasıl basılı tutulur" oldu - cevabınız jQuery'nin ilk etapta nasıl aldığını gösteriyor. Benim açımdan, jQuery zaten bu kod satırını içerdiğinden, ona ihtiyaç duymadığıydı. Sadece kullanabilir event.which.
Ian Clelland


14
$(document).ready(function(){
    $("#btnSubmit").bind("click",function(){$('#'+'<%=btnUpload.ClientID %>').trigger("click");return false;});
    $("body, input, textarea").keypress(function(e){
        if(e.which==13) $("#btnSubmit").click();
    });
});

Umarım bu size yardımcı olabilir !!!


12

Bu neredeyse keyCodes'un tam listesi:

3: "break",
8: "backspace / delete",
9: "tab",
12: 'clear',
13: "enter",
16: "shift",
17: "ctrl",
18: "alt",
19: "pause/break",
20: "caps lock",
27: "escape",
28: "conversion",
29: "non-conversion",
32: "spacebar",
33: "page up",
34: "page down",
35: "end",
36: "home ",
37: "left arrow ",
38: "up arrow ",
39: "right arrow",
40: "down arrow ",
41: "select",
42: "print",
43: "execute",
44: "Print Screen",
45: "insert ",
46: "delete",
48: "0",
49: "1",
50: "2",
51: "3",
52: "4",
53: "5",
54: "6",
55: "7",
56: "8",
57: "9",
58: ":",
59: "semicolon (firefox), equals",
60: "<",
61: "equals (firefox)",
63: "ß",
64: "@ (firefox)",
65: "a",
66: "b",
67: "c",
68: "d",
69: "e",
70: "f",
71: "g",
72: "h",
73: "i",
74: "j",
75: "k",
76: "l",
77: "m",
78: "n",
79: "o",
80: "p",
81: "q",
82: "r",
83: "s",
84: "t",
85: "u",
86: "v",
87: "w",
88: "x",
89: "y",
90: "z",
91: "Windows Key / Left ⌘ / Chromebook Search key",
92: "right window key ",
93: "Windows Menu / Right ⌘",
96: "numpad 0 ",
97: "numpad 1 ",
98: "numpad 2 ",
99: "numpad 3 ",
100: "numpad 4 ",
101: "numpad 5 ",
102: "numpad 6 ",
103: "numpad 7 ",
104: "numpad 8 ",
105: "numpad 9 ",
106: "multiply ",
107: "add",
108: "numpad period (firefox)",
109: "subtract ",
110: "decimal point",
111: "divide ",
112: "f1 ",
113: "f2 ",
114: "f3 ",
115: "f4 ",
116: "f5 ",
117: "f6 ",
118: "f7 ",
119: "f8 ",
120: "f9 ",
121: "f10",
122: "f11",
123: "f12",
124: "f13",
125: "f14",
126: "f15",
127: "f16",
128: "f17",
129: "f18",
130: "f19",
131: "f20",
132: "f21",
133: "f22",
134: "f23",
135: "f24",
144: "num lock ",
145: "scroll lock",
160: "^",
161: '!',
163: "#",
164: '$',
165: 'ù',
166: "page backward",
167: "page forward",
169: "closing paren (AZERTY)",
170: '*',
171: "~ + * key",
173: "minus (firefox), mute/unmute",
174: "decrease volume level",
175: "increase volume level",
176: "next",
177: "previous",
178: "stop",
179: "play/pause",
180: "e-mail",
181: "mute/unmute (firefox)",
182: "decrease volume level (firefox)",
183: "increase volume level (firefox)",
186: "semi-colon / ñ",
187: "equal sign ",
188: "comma",
189: "dash ",
190: "period ",
191: "forward slash / ç",
192: "grave accent / ñ / æ",
193: "?, / or °",
194: "numpad period (chrome)",
219: "open bracket ",
220: "back slash ",
221: "close bracket / å",
222: "single quote / ø",
223: "`",
224: "left or right ⌘ key (firefox)",
225: "altgr",
226: "< /git >",
230: "GNOME Compose Key",
231: "ç",
233: "XF86Forward",
234: "XF86Back",
240: "alphanumeric",
242: "hiragana/katakana",
243: "half-width/full-width",
244: "kanji",
255: "toggle touchpad"



5

Çözüm kodunu bu satırla tamamlayacağım e.preventDefault();. Formun giriş alanı durumunda, enter tuşuna basıldığında göndermeye katılmayız

var code = (e.keyCode ? e.keyCode : e.which);
 if(code == 13) { //Enter keycode
   e.preventDefault();
   //Do something
 }

4

Gizli gönderme ekleyin, gizli yazın, sadece style = "display: none" ile düz gönderin. İşte bir örnek (koddan gereksiz öznitelikler kaldırıldı).

<form>
  <input type="text">
  <input type="submit" style="display:none">
</form>

enter anahtarını yerel olarak kabul edecektir, JavaScript'e gerek yoktur, her tarayıcıda çalışır.


4

Burada, basılan enter tuşunu işleyecek bir jquery uzantısı var.

(function ($) {
    $.prototype.enterPressed = function (fn) {
        $(this).keyup(function (e) {
            if ((e.keyCode || e.which) == 13) {
                fn();
            }
        });
    };
}(jQuery || {}));

$("#myInput").enterPressed(function() {
    //do something
});

Çalışan bir örnek burada bulunabilir http://jsfiddle.net/EnjB3/8/


4

Cadı;)

/*
This code is for example. In real life you have plugins like :
https://code.google.com/p/jquery-utils/wiki/JqueryUtils
https://github.com/jeresig/jquery.hotkeys/blob/master/jquery.hotkeys.js
https://github.com/madrobby/keymaster
http://dmauro.github.io/Keypress/

http://api.jquery.com/keydown/
http://api.jquery.com/keypress/
*/

var event2key = {'97':'a', '98':'b', '99':'c', '100':'d', '101':'e', '102':'f', '103':'g', '104':'h', '105':'i', '106':'j', '107':'k', '108':'l', '109':'m', '110':'n', '111':'o', '112':'p', '113':'q', '114':'r', '115':'s', '116':'t', '117':'u', '118':'v', '119':'w', '120':'x', '121':'y', '122':'z', '37':'left', '39':'right', '38':'up', '40':'down', '13':'enter'};

var documentKeys = function(event) {
    console.log(event.type, event.which, event.keyCode);

    var keycode = event.which || event.keyCode; // par exemple : 112
    var myKey = event2key[keycode]; // par exemple : 'p'

    switch (myKey) {
        case 'a':
            $('div').css({
                left: '+=50'
            });
            break;
        case 'z':
            $('div').css({
                left: '-=50'
            });
            break;
        default:
            //console.log('keycode', keycode);
    }
};

$(document).on('keydown keyup keypress', documentKeys);

Demo: http://jsfiddle.net/molokoloco/hgXyq/24/


4

Kullanın event.keyve modern JS!

Artık sayı kodu yok. Anahtarı doğrudan kontrol edebilirsiniz. Örneğin "Enter", "LeftArrow", "r"ya da "R".

const input = document.getElementById("searchbox");
input.addEventListener("keypress", function onEvent(event) {
    if (event.key === "Enter") {
        // Submit
    }
    else if (event.key === "Q") {
        // Play quacking duck sound, maybe...
    }
});

Mozilla Belgeleri

Desteklenen Tarayıcılar


3
$(document).bind('keypress', function (e) {
    console.log(e.which);  //or alert(e.which);

});

Konsolda bir sonuç görmek için firbug'a sahip olmalısınız


3

Bazı tarayıcılarda keyCode kullanılırken, diğerleri hangisini kullanır. JQuery kullanıyorsanız, jQuery gibi şeyleri standartlaştırırken güvenilir bir şekilde kullanabilirsiniz. Aslında,

$('#searchbox input').bind('keypress', function(e) {
    if(e.keyCode==13){

    }
});

2

Kilian'ın cevabına göre:

Eğer sadece girmek tuşuna basın önemlidir:

<form action="javascript:alert('Enter');">
<input type=text value="press enter">
</form>

2

Yapmamın en kolay yolu:

$("#element").keydown(function(event) {
    if (event.keyCode == 13) {
        localiza_cep(this.value);
    }
});

1
Bunun event.whichyerine kullanmak daha iyi olur event.keyCode. Gönderen jQuery API :The event.which property normalizes event.keyCode and event.charCode. It is recommended to watch event.which for keyboard key input.
zanetu

2

Ben sadece daha kolay sağlayan jQuery için bir eklenti yaptık keypress olaylara . Numarayı bulup koymak yerine, tek yapmanız gereken şudur:

Bu nasıl kullanılır

  1. Aşağıya sahip olduğum kodu dahil et
  2. Bu kodu çalıştırın:
$(document).keydown(function(e) {
    if (getPressedKey(e) == theKeyYouWantToFireAPressEventFor /*Add 'e.ctrlKey here to only fire if the combo is CTRL+theKeyYouWantToFireAPressEventFor'*/) {
        // Your Code To Fire When You Press theKeyYouWantToFireAPressEventFor 
    }
});

Bu kadar basit. Not Lütfen theKeyYouWantToFireAPressEventForolduğu değil bir sayı, ama bir dize (örneğin "a"ateşe A, basıldığında "ctrl"zaman yangına çok sayıda durumunda, basıldığında veya sadece , tırnak işaretleri. İşte o zaman ateş ediyorumCTRL (control)11 basılır.)

Örnek / Kod:

Uzun sürüm çok ... iyi ... uzun olduğundan, bunun için bir PasteBin bağlantısı yaptım:
http://pastebin.com/VUaDevz1


"Eğer" karşılaştırmalar milyonlarca kullanmazsanız daha hızlı fonksiyonu çok daha kısa yapabilir ve -> jsfiddle.net/BlaM/bcguctrx - örnek için - - openbracket ve closebracket açık değildir / a üzerinde yakın parantez Ayrıca unutmayın Almanca klavye`.
BlaM

Bu çözümü beğendim. Güzel.
Jay


-9

Bunu dene:

jQuery('#myInput').keypress(function(e) {
    code = e.keyCode ? e.keyCode : e.which;
    if(code.toString() == 13) {
        alert('You pressed enter!');
    }
});
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.