JQuery ile tuşa basma olaylarını tetiklemenin kesin yolu


260

Bu soruların tüm cevaplarını okudum ve çözümlerin hiçbiri işe yaramadı.

Ayrıca, özel karakterlerle tuşa basmayı tetiklemenin hiç işe yaramadığı vibe alıyorum. Birisi bunu kimin yaptığını doğrulayabilir mi?


14
Hayır özledim kavramı anladım. Bu nasıl çalıştığı değil. tetikleyici yalnızca olay işleyiciyi çağırır. Aslında anahtar yazdırılmaz. Anahtarı yazdırmanın etkisini simüle etmek istiyorsanız, anahtarı giriş değerine ekleyin ve aynı anda etkinliği tetikleyin.
Nadia Alramli

İlginç, bunu bilmiyordum. Bu durumda, olayı tetiklemenin jquery dışı kütüphaneler için de tetikleyip tetiklemeyeceğini söyleyebilir misiniz? örneğin düz JS'de ayarlanmış bir onKeydown'um varsa, "sahte" etkinliğimi yakalayacak mı?
mkoryak

2
evet, düz js'de kurulmuş bir onkeydown = '...' olsaydı. Sahte olay tarafından tetiklenecektir. Bundan emin değildim. Ama hızlı bir test yaptım ve işe yaradı.
Nadia Alramli

2
@Nadia Bunun için teşekkürler! Beklentilerimin doğru olmadığını anlamadan önce işlerin neden çalışmadığını merak eden tüm cevapları okudum. Birçok insanın aynı yanlış anlamalara sahip olacağından şüpheleniyorum.
mikemaccana

3
İki yıl sonra ... sayfayı okurken kesin yol şudur: $ ('input # search'). Trigger ($. Event ('keydown', {Ki: $. Ui.keyCode.ENTER, keyCode: $ .ui.keyCode.ENTER}));
molokoloco

Yanıtlar:


365

Tuşa basma veya tuşa basma olayını tetiklemek istiyorsanız, yapmanız gereken tek şey:

var e = jQuery.Event("keydown");
e.which = 50; // # Some key code value
$("input").trigger(e);

42
asıl soru nasıl yakalanacağı değil nasıl tetikleneceğidir
Chad Grant

2
Etkinliği tetiklemek için bir örnek ekledim
Nadia Alramli

4
Çok güzel bir cevap. JQuery.Event, jQuery 1.3 veya üstü için kullanılabilir olduğunu belirtmek gerekir. Bu soruda alakalı oldu: stackoverflow.com/questions/1823617/…
artlung

8
Bu benim için bir jQuery UI kaydırıcısı ile çalışmadı. E.keyCode'u aşağıda OreiA'nın cevabı gibi ayarlamak zorunda kaldım.
crizCraig

2
fwiw, başvurum için 'keyup' ile daha başarılı oldum
mark

81

JQuery 1.6+ ile biraz daha özlü :

var e = jQuery.Event( 'keydown', { which: $.ui.keyCode.ENTER } );

$('input').trigger(e);

(JQuery kullanıcı arayüzü kullanmıyorsanız, bunun yerine uygun anahtar kodunu girin.)


4
Sadece 'keyCode' yerine 'hang' yerine koymayı unutmayın.
Richard Nienaber

Evet, hangisinin ve keyCode'un güvenli olacağını tanımlamanız gerekir (olay dinleyicisi e.keyCode öğesini kontrol ederse, yalnızca keyQ Kodunu jQuery.Event nesnesini oluştururken tanımlarsanız çalışır)
jackocnr

1
jQuery hangi / keyCode öğesinin her ikisini birden koyarak normalleşeceğini normalleştirir.
Nigel Angel

Api.jquery.com bağlantısı için +1; ve mevcut jQuery sürümleri hangi / keyCode'u normalleştirmez, bu nedenle her ikisini de güvenlik için sağlamanız gerekir
Victor

2
@SamuelLindblom Daha net yazmalıydım: jQuery, geçilen olay özelliklerini normalleştirmez .trigger(jQuery.Event('name', props)). Örneğe bakın jsfiddle.net/9ggmrbpd/1 - tetiklenen olayın özellikleri olduğu gibi iletilir. Kaynak kodu: github.com/jquery/jquery/blob/master/src/event.js#L739
Victor

68

Gerçek cevap keyCode içermelidir:

