Có thể mô phỏng các sự kiện báo chí chính theo chương trình?


381

Có thể mô phỏng các sự kiện nhấn phím theo chương trình bằng JavaScript không?


2
Bạn có thể làm rõ 'mô phỏng'? Mục tiêu của bạn là kiểm tra trang web của bạn hay là để ban hành chức năng onclick, onmousedown, v.v. của một liên kết đã cho?
Paulo

Câu trả lời:


180

Một phiên bản không phải là jquery hoạt động trong cả webkit và tắc kè:

var keyboardEvent = document.createEvent("KeyboardEvent");
var initMethod = typeof keyboardEvent.initKeyboardEvent !== 'undefined' ? "initKeyboardEvent" : "initKeyEvent";

keyboardEvent[initMethod](
  "keydown", // event type: keydown, keyup, keypress
  true,      // bubbles
  true,      // cancelable
  window,    // view: should be window
  false,     // ctrlKey
  false,     // altKey
  false,     // shiftKey
  false,     // metaKey
  40,        // keyCode: unsigned long - the virtual key code, else 0
  0          // charCode: unsigned long - the Unicode character associated with the depressed key, else 0
);
document.dispatchEvent(keyboardEvent);

8
Philip, nó trông giống như mã tôi cần, nhưng tôi cần gửi sự kiện nhấn phím đến một vùng văn bản. Tôi đã cố gắng sửa đổi mã của bạn để gửi đến một vùng văn bản, nhưng nó dường như không hoạt động, ít nhất là trong chrome, có ý tưởng nào có thể sai không? đây là jsfiddle mà tôi đã thực hiện để chứng minh: jsfiddle.net/szmJu
user280109

4
Hóa ra có một lỗi trong Chromium với việc gửi bàn phímEvent. Kiểm tra chủ đề này để biết thêm chi tiết: stackoverflow.com/questions/10455626/ .
Philip Nuzhnyy

27
keyCodeluôn luôn là 0 và tôi không thể thay đổi nó.
Ata Iravani

9
Dường như có một lỗi trong Chromium khiến event.whichluôn luôn tồn tại 0khi sử dụng document.createEvent("KeyboardEvent"). @lluft đã chia sẻ các chi tiết và cách giải quyết, làm việc cho tôi, trong nhận xét này về một chủ đề khác. Về cơ bản, bạn cần sử dụng document.createEvent('Event')để tạo một sự kiện chung và sau đó đặt loại thành keydownvà cung cấp một thuộc keyCodetính bằng mã của khóa.
A-Diddy

8
Có vẻ như tính năng này đã bị xóa ngay bây giờ. MDN đã xem xét nó không được chấp nhận trong một thời gian khá lâu.
Tacticus

72

Nếu bạn ổn, hãy sử dụng jQuery 1.3.1:

function simulateKeyPress(character) {
  jQuery.event.trigger({ type : 'keypress', which : character.charCodeAt(0) });
}

$(function() {
  $('body').keypress(function(e) {
    alert(e.which);
  });

  simulateKeyPress("e");
});

Xin chào Điều tôi muốn nói là: 1. Đăng ký một sự kiện quan trọng (thư điện tử thực thi một số JS) 2. Từ một phương pháp khác tôi muốn lập trình nhấn chữ cái e)
tan

9
Nó không hoạt động đúng trong Chrome, xin lỗi. jQuery tạo Sự kiện, nhưng không có các thuộc tính quan trọng - which, charCode, keyCode.
hamczu

4
@tan Điều này là không thể. Xem câu trả lời của tôi cho lý do đằng sau nó.
Lorenz Lo Sauer


51

Những gì bạn có thể làm là lập trình kích hoạt những người nghe quan trọng bằng cách bắn những người quan trọng . Nó có ý nghĩa để cho phép điều này từ quan điểm bảo mật hộp cát. Sử dụng khả năng này, sau đó bạn có thể áp dụng mô hình quan sát điển hình . Bạn có thể gọi phương pháp này là "mô phỏng".

Dưới đây là một ví dụ về cách thực hiện điều này trong tiêu chuẩn W3C DOM cùng với jQuery:

