Nếu bạn muốn làm điều đó một cách đúng đắn, bạn có thể sử dụng DOM Bàn phím Mức độ sự kiện 4 Bàn phímKhoa cấu trúc và khóa thuộc tính.
Trong các trình duyệt mới nhất hoặc với DOM Keyboard Event Level 3/4 polyfill bạn có thể làm một cái gì đó như thế này:
element.addEventListener(function(e){ console.log(e.key, e.char, e.keyCode) })
var e = new KeyboardEvent("keydown", {bubbles : true, cancelable : true, key : "Q", char : "Q", shiftKey : true});
element.dispatchEvent(e);
//If you need legacy property "keyCode".
// Note: In some browsers you can't overwrite "keyCode" property. (At least in Safari)
delete e.keyCode;
Object.defineProperty(e, "keyCode", {"value" : 666})
Example
"map event.key to character values of a normal QUERTY (en-US) layout" proposal demo
Lưu ý rằng keyCode và charCode đang bị phản đối trong tất Spec (www .w3.org/TR/DOM-Level-3-Sự kiện /). Vì vậy, không có cơ hội để Chrome triển khai initKeyEvent với hỗ trợ mã phím. Nhưng bạn luôn có thể ghi đè lên giá trị này: CẬP NHẬT: Phương pháp Nhược điểm:
var evt = document.createEvent('KeyboardEvent');
evt.initKeyEvent("keypress", false, true, null, false, false,
shift, false, keyCode(key), key.charCodeAt(0));
if(evt.keyCode != keyCode(key)) {
delete evt.keyCode;
// Note: In some browsers you can't overwrite "keyCode" property. (At least in Safari)
Object.defineProperty(evt, "keyCode", { keyCode(key) });
}
Hoặc bạn có thể cập nhật mẫu sự kiện: CẬP NHẬT: Phương pháp Nhược điểm:
// Note: In some browsers you can't overwrite "keyCode" property. (At least in Safari)
var _native_keyCode_getter = Object.getOwnPropertyDescriptor(KeyboardEvent.prototype, "keyCode");
Object.defineProperty(KeyboardEvent.prototype, "keyCode", {
"enumerable" : true,
"configurable" : true,
"get" : function() {
if("__keyCode" in this)return this["__keyCode"];
return _native_keyCode_getter.call(this);
},
"set" : function(newValue) {
return this["__keyCode"] = isNaN(newValue) ? 0 : newValue;
}
});
Cập nhật Có nhiều triển khai khác nhau của initKeyboardEvent.Trong polyfill KeyboardEvent của tôi, tôi phát hiện ra nó bằng cách nào đó như thế này (gist):
var _initKeyboardEvent_type = (function(e) {
try {
e.initKeyboardEvent(
"keyup" // in DOMString typeArg
, false // in boolean canBubbleArg
, false // in boolean cancelableArg
, global // in views::AbstractView viewArg
, "+" // [test]in DOMString keyIdentifierArg | webkit event.keyIdentifier | IE9 event.key
, 3 // [test]in unsigned long keyLocationArg | webkit event.keyIdentifier | IE9 event.location
, true // [test]in boolean ctrlKeyArg | webkit event.shiftKey | old webkit event.ctrlKey | IE9 event.modifiersList
, false // [test]shift | alt
, true // [test]shift | alt
, false // meta
, false // altGraphKey
);
return ((e["keyIdentifier"] || e["key"]) == "+" && (e["keyLocation"] || e["location"]) == 3) && (
e.ctrlKey ?
e.altKey ? // webkit
1
:
3
:
e.shiftKey ?
2 // webkit
:
4 // IE9
) || 9 // FireFox|w3c
;
}
catch (__e__) { alert("browser do not support KeyboardEvent") }
})(document.createEvent("KeyboardEvent"));
var e = document.createEvent("KeyboardEvent");
...
if("initKeyEvent" in e) {//FF
//https://developer.mozilla.org/en/DOM/event.initKeyEvent
e.initKeyEvent(type, _bubbles, _cancelable, _view, _ctrlKey, _altKey, _shiftKey, _metaKey, _keyCode, _keyCode);
}
else if("initKeyboardEvent" in e) {//https://developer.mozilla.org/en/DOM/KeyboardEvent#initKeyboardEvent()
if(_try_initKeyboardEvent) {
if(_initKeyboardEvent_type == 1) { // webkit
//http://stackoverflow.com/a/8490774/1437207
//https://bugs.webkit.org/show_bug.cgi?id=13368
e.initKeyboardEvent(type, _bubbles, _cancelable, _view, _key, _location, _ctrlKey, _shiftKey, _altKey, _metaKey, _altGraphKey);
}
else if(_initKeyboardEvent_type == 2) { // old webkit
//http://code.google.com/p/chromium/issues/detail?id=52408
e.initKeyboardEvent(type, _bubbles, _cancelable, _view, _ctrlKey, _altKey, _shiftKey, _metaKey, _keyCode, _keyCode);
}
else if(_initKeyboardEvent_type == 3) { // webkit
e.initKeyboardEvent(type, _bubbles, _cancelable, _view, _key, _location, _ctrlKey, _altKey, _shiftKey, _metaKey, _altGraphKey);
}
else if(_initKeyboardEvent_type == 4) { // IE9
//http://msdn.microsoft.com/en-us/library/ie/ff975297(v=vs.85).aspx
e.initKeyboardEvent(type, _bubbles, _cancelable, _view, _key, _location, _modifiersListArg, _repeat, _locale);
}
else { // FireFox|w3c
//http://www.w3.org/TR/DOM-Level-3-Events/#events-KeyboardEvent-initKeyboardEvent
//https://developer.mozilla.org/en/DOM/KeyboardEvent#initKeyboardEvent()
e.initKeyboardEvent(type, _bubbles, _cancelable, _view, _char, _key, _location, _modifiersListArg, _repeat, _locale);
}
}
}
Tôi đã xóa nhận xét khỏi câu hỏi và đặt câu trả lời, vì tôi nghĩ rằng thậm chí không thực sự giải quyết được câu hỏi, nó có thể thực sự hữu ích cho những người gặp vấn đề tương tự như tôi đã làm. – fserb
Làm thế nào bạn giải quyết được vấn đề? Tôi cũng đang đối mặt với vấn đề mô phỏng nhấn phím trái và phải trên chrome/safari. Nhưng không thành công, bạn đã làm thế nào? – MaX
Bạn đã thử giải pháp tôi đã đăng chưa? Nó làm việc cho tôi và có lẽ sẽ giúp bạn đạt được mục tiêu của bạn, do đó, nó lạ với tôi rằng bạn chấp nhận câu trả lời của riêng bạn "nó là một lỗi". – Dennis