使用本机JavaScript模拟按键

Simulate key press using native JavaScript

本文关键字:模拟 JavaScript 本机      更新时间:2023-09-26

我正在尝试在应用程序中模拟键盘命令。目前,我可以按下任何箭头键,我能够很好地捕捉事件。然而,我正在尝试模拟关键事件,但我没有任何运气。

这是我的代码:

  //Event
  this.remoteEvent = function(arg_event) {
    var e = document.createEvent('KeyboardEvent');
    var method = (typeof e.initKeyboardEvent !== 'undefined') ? "initKeyboardEvent" : "initKeyEvent";
    switch (arg_event) {
      case 'up':
        e[method]('keydown', true, true, window, false, false, false, false, 0, 38);
        break;
      case 'right':
        e[method]('keydown', true, true, window, false, false, false, false, 0, 39);
        break;
      case 'down':
        e[method]('keydown', true, true, window, false, false, false, false, 0, 40);
        break;
      case 'left':
        e[method]('keydown', true, true, window, false, false, false, false, 0, 37);
        break;
      case 'enter':
        e[method]('keydown', true, true, window, false, false, false, false, 0, 13);
        break;
    }
    document.dispatchEvent(e);
  }

我是不是做错了什么?我的目标是不使用jQuery,并且主要与跨浏览器兼容。

编辑:这是我在调度前记录的事件:

KeyboardEvent {
  altGraphKey: false
  altKey: false
  bubbles: true
  cancelBubble: false
  cancelable: true
  charCode: 0
  clipboardData: undefined
  ctrlKey: false
  currentTarget: null
  defaultPrevented: false
  detail: 0
  eventPhase: 0
  keyCode: 0
  keyIdentifier: "false"
  keyLocation: 0
  layerX: 0
  layerY: 0
  location: 0
  metaKey: true
  pageX: 0
  pageY: 0
  path: NodeList[0]
  repeat: false
  returnValue: true
  shiftKey: false
  srcElement: document
  target: document
  timeStamp: 1410276114922
  type: "keydown"
  view: Window
  which: 0
}

编辑2:这是我捕获事件的代码:

document.addEventListener('keydown', key_down_event, false);
//Key down event
function key_down_event(arg_event)
{
  //Ignore all key events if any modifier key is pressed
  if (arg_event.altKey || arg_event.ctrlKey || arg_event.metaKey || arg_event.shiftKey) return;
  //Get the source
  var source = arg_event.target;
  var destination = null;
  var direction = null;
  var escape = false;
  //Switch on key
  switch(arg_event.keyCode)
  {
    case VK_LEFT: direction = 'left'; break;
    case VK_RIGHT: direction = 'right'; break;
    case VK_DOWN: direction = 'down'; break;
    case VK_UP: direction = 'up'; break;
    case VK_ESC: escape = true; break;
  }
  if (!direction && !escape) return;
  arg_event.stopPropagation();
  arg_event.preventDefault();
  console.log(direction);
}

根据https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent,initKey*Event方法被完全打破。比较它提供的不同API:

  • 旧DOM2:

    void initKeyEvent(in DOMString typeArg, 
                      in boolean canBubbleArg, 
                      in boolean cancelableArg, 
                      in boolean ctrlKeyArg, 
                      in boolean altKeyArg, 
                      in boolean shiftKeyArg, 
                      in boolean metaKeyArg, 
                      in unsigned long keyCodeArg, 
                      in unsigned long charCodeArg, 
                      in views::AbstractView viewArg);
    
  • DOM3(不支持壁虎):

    void initKeyboardEvent(in DOMString typeArg,
                           in boolean canBubbleArg,
                           in boolean cancelableArg,
                           in views::AbstractView viewArg,
                           in DOMString charArg,
                           in DOMString keyArg,
                           in unsigned long locationArg,
                           in DOMString modifiersListArg,
                           in boolean repeat);
    
  • Webkit/闪烁:

    void initKeyboardEvent(in DOMString typeArg,
                           in boolean canBubbleArg,
                           in boolean cancelableArg,
                           in views::AbstractView viewArg,
                           in DOMString keyIndentifierArg,
                           in unsigned long locationArg,
                           in boolean ctrlKeyArg,
                           in boolean altKeyArg,
                           in boolean shiftKeyArg,
                           in boolean metaKeyArg,
                           in boolean altGraphKeyArg)
    
  • MSIE:

    void initKeyboardEvent(in DOMString typeArg,
                           in boolean canBubbleArg,
                           in boolean cancelableArg,
                           in views::AbstractView viewArg,
                           in DOMString keyArg,
                           in unsigned long locationArg,
                           in DOMString modifierListArg,
                           in boolean repeatArt,
                           in DOMString locationArg);
    

规格说明:

initKeyboardEvent方法已弃用。事件构造函数语法[…]是用于初始化KeyboardEvent的预期未来语法。

然而,我找不到详细说明构造函数初始化的规范。在此之前,您可能需要使用此polyfill。