function triggerClick() {
  var event = new MouseEvent('click', {
    'view': window,
    'bubbles': true,
    'cancelable': true
  });
  var cb = document.querySelector('input[type=submit][name=btnK]'); 
  var canceled = !cb.dispatchEvent(event);
  if (canceled) {
    // preventDefault was called and the event cancelled
  } else {
    // insert your event-logic here...
  }
}

Ví dụ này được điều chỉnh từ: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events

Trong jQuery:

jQuery('input[type=submit][name=btnK]')
  .trigger({
    type: 'keypress',
    which: character.charCodeAt(0 /*the key to trigger*/)      
   });

Nhưng gần đây, không có cách nào [DOM] để thực sự kích hoạt các khóa chính rời khỏi hộp cát trình duyệt. Và tất cả các nhà cung cấp trình duyệt lớn sẽ tuân thủ khái niệm bảo mật đó.

Đối với các plugin như Adobe Flash - dựa trên NPAPI- và cho phép bỏ qua hộp cát: đây là các loại bỏ dần ; Firefox .

Giải thích chi tiết:

Bạn không thể và bạn không được vì lý do bảo mật (như Pekka đã chỉ ra). Bạn sẽ luôn yêu cầu một người dùng tương tác ở giữa. Ngoài ra, hãy tưởng tượng cơ hội các nhà cung cấp trình duyệt bị người dùng kiện, vì các sự kiện bàn phím lập trình khác nhau sẽ dẫn đến các cuộc tấn công giả mạo.

Xem bài đăng này để thay thế và biết thêm chi tiết. Luôn luôn có flash và sao chép dựa trên flash. Dưới đây là một ví dụ thanh lịch . Đồng thời nó là một bằng chứng tại sao web di chuyển ra khỏi các nhà cung cấp plugin.

Có một tư duy bảo mật tương tự được áp dụng trong trường hợp chính sách CORS chọn tham gia để truy cập nội dung từ xa theo chương trình.

Câu trả lời là:
Không có cách nào để kích hoạt các khóa đầu vào theo chương trình trong môi trường trình duyệt hộp cát trong các trường hợp thông thường .

Tóm lại: Tôi không nói rằng nó sẽ không thể thực hiện được trong tương lai, dưới các chế độ và / hoặc đặc quyền trình duyệt đặc biệt hướng tới mục tiêu cuối cùng của trò chơi hoặc trải nghiệm người dùng tương tự. Tuy nhiên, trước khi vào các chế độ như vậy, người dùng sẽ được yêu cầu quyền và rủi ro, tương tự như mô hình API toàn màn hình .

Hữu ích: Trong bối cảnh của mã phím, này công cụ và keycode bản đồ sẽ có ích.

Tiết lộ: Câu trả lời dựa trên câu trả lời ở đây .


Vì vậy, với API JavaScript KeyboardEvent ( developer.mozilla.org/en-US/docs/Web/API/PalEvent ), bạn có thể mô phỏng các sự kiện chính, ví dụ: nói rằng một phím được nhấn nhưng không thể có hiệu ứng nhấn phím , giống như viết các ký tự 'a', 'b', 'c'? Nếu có thể, việc viết các ký tự cơ bản này không phải là vấn đề bảo mật nhưng tôi hiểu rằng một khóa đặc biệt như "F12" hoặc kết hợp như "Alt + F4" nên bị cấm.
baptx

1
Đây là những gì tôi nhận được khi chạy jQuery của bạn trong Chrome: Uncaught ReferenceError: ký tự không được xác định
Jayden Lawson

29

Bạn có thể gửi các sự kiện bàn phím trên một yếu tố như thế này

element.dispatchEvent(new KeyboardEvent('keypress',{'key':'a'}));

12
Tôi nghĩ rằng câu trả lời nên đề cập đến thực tế được gửi trong sự kiện js không cập nhật nội dung đầu vào.
Kirill Reznikov

5
Firefox mới nhất không hiện đại?
emix

Có vẻ như đã keypressbị khấu hao, keydownthay vào đó , sử dụng -> developer.mozilla.org/en-US/docs/Web/Events/keypress
JMT2080AD

Nó hoạt động hoàn hảo với tôi với Chrome Embedded, khi tôi cần.
Paulo França Lacerda

25

Bạn có thể sử dụng dispatchEvent():

