Cách dứt khoát để kích hoạt các sự kiện nhấn phím với jQuery


260

Tôi đã đọc tất cả các câu trả lời cho câu hỏi này và dường như không có giải pháp nào hoạt động.

Ngoài ra, tôi nhận được sự rung cảm khi kích hoạt phím nhấn với các ký tự đặc biệt hoàn toàn không hoạt động. Ai đó có thể xác minh những người đã làm điều này?


14
Không bạn bỏ lỡ hiểu khái niệm. Đây không phải là cách nó hoạt động. kích hoạt sẽ chỉ gọi xử lý sự kiện. Nó sẽ không thực sự in chìa khóa. Nếu bạn muốn mô phỏng hiệu ứng của việc in khóa, thì chỉ cần thêm khóa vào giá trị đầu vào và kích hoạt sự kiện cùng một lúc.
Nadia Alramli

Thật thú vị, tôi không biết điều đó. Trong trường hợp đó, bạn có thể cho tôi biết nếu kích hoạt sự kiện cũng sẽ kích hoạt nó cho libs không jquery. ví dụ: nếu tôi có một onKeydown được thiết lập trong JS đơn giản, nó có nắm bắt được sự kiện "giả mạo" của tôi không?
mkoryak

2
có, nếu có một onkeydown = '...' được thiết lập trong js đơn giản. Nó sẽ được kích hoạt bởi sự kiện giả mạo. Tôi không chắc về nó. Nhưng tôi đã làm một bài kiểm tra nhanh và nó đã hoạt động.
Nadia Alramli

2
@Nadia Cảm ơn vì điều đó! Tôi đã đọc qua tất cả các câu trả lời tự hỏi tại sao mọi thứ không hoạt động trước khi nhận ra những kỳ vọng của tôi không đúng. Tôi nghi ngờ rất nhiều người khác sẽ có cùng quan niệm sai lầm.
mikemaccana

3
Hai năm sau ... đọc trang có vẻ như cách dứt khoát là: $ ('input # search'). Trigger ($. Event ('keydown', {which: $. Uy.keyCode.ENTER, keyCode: $ .ui.keyCode.ENTER}));
molokoloco

Câu trả lời:


365

Nếu bạn muốn kích hoạt sự kiện nhấn phím hoặc nhấn phím thì tất cả những gì bạn phải làm là:

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

42
câu hỏi là làm thế nào để kích hoạt chứ không phải làm thế nào để nắm bắt
Chad Grant

2
Tôi đã thêm một ví dụ để kích hoạt sự kiện
Nadia Alramli

4
Câu trả lời rất hay. Đáng lưu ý rằng jQuery.Event có sẵn cho jQuery 1.3 trở lên. Nó trở nên có liên quan trong câu hỏi này: stackoverflow.com/questions/1823617/ từ
artlung

8
Điều này không làm việc với tôi với thanh trượt UI jQuery. Tôi đã phải đặt e.keyCode như câu trả lời của OreiA bên dưới.
crizCraig

2
fwiw, tôi đã thành công hơn với 'keyup' cho ứng dụng của mình
đánh dấu

81

Bây giờ ngắn gọn hơn với jQuery 1.6+ :

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

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

(Nếu bạn không sử dụng jQuery UI, hãy thay vào mã khóa thích hợp.)


4
Chỉ cần nhớ thay thế 'keyCode' cho 'which'.
Richard Nienaber

Có, bạn phải xác định khóa và mã khóa nào an toàn (nếu trình lắng nghe sự kiện kiểm tra e.keyCode, nó sẽ chỉ hoạt động nếu bạn xác định keyCode khi tạo đối tượng jQuery.Event)
jackocnr

1
jQuery bình thường hóa / keyCode để đặt cả hai vào.
Thiên thần Nigel

+1 cho liên kết đến api.jquery.com; và các phiên bản jQuery hiện tại không bình thường hóa / keyCode, vì vậy bạn nên cung cấp cả hai để đảm bảo an toàn
Victor

2
@SamuelLindblom Tôi nên viết rõ hơn: jQuery không bình thường hóa các thuộc tính sự kiện được truyền qua .trigger(jQuery.Event('name', props)). Nhìn vào ví dụ jsfiddle.net/9ggmrbpd/1 - các thuộc tính của sự kiện được kích hoạt được thông qua. Mã nguồn: github.com/jquery/jquery/blob/master/src/event.js#L739
Victor

68

Câu trả lời thực sự phải bao gồm keyCode:

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

Mặc dù trang web của jQuery nói rằng cái nào và keyCode được chuẩn hóa, chúng vẫn bị nhầm lẫn rất tệ. Luôn luôn an toàn nhất để thực hiện kiểm tra trình duyệt chéo tiêu chuẩn cho e.which và e.keyCode và trong trường hợp này chỉ cần xác định cả hai.


34
+1. Nhân tiện, e.keyCode = e.which = 50;trong một dòng duy nhất sẽ đẹp hơn. :)
Sk8erPeter

Tôi chỉ phát hiện ra rằng chỉ sử dụng keyCodekhông làm việc. Phải đặt cả hai để làm cho nó hoạt động
Tasos K.

@ Sk8erPeter sẽ không trừ khi đó là một cuộc thi mã hóa
golph

18

Nếu bạn cũng đang sử dụng jQuery UI, bạn có thể làm như thế này:

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

1
e.những gì dường như không hoạt động với thanh trượt UI jQuery của tôi. Cảm ơn câu trả lời này. Nó không hoạt động.
crizCraig

5

Tôi đã làm cho nó hoạt động với keyup.

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

3
trong câu hỏi của tôi 6 năm trước, tôi cũng muốn đặt mã khóa, nhưng không biết làm thế nào.
mkoryak

4

Ok, đối với tôi làm việc với ...

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

Trong trường hợp bạn cần tính đến con trỏ hiện tại và lựa chọn văn bản ...

Điều này đã không làm việc cho tôi cho một ứng dụng AngularJS trên Chrome. Như Nadia chỉ ra trong các nhận xét ban đầu, nhân vật không bao giờ được nhìn thấy trong trường đầu vào (ít nhất, đó là kinh nghiệm của tôi). Ngoài ra, các giải pháp trước đó không tính đến lựa chọn văn bản hiện tại trong trường đầu vào. Tôi đã phải sử dụng một lựa chọn thư viện tuyệt vời .

Tôi có một bàn phím số trên màn hình tùy chỉnh điền vào nhiều trường nhập. Tôi phải...

  1. Tập trung, lưu tập tin LastF Focus.element
  2. Khi làm mờ, lưu lựa chọn văn bản hiện tại (bắt đầu và dừng)

    var pos = element.selection('getPos')
    lastFocus.pos = { start: pos.start, end: pos.end}
  3. Khi một nút trên bàn phím của tôi được nhấn:

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

2

Trong số bạn muốn làm điều đó trong một dòng duy nhất bạn có thể sử dụng

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

1

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

Tôi không cần phải lập bản đồ nhân vật.


1

Nó có thể được thực hiện như tài liệu này

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

1
Điều này dường như không hoạt động bởi vì điều này sử dụng đối số ExtraParameter không đặt bất cứ điều gì bên trong đối số sự kiện nhưng thêm các đối số bổ sung cho cuộc gọi lại xử lý sự kiện.
TimeWaster ngày

1
Không phải là một giải pháp hợp lệ
Entwickler
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.