在JavaScript中触发键盘事件

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我试图在Safari中使用JavaScript来模拟键盘事件。

我试过这个:

var event = document.createEvent("KeyboardEvent");
event.initKeyboardEvent("keypress", true, true, null, false, false, false, false, 115, 0);

...也是这样的:

var event = document.createEvent("UIEvents");
event.initUIEvent("keypress", true, true, window, 1);
event.keyCode = 115;

然而,在尝试了两种方法之后,我遇到了同样的问题:代码执行后,事件对象的keyCode/ which属性被设置为0,而不是115

有谁知道如何可靠地创建和发送Safari中的键盘事件?(如果可能的话,我宁愿用普通的JavaScript来实现它。)

提问于
用户回答回答于

我正在研究DOM键盘事件3级填充。在最新的浏览器中或者使用这个polyfill,你可以这样做:

element.addEventListener("keydown", 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})

现在我的polyfill支持遗留属性“keyCode”,“charCode”和“which”

var e = new KeyboardEvent("keydown", {
    bubbles : true,
    cancelable : true,
    char : "Q",
    key : "q",
    shiftKey : true,
    keyCode : 81
});

这里的例子

另外这里是与我的polyfill分开的跨浏览器initKeyboardEvent:(gist)

用户回答回答于

您是否正确派遣活动?

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

如果你使用jQuery,你可以这样做:

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

扫码关注云+社区