function simulateKeyPress() {
  var evt = document.createEvent("KeyboardEvent");
  evt.initKeyboardEvent("keypress", true, true, window,
                    0, 0, 0, 0,
                    0, "e".charCodeAt(0))
  var body = document.body;
  var canceled = !body.dispatchEvent(evt);
  if(canceled) {
    // A handler called preventDefault
    alert("canceled");
  } else {
    // None of the handlers called preventDefault
    alert("not canceled");
  }
}

Tôi đã không kiểm tra điều này, nhưng nó được điều chỉnh từ mã trên tài liệu của ClarkEvent () . Có lẽ bạn sẽ muốn đọc qua điều đó, và cả các tài liệu cho createdEvent () và initKeyEvent ().


16
Lưu ý: Điều này chỉ được hỗ trợ bởi các trình duyệt Gecko.
lhunath

3
Tắc kè và các trình duyệt khác không đồng ý về việc nên sử dụng initKeyEventhay initKeyboardEvent(). Cả hai đều không được ủng hộ khi sử dụng hàm tạo KeyboardEvent () .
jkmartindale

21

Bạn có thể tạo và gửi các sự kiện bàn phím và chúng sẽ kích hoạt các trình xử lý sự kiện đã đăng ký thích hợp, tuy nhiên chúng sẽ không tạo ra bất kỳ văn bản nào , nếu được gửi đến phần tử đầu vào chẳng hạn.

Để mô phỏng đầy đủ kiểu nhập văn bản, bạn cần tạo một chuỗi các sự kiện bàn phím cộng với việc đặt rõ ràng văn bản của phần tử đầu vào. Chuỗi sự kiện phụ thuộc vào mức độ bạn muốn mô phỏng nhập văn bản.

Hình thức đơn giản nhất sẽ là:

$('input').val('123');
$('input').change();

15

Trong một số trường hợp, keypresssự kiện không thể cung cấp chức năng yêu cầu. Từ các tài liệu mozilla chúng ta có thể thấy rằng tính năng này không được dùng nữa:

Tính năng này không còn được khuyến khích. Mặc dù một số trình duyệt vẫn có thể hỗ trợ nó, nhưng nó có thể đã bị xóa khỏi các tiêu chuẩn web có liên quan, có thể đang trong quá trình bị loại bỏ hoặc chỉ có thể được giữ cho mục đích tương thích. Tránh sử dụng nó và cập nhật mã hiện có nếu có thể; xem bảng tương thích ở dưới cùng của trang này để hướng dẫn quyết định của bạn. Hãy lưu ý rằng tính năng này có thể ngừng hoạt động bất cứ lúc nào.

Vì vậy, vì keypresssự kiện được kết hợp từ hai sự kiện được kích hoạt keydownvà sau đó là sự kiện keyupcho cùng một khóa, chỉ cần tạo từng sự kiện một:

element.dispatchEvent(new KeyboardEvent('keydown',{'key':'Shift'}));
element.dispatchEvent(new KeyboardEvent('keyup',{'key':'Shift'}));

13

Dựa trên câu trả lời từ alex2k8, đây là phiên bản sửa đổi hoạt động trong tất cả các trình duyệt mà jQuery hỗ trợ (vấn đề là thiếu các đối số với jQuery.event.trigger, rất dễ quên khi sử dụng chức năng nội bộ đó).

// jQuery plugin. Called on a jQuery object, not directly.
jQuery.fn.simulateKeyPress = function (character) {
  // Internally calls jQuery.event.trigger with arguments (Event, data, elem).
  // That last argument, 'elem', is very important!
  jQuery(this).trigger({ type: 'keypress', which: character.charCodeAt(0) });
};

jQuery(function ($) {
  // Bind event handler
  $('body').keypress(function (e) {
    alert(String.fromCharCode(e.which));
    console.log(e);
  });
  // Simulate the key press
  $('body').simulateKeyPress('x');
});

Bạn thậm chí có thể đẩy nó đi xa hơn và để nó không chỉ mô phỏng sự kiện mà còn thực sự chèn ký tự (nếu đó là một yếu tố đầu vào), tuy nhiên có nhiều gotcha trình duyệt chéo khi cố gắng làm điều đó. Sử dụng tốt hơn một plugin phức tạp hơn như SendKeys .