var e = jQuery.Event("keydown");
e.which = 50; // # Some key code value
e.keyCode = 50
$("input").trigger(e);

JQuery'nin web sitesi, hangi ve keyCode'un normalleştirildiğini söylese de, çok kötü yanılıyorlar. E.which ve e.keyCode için standart çapraz tarayıcı kontrollerini yapmak her zaman en güvenlidir ve bu durumda her ikisini de tanımlar.


34
+1. Bu arada, e.keyCode = e.which = 50;tek bir satırda daha güzel olurdu. :)
Sk8erPeter

Sadece kullanmanın keyCodeişe yaramadığını öğrendim . Her ikisini de çalışmak için ayarlamak zorunda kaldım
Tasos K.

@ Sk8erPeter bir golph kodlama yarışması olmadıkça olmayacak
shabunc

18

JQuery kullanıcı arayüzünü de kullanıyorsanız, bunu yapabilirsiniz:

var e = jQuery.Event("keypress");
e.keyCode = $.ui.keyCode.ENTER;
$("input").trigger(e);

1
e. benim jQuery UI kaydırıcısı ile çalışmıyor gibi görünüyor. Bu cevap için teşekkürler. Çalışıyor.
crizCraig

5

Keyup ile çalýţtým.

$("#id input").trigger('keyup');

3
6 sene önceki soruma ben de girmek istedim ama nasıl olduğunu bilmiyordum.
mkoryak

4

Tamam, benim için bu işe yarar ...

var e2key = function(e) {
    if (!e) return '';
    var event2key = {
        '96':'0', '97':'1', '98':'2', '99':'3', '100':'4', '101':'5', '102':'6', '103':'7', '104':'8', '105':'9', // Chiffres clavier num
        '48':'m0', '49':'m1', '50':'m2', '51':'m3', '52':'m4', '53':'m5', '54':'m6', '55':'m7', '56':'m8', '57':'m9', // Chiffres caracteres speciaux
        '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', // Alphabet
        '37':'left', '39':'right', '38':'up', '40':'down', '13':'enter', '27':'esc', '32':'space', '107':'+', '109':'-', '33':'pageUp', '34':'pageDown' // KEYCODES
    };
    return event2key[(e.which || e.keyCode)];
};

var page5Key = function(e, customKey) {
    if (e) e.preventDefault();
    switch(e2key(customKey || e)) {
        case 'left': /*...*/ break;
        case 'right': /*...*/ break;
    }
};

$(document).bind('keyup', page5Key);

$(document).trigger('keyup', [{preventDefault:function(){},keyCode:37}]); 

2

Geçerli imleci ve metin seçimini dikkate almanız gerekirse ...

Bu benim için Chrome'daki AngularJS uygulaması için işe yaramıyordu. Nadia'nın orijinal yorumlarda belirttiği gibi, karakter giriş alanında asla görünmez (en azından benim deneyimimdi). Ayrıca, önceki çözümler giriş alanındaki geçerli metin seçimini dikkate almaz. Harika bir kütüphane jquery seçim kullanmak zorunda kaldı .

Birden çok giriş alanını dolduran özel bir ekran sayısal tuş takımım var. Yapmak zorundaydım...

  1. Odakta, lastFocus.element öğesini kaydedin
  2. Bulanıklaştırma durumunda, geçerli metin seçimini kaydedin (başlat ve durdur)

    var pos = element.selection('getPos')
    lastFocus.pos = { start: pos.start, end: pos.end}
  3. Tuş takımımdaki bir düğmeye basıldığında:

    lastFocus.element.selection( 'setPos', lastFocus.pos)
    lastFocus.element.selection( 'replace', {text: myKeyPadChar, caret: 'end'})

2

Bunu kullanmak istediğiniz tek bir satırda

$("input").trigger(jQuery.Event('keydown', { which: '1'.charCodeAt(0) }));

1

console.log( String.fromCharCode(event.charCode) );

sanırım karakter harita gerek yok.


1

Bu dokümanlar gibi başarılabilir

$('input').trigger("keydown", {which: 50});

1
Bu, olay bağımsız değişkeni içinde hiçbir şey ayarlamayan ancak olay işleyicisi geri aramasına fazladan bağımsız değişkenler ekleyen extraParameters bağımsız değişkenini kullandığından işe yaramıyor gibi görünüyor.
TimeWaster

1
Geçerli bir çözüm değil
Entwickler
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.