Kích hoạt một sự kiện nhấn phím / nhấn phím / gõ phím trong JS / jQuery?


173

Cách tốt nhất để mô phỏng người dùng nhập văn bản vào hộp nhập văn bản trong JS và / hoặc jQuery là gì?

Tôi không thực sự muốn đặt văn bản vào hộp nhập, tôi chỉ muốn kích hoạt tất cả các trình xử lý sự kiện thường được kích hoạt bởi người dùng nhập thông tin vào hộp nhập. Điều này có nghĩa là tập trung, nhấn phím, nhấn phím, gõ phím và làm mờ. Tôi nghĩ.

Vì vậy, làm thế nào một người sẽ thực hiện điều này?

Câu trả lời:


240

Bạn có thể kích hoạt bất kỳ sự kiện nào bằng một cuộc gọi trực tiếp đến họ, như thế này:

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

Điều đó có làm những gì bạn đang cố gắng làm không?

Có lẽ bạn cũng nên kích hoạt .focus()và có khả năng.change()

Nếu bạn muốn kích hoạt các sự kiện khóa bằng các phím cụ thể, bạn có thể làm như vậy:

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

Có một số cuộc thảo luận thú vị về các sự kiện nhấn phím ở đây: Phím bấm sự kiện jQuery: Phím nào được nhấn? , đặc biệt liên quan đến khả năng tương thích giữa nhiều trình duyệt với thuộc tính .which.


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

@ebynum Bạn có thể viết một số mã bằng Javascript (không có jquery).
Chris P

1
Nếu bạn cần Ctrl: ctrlKey: true, thêm: shiftKey,altKey
Илья Зеленько

52

Bạn có thể gửi các sự kiện như

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

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

1
@Cuzox tại sao không sử dụng KeyboardEvent? Nó tự động điền các giá trị như shiftKey và đó là cách chính xác. Ngoài ra, bạn đặt một chuỗi trong keyCode, điều đó là sai.
SuperOP535

7
Nếu bạn cần Ctrl: el.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 70, ctrlKey: true }));(Điều này sẽ gây ra một shortcut Ctrl + F)
Илья Зеленько

31

Để kích hoạt enterphím nhấn, tôi phải sửa đổi phản hồi @ebynum, cụ thể bằng cách sử dụng thuộc tính keyCode.

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

2
keydownsự kiện không bị bắt hoặc tôi đang làm gì sai ở đây? fiddle.jshell.net/Palestinian/8d8J9
Omar

@cloak: nó hoạt động. Kiểm tra nhận xét của tôi ở đây để biết bộ chọn hoàn chỉnh để sửa các điều khiển asp.net: codeproject.com/Tips/269388/ Khăn Hãy chắc chắn rằng bạn gọi nó sau khi bạn chèn bất cứ thứ gì vào dom nếu sử dụng Ajax.
Dan Randolph

23

Đây là một ví dụ vanilla js để kích hoạt bất kỳ sự kiện nào:

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
Bạn có thể cung cấp một vài ví dụ về việc sử dụng? Làm thế nào chức năng của bạn sẽ được sử dụng để gửi một mã khóa?
Mac

6
Mã nguồn cho bài đăng này có thể được tìm thấy tại liên kết sau bao gồm tài liệu: plainjs.com/javascript/events/trigger-an-event-11
Kieren Dixon

17

Bạn có thể đạt được điều này với: EventTarget.dispatchEvent(event)và bằng cách chuyển vào Bàn phím mới như là sự kiện.

Ví dụ: element.dispatchEvent(new KeyboardEvent('keypress', {'key': 'a'}))

Ví dụ làm việc:

// 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" />

Công văn MDN

Bàn phím MDNEvent


12

Bây giờ bạn có thể làm:

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

2

Trước hết, tôi cần phải nói rằng mẫu từ Sionnach733 hoạt động hoàn hảo. Một số người dùng phàn nàn về sự vắng mặt của các ví dụ thực tế. Đây là hai xu của tôi. Tôi đã làm việc trên mô phỏng nhấp chuột khi sử dụng trang web này: https://www.youtube.com/tv . Bạn có thể mở bất kỳ video nào và thử chạy mã này. Nó thực hiện chuyển sang video tiếp theo.

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

Tôi nghĩ rằng tôi sẽ thu hút sự chú ý của bạn rằng trong ngữ cảnh cụ thể nơi người nghe được xác định trong plugin jQuery, thì điều duy nhất mô phỏng thành công sự kiện nhấn phím cho tôi, cuối cùng bị người nghe đó bắt gặp, là sử dụng setTimeout (). ví dụ

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

Bất kỳ việc sử dụng $("#txtName").keypress()đã bị bỏ qua , mặc dù được đặt ở cuối .ready() function. Không có bổ sung DOM cụ thể nào được tạo không đồng bộ.


1

Đối với bản thảo được truyền tới KeyboardEventInit và cung cấp số nguyên keyCode chính xác

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

1
@CamiRodriguez bất cứ điều gì bạn có thể làm trong TypeScript bạn có thể làm trong JS (giống như jQuery). Ngoại trừ việc TypeScript không làm rối các cú pháp JS, chỉ cần mở rộng chúng. Nếu bạn loại bỏ `as KeyboardEventInit` thì về cơ bản nó sẽ là một mã JS. +1 cho câu trả lời, cảm ơn.
Gergő Horváth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.