1
SendKeys KHÔNG mô phỏng nhấn phím, nó chỉ đưa các giá trị vào các phần tử đích.
Ahmed Masud

2
Không mô phỏng một phím bấm phần cứng, chỉ gọi chức năng nhấn phím bị ràng buộc.
Codebeat 22/03/2015

9

Kể từ năm 2019, giải pháp này đã có hiệu quả với tôi:

document.dispatchEvent(
  new KeyboardEvent("keydown", {
    key: "e",
    keyCode: 69, // example values.
    code: "KeyE", // put everything you need in this object.
    which: 69,
    shiftKey: false, // you don't need to include values
    ctrlKey: false,  // if you aren't going to use them.
    metaKey: false   // these are here for example's sake.
  })
);

Tôi đã sử dụng điều này trong trò chơi trình duyệt của mình, để hỗ trợ các thiết bị di động có bàn phím mô phỏng.

Làm rõ: Mã này gửi một keydownsự kiện duy nhất , trong khi một phím bấm thực sự sẽ kích hoạt một keydownsự kiện (hoặc một vài trong số chúng nếu nó được giữ lâu hơn), và sau đó là một keyupsự kiện khi bạn phát hành phím đó. Nếu bạn cũng cần keyupcác sự kiện, cũng có thể mô phỏng keyupcác sự kiện bằng cách thay đổi "keydown"thành"keyup" đoạn mã.

Điều này cũng gửi sự kiện đến toàn bộ trang web, do đó document. Nếu bạn chỉ muốn một yếu tố cụ thể để nhận sự kiện, bạn có thể thay thế documentcho yếu tố mong muốn.


1
Đây là giải pháp duy nhất phù hợp với tôi trong chức năng runJavascript của Qt QWebEngine. Cảm ơn
Maxx

Vì một số lý do hoàn toàn bị các trò chơi Flash bỏ qua (có thể Flash bỏ qua mọi thứ không phải Trustedvậy?)
hanshenrik

@hanshenrik - Thành thật mà nói, nếu bạn đang sử dụng Flash vào năm 2020, bạn thực sự cần xem xét lại những công cụ nào phù hợp nhất cho mục đích của bạn.
haley

8

Đối với những người quan tâm, trên thực tế, bạn có thể tạo lại các sự kiện đầu vào bàn phím một cách đáng tin cậy. Để thay đổi văn bản trong khu vực đầu vào (di chuyển con trỏ hoặc trang thông qua ký tự đầu vào), bạn phải theo sát mô hình sự kiện DOM: http://www.w3.org/TR/DOM-Level-3-Events/ # h4_events-inputevents

Mô hình nên làm:

  • tiêu điểm (được gửi trên DOM với bộ mục tiêu)

Sau đó, cho mỗi nhân vật:

  • keydown (được gửi trên DOM)
  • beforeinput (được gửi tại mục tiêu nếu đó là textarea hoặc đầu vào)
  • nhấn phím (được gửi trên DOM)
  • đầu vào (được gửi tại mục tiêu nếu đó là một vùng văn bản hoặc đầu vào)
  • thay đổi (được gửi tại mục tiêu nếu nó được chọn)
  • keyup (được gửi trên DOM)

Sau đó, tùy chọn cho hầu hết:

  • làm mờ (được gửi trên DOM với bộ mục tiêu)

Điều này thực sự thay đổi văn bản trong trang thông qua javascript (không sửa đổi các câu lệnh giá trị) và đặt ra bất kỳ trình nghe / xử lý javascript nào một cách thích hợp. Nếu bạn làm rối trình tự javascript sẽ không kích hoạt theo thứ tự phù hợp, văn bản trong hộp nhập sẽ không thay đổi, các lựa chọn sẽ không thay đổi hoặc con trỏ sẽ không di chuyển đến không gian tiếp theo trong vùng văn bản.

Thật không may, mã được viết cho một chủ nhân theo NDA vì vậy tôi không thể chia sẻ nó, nhưng chắc chắn là có thể nhưng bạn phải tạo lại toàn bộ "ngăn xếp" đầu vào cho mỗi phần tử theo đúng thứ tự.


