JS / jQuery'de bir tuşa basma / tuşlama / tuşlama olayını tetikle?


173

JS ve / veya jQuery'de metin giriş kutusuna metin giren bir kullanıcının simülasyonunu yapmanın en iyi yolu nedir?

Ben yok ben sadece tüm olay tetiklemek istiyorum aslında girdi kutusuna metni koymak istiyorum işleyicileri normalde giriş kutusuna bir kullanıcı yazarak bilgi tetiklediği olacaktı. Bu, odaklama, tuşlar, tuşa basma, tuşlar ve bulanıklaştırma anlamına gelir. Bence.

Peki bunu nasıl başarabiliriz?

Yanıtlar:


240

Herhangi bir olayı doğrudan arayarak olayları tetikleyebilirsiniz, örneğin:

$(function() {
    $('item').keydown();
    $('item').keypress();
    $('item').keyup();
    $('item').blur();
});

Yapmaya çalıştığın şey bu mu?

Muhtemelen tetiklemelisiniz .focus()ve potansiyel olarak.change()

Anahtar olayları belirli tuşlarla tetiklemek istiyorsanız, bunu şu şekilde yapabilirsiniz:

$(function() {
    var e = $.Event('keypress');
    e.which = 65; // Character 'A'
    $('item').trigger(e);
});

Burada tuşa basma olayları hakkında ilginç bir tartışma var: jQuery Olayı Tuşa basma: Hangi tuşa basıldı? , özellikle .which özelliğiyle tarayıcılar arası uyumluluğa ilişkin.


3
veya$('item').trigger('keypress', {which: 'A'.charCodeAt(0)});
Bob Stein

@ebynum Javascript (jquery yok) ile kod yazabilir misiniz?
Chris P

1
: Ctrl gerekiyorsa ctrlKey: true: ayrıca shiftKey,altKey
Илья Зеленько

52

Gibi etkinlikler gönderebilirsiniz

el.dispatchEvent(new Event('focus'));
el.dispatchEvent(new KeyboardEvent('keypress',{'key':'a'}));

5
veyael.dispatchEvent(new Event('keypress', {keyCode: 'a'}))
Cuzox

1
@Cuzox neden KeyboardEvent kullanmıyorsunuz? ShiftKey gibi değerleri otomatik olarak doldurur ve doğru yoldur. Ayrıca, keyCode'a bir dize koyarsınız, bu yanlıştır.
SuperOP535

7
Gerekirse Ctrl: el.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 70, ctrlKey: true }));(Bu bir kısayola neden olur Ctrl + F)
Илья Зеленько

31

Bir entertuşa basmayı tetiklemek için @ebynum yanıtını, özellikle keyCode özelliğini kullanarak değiştirmek zorunda kaldım.

e = $.Event('keyup');
e.keyCode= 13; // enter
$('input').trigger(e);

2
keydownolay yakalanmıyor, yoksa burada yanlış bir şey mi yapıyorum? fiddle.jshell.net/Palestinian/8d8J9
Omar

@cloak: işe yarıyor. Asp.net denetimlerini düzeltmek için tam bir seçici için yorumuma bakın : codeproject.com/Tips/269388/… Ajax kullanıyorsanız dom'a bir şey ekledikten sonra aradığınızdan emin olun.
Dan Randolph

23

İşte herhangi bir olayı tetikleyen bir vanilya js örneği:

function triggerEvent(el, type){
if ('createEvent' in document) {
        // modern browsers, IE9+
        var e = document.createEvent('HTMLEvents');
        e.initEvent(type, false, true);
        el.dispatchEvent(e);
    } else {
        // IE 8
        var e = document.createEventObject();
        e.eventType = type;
        el.fireEvent('on'+e.eventType, e);
    }
}

7
Birkaç kullanım örneği verebilir misiniz? İşleviniz bir anahtar kodu göndermek için nasıl kullanılır?
Mac


17

Bunu şu şekilde yapabilirsiniz: EventTarget.dispatchEvent(event)ve etkinlik olarak yeni bir KeyboardEvent geçirerek.

Örneğin: element.dispatchEvent(new KeyboardEvent('keypress', {'key': 'a'}))

Çalışma örneği:

// get the element in question
const input = document.getElementsByTagName("input")[0];

// focus on the input element
input.focus();

// add event listeners to the input element
input.addEventListener('keypress', (event) => {
  console.log("You have pressed key: ", event.key);
});

input.addEventListener('keydown', (event) => {
  console.log(`key: ${event.key} has been pressed down`);
});

input.addEventListener('keyup', (event) => {
  console.log(`key: ${event.key} has been released`);
});

// dispatch keyboard events
input.dispatchEvent(new KeyboardEvent('keypress',  {'key':'h'}));
input.dispatchEvent(new KeyboardEvent('keydown',  {'key':'e'}));
input.dispatchEvent(new KeyboardEvent('keyup', {'key':'y'}));
<input type="text" placeholder="foo" />

MDN dağıtımı

MDN KeyboardEvent


12

Artık şunları yapabilirsiniz:

var e = $.Event("keydown", {keyCode: 64});

2

Her şeyden önce, Sionnach733'ün örneğinin kusursuz çalıştığını söylemeliyim . Bazı kullanıcılar gerçek örneklerin bulunmadığından şikayet ederler. İşte benim iki sentim. Bu siteyi kullanırken fare tıklama simülasyonu üzerinde çalışıyorum: https://www.youtube.com/tv . Herhangi bir videoyu açabilir ve bu kodu çalıştırmayı deneyebilirsiniz. Sonraki videoya geçiş yapar.

function triggerEvent(el, type, keyCode) {
    if ('createEvent' in document) {
            // modern browsers, IE9+
            var e = document.createEvent('HTMLEvents');
            e.keyCode = keyCode;
            e.initEvent(type, false, true);
            el.dispatchEvent(e);
    } else {
        // IE 8
        var e = document.createEventObject();
        e.keyCode = keyCode;
        e.eventType = type;
        el.fireEvent('on'+e.eventType, e);
    }
}

var nextButton = document.getElementsByClassName('icon-player-next')[0];
triggerEvent(nextButton, 'keyup', 13); // simulate mouse/enter key press

1

Bir dinleyicinin bir jQuery eklentisi içinde tanımlandığı belirli bağlamda, o zamanlar bu dinleyici tarafından yakalanan benim için keypress olayını başarılı bir şekilde simüle eden tek şeyin setTimeout () kullanmak olduğuna dikkatinizi çekeceğini düşündüm. Örneğin

setTimeout(function() { $("#txtName").keypress() } , 1000);

Herhangi bir kullanımı $("#txtName").keypress()olan gözardı sonunda yer rağmen .ready() function. Zaten eşzamansız olarak belirli bir DOM eki oluşturulmuyordu.


1

KeyboardEventInit'e yazılan daktilo için ve doğru keyCode tamsayısını sağlayın

const event = new KeyboardEvent("keydown", {
          keyCode: 38,
        } as KeyboardEventInit);

1
@CamiRodriguez, JS'de yapabileceğiniz her şeyi JS'de yapabilirsiniz (jQuery gibi). TypeScript'in JS sözdizimlerini bozmaması dışında bunları genişletir. `KeyboardEventInit olarak 'kaldırırsanız, temelde bir JS kodu olacaktır. Cevap için +1, teşekkürler.
Gergő Horváth
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.