8
NDA cho JavaScript? Có thật không? , dù sao đối với mỗi ký tự, thuật toán của bạn sai, mô phỏng sự kiện "đầu vào" dù sao cũng sẽ thêm văn bản mà không phải trải qua toàn bộ khóa, sự kiện keyup hoặc bất kỳ sự kiện nào khác. Vấn đề là làm thế nào để xử lý nhiều sự kiện nhấn phím, v.v. như nhấn nút "a" và mong đợi "aaaaaaa" nhiều lần.
Akash Kava

1
Bí quyết là bắn một phím tắt, nhập liệu, sau đó gõ phím. Nếu bạn muốn nhiều "aaaaaa" tiếp tục bắn sự kiện đầu vào. và đừng nói với ai
Trevor

4
Tôi đã thử điều này nhưng dường như nó không hoạt động hoàn toàn: Tôi có thể kích hoạt các sự kiện cho các phím Enter, Backspace hoặc phím mũi tên, nhưng không phải với các ký tự. Ví dụ: tôi không thể nhập văn bản qua phương thức này mặc dù tôi đã theo sát thứ tự các sự kiện của bạn.
Chiến thuật

@Tacticus tình cờ bạn vẫn có mẫu mã để kích hoạt Enter theo câu trả lời này?
Siavas

1
Tôi đã cố gắng này, không có may mắn.
Mason

7

Cách tiếp cận này hỗ trợ trình duyệt chéo thay đổi giá trị của mã khóa . Nguồn

var $textBox = $("#myTextBox");

var press = jQuery.Event("keypress");
press.altGraphKey = false;
press.altKey = false;
press.bubbles = true;
press.cancelBubble = false;
press.cancelable = true;
press.charCode = 13;
press.clipboardData = undefined;
press.ctrlKey = false;
press.currentTarget = $textBox[0];
press.defaultPrevented = false;
press.detail = 0;
press.eventPhase = 2;
press.keyCode = 13;
press.keyIdentifier = "";
press.keyLocation = 0;
press.layerX = 0;
press.layerY = 0;
press.metaKey = false;
press.pageX = 0;
press.pageY = 0;
press.returnValue = true;
press.shiftKey = false;
press.srcElement = $textBox[0];
press.target = $textBox[0];
press.type = "keypress";
press.view = Window;
press.which = 13;

$textBox.trigger(press);

7

chỉ cần sử dụng CustomEvent

Node.prototype.fire=function(type,options){
     var event=new CustomEvent(type);
     for(var p in options){
         event[p]=options[p];
     }
     this.dispatchEvent(event);
}

4 ex muốn mô phỏng ctrl + z

window.addEventListener("keyup",function(ev){
     if(ev.ctrlKey && ev.keyCode === 90) console.log(ev); // or do smth
     })

 document.fire("keyup",{ctrlKey:true,keyCode:90,bubbles:true})

Tôi đang thử mã của bạn. Nếu tôi nhấn một phím tôi sẽ vào được người nghe, nhưng document.fire không có tác dụng.
Đánh dấu

"(" không phải là vấn đề. Tôi đã sửa nó ngay lập tức. Nó chỉ không được xử lý sau tài liệu. Lửa. BTW, tôi đang kích hoạt nó bằng cách nhấp vào biểu tượng.
Đánh dấu

Mã của tôi là một cái gì đó như thế này: <img src = "settings.svg" height = "22" width = "24" style = "con trỏ: con trỏ;" ng-click = "openAdminConsole ()"> Trong openAdminConsole () Tôi đang làm document.fire. Điều đó có đúng không?
Đánh dấu

4

Đây là một thư viện thực sự hữu ích: https://cdn.rawgit.com/ccampbell/mousetrap/2e5c2a8adbe80a89050aaf4e02c45f02f1cc12d4/tests/libs/key-event.js

Tôi không biết nó đến từ đâu, nhưng nó rất hữu ích. Nó thêm một .simulate()phương thức vào window.KeyEvent, vì vậy bạn sử dụng nó đơn giản chỉ KeyEvent.simulate(0, 13)để mô phỏng một enterhoặc KeyEvent.simulate(81, 81)cho a 'Q'.

Tôi đã nhận nó tại https://github.com/ccampbell/mousetrap/tree/master/tests .


4

Điều này làm việc cho tôi và nó mô phỏng một keyup cho textaera của tôi. nếu bạn muốn nó cho toàn bộ trang chỉ đưa KeySimulation()vào <body>như thế này <body onmousemove="KeySimulation()">hoặc nếu không onmousemovethì onmouseoverhoặc onloadcông trình quá.

<script>
function KeySimulation()
{
var e = document.createEvent("KeyboardEvent");
if (e.initKeyboardEvent) {  // Chrome, IE
    e.initKeyboardEvent("keyup", true, true, document.defaultView, "Enter", 0, "", false, "");
} else { // FireFox
    e.initKeyEvent("keyup", true, true, document.defaultView, false, false, false, false, 13, 0);
}
document.getElementById("MyTextArea").dispatchEvent(e);
}
</script>

<input type="button" onclick="KeySimulation();" value=" Key Simulation " />
<textarea id="MyTextArea" rows="15" cols="30"></textarea>

2
Được cảnh báo rằng initKeyboardEventkhông được tán thành. ( Nguồn )
nghe nhìn

4

Nó được chèo một lần duy nhất do sử dụng dễ dàng trong bối cảnh giao diện điều khiển. Nhưng có lẽ vẫn hữu ích.

    var pressthiskey = "q"/* <-- q for example */;
    var e = new Event("keydown");
    e.key = pressthiskey;
    e.keyCode = e.key.charCodeAt(0);
    e.which = e.keyCode;
    e.altKey = false;
    e.ctrlKey = true;
    e.shiftKey = false;
    e.metaKey = false;
    e.bubbles = true;
    document.dispatchEvent(e);

2

Đây là một giải pháp hoạt động trong Chrome và Chromium (chỉ mới thử nghiệm các nền tảng này). Có vẻ như Chrome có một số lỗi hoặc cách tiếp cận riêng để xử lý mã khóa, do đó, thuộc tính này phải được thêm riêng vào Bàn phím.

function simulateKeydown (keycode,isCtrl,isAlt,isShift){
    var e = new KeyboardEvent( "keydown", { bubbles:true, cancelable:true, char:String.fromCharCode(keycode), key:String.fromCharCode(keycode), shiftKey:isShift, ctrlKey:isCtrl, altKey:isAlt } );
    Object.defineProperty(e, 'keyCode', {get : function() { return this.keyCodeVal; } });     
    e.keyCodeVal = keycode;
    document.dispatchEvent(e);
}

1

Đây là những gì tôi quản lý để tìm:

function createKeyboardEvent(name, key, altKey, ctrlKey, shiftKey, metaKey, bubbles) {
  var e = new Event(name)
  e.key = key
  e.keyCode = e.key.charCodeAt(0)
  e.which = e.keyCode
  e.altKey = altKey
  e.ctrlKey = ctrlKey
  e.shiftKey = shiftKey
  e.metaKey =  metaKey
  e.bubbles = bubbles
  return e
}

var name = 'keydown'
var key = 'a'

var event = createKeyboardEvent(name, key, false, false, false, false, true)

document.addEventListener(name, () => {})
document.dispatchEvent(event)

1

JavaScript gốc với giải pháp được hỗ trợ TypeScript:

Nhập keyCode hoặc bất kỳ thuộc tính nào bạn đang sử dụng và chuyển nó vào KeyboardEventInit

Thí dụ

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

1

Đó là những gì tôi đã thử với js / typecript trong chrome. Nhờ câu trả lời này cho cảm hứng.

const x = document.querySelector('input');

const keyboardEvent = new KeyboardEvent("keypress", { bubbles: true });
Object.defineProperty(keyboardEvent, "charCode", {
  get() {
    return 13;
  },
});
x.dispatchEvent(keyboardEvent);

0

ngay khi người dùng nhấn phím trong câu hỏi, bạn có thể lưu trữ một tham chiếu đến đó và sử dụng nó trên bất kỳ phần tử HTML nào khác:

EnterKeyPressToEmulate<input class="lineEditInput" id="addr333_1" type="text" style="width:60%;right:0%;float:right" onkeydown="keyPressRecorder(event)"></input>
TypeHereToEmulateKeyPress<input class="lineEditInput" id="addr333_2" type="text" style="width:60%;right:0%;float:right" onkeydown="triggerKeyPressOnNextSiblingFromWithinKeyPress(event)">
Itappears Here Too<input class="lineEditInput" id="addr333_3" type="text" style="width:60%;right:0%;float:right;" onkeydown="keyPressHandler(event)">
<script>
var gZeroEvent;
function keyPressRecorder(e)
{
  gZeroEvent = e;
}
function triggerKeyPressOnNextSiblingFromWithinKeyPress(TTT)
{
  if(typeof(gZeroEvent) != 'undefined')  {
TTT.currentTarget.nextElementSibling.dispatchEvent(gZeroEvent);
keyPressHandler(TTT);
  }
}
function keyPressHandler(TTT)
{
  if(typeof(gZeroEvent) != 'undefined')  {
TTT.currentTarget.value+= gZeroEvent.key;
event.preventDefault();
event.stopPropagation();
  }
}
</script>

bạn có thể đặt keyCode nếu bạn tạo sự kiện của riêng mình, bạn có thể sao chép các tham số hiện có từ bất kỳ sự kiện bàn phím thực nào (bỏ qua các mục tiêu kể từ khi công việc của ClarkEvent) và:

ta = new KeyboardEvent('keypress',{ctrlKey:true,key:'Escape'})

0

Tôi biết câu hỏi yêu cầu một cách mô phỏng javascript để nhấn phím. Nhưng đối với những người đang tìm kiếm một cách làm jQuery:

var e = jQuery.Event("keypress");
e.which = 13 //or e.keyCode = 13 that simulates an <ENTER>
$("#element_id").trigger(e); 

0

Phần quan trọng của việc làm điều này là để nhận ra điều đó charCode, keyCodetất cảwhich đều là những phương pháp không dùng nữa . Do đó, nếu mã xử lý sự kiện nhấn phím sử dụng bất kỳ một trong ba điều này, thì nó sẽ nhận được câu trả lời không có thật (ví dụ: mặc định là 0).

Miễn là bạn truy cập vào sự kiện nhấn phím bằng phương pháp không phản đối, chẳng hạn như key, bạn sẽ ổn.

Để hoàn thành, tôi đã thêm mã Javascript cơ bản để kích hoạt sự kiện:

const rightArrowKey = 39
const event = new KeyboardEvent('keydown',{'key':rightArrowKey})
document.dispatchEvent(event)

0

Tôi muốn mô phỏng nhấn 'Tab' ... Mở rộng câu trả lời của Trevor, chúng ta có thể thấy rằng một phím đặc biệt như 'tab' sẽ bị nhấn nhưng chúng ta không thấy kết quả thực tế mà báo chí 'tab' sẽ có .. .

đã cố gắng gửi các sự kiện này cho 'activeEuity' cũng như đối tượng tài liệu toàn cầu cả hai - mã cho cả hai được thêm vào bên dưới;

đoạn trích dưới đây:

var element = document.getElementById("firstInput");

document.addEventListener("keydown", function(event) {

  console.log('we got key:', event.key, '  keyCode:', event.keyCode, '  charCode:', event.charCode);

  /* enter is pressed */
  if (event.keyCode == 13) {
    console.log('enter pressed:', event);

    setTimeout(function() {
      /*  event.keyCode = 13;  event.target.value += 'b';  */

      theKey = 'Tab';
      var e = new window.KeyboardEvent('focus', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('keydown', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('beforeinput', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('keypress', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('input', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('change', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('keyup', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
    }, 4);

    setTimeout(function() {
      theKey = 'Tab';
      var e = new window.KeyboardEvent('focus', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('keydown', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('beforeinput', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('keypress', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('input', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('change', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('keyup', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
    }, 100);



  } else if (event.keyCode != 0) {
    console.log('we got a non-enter press...: :', event.key, '  keyCode:', event.keyCode, '  charCode:', event.charCode);
  }

});
<h2>convert each enter to a tab in JavaScript... check console for output</h2>
<h3>we dispatchEvents on the activeElement... and the global element as well</h3>

<input type='text' id='firstInput' />
<input type='text' id='secondInput' />

<button type="button" onclick="document.getElementById('demo').innerHTML = Date()">
    Click me to display Date and Time.</button>
<p id="demo"></p>

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.