首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用JavaScript在Safari中激发键盘事件

使用JavaScript在Safari中激发键盘事件
EN

Stack Overflow用户
提问于 2009-06-07 08:49:35
回答 4查看 192.5K关注 0票数 85

我正在尝试使用JavaScript在Safari中模拟键盘事件。

我已经尝试过了:

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

...and也是这样的:

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

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

有人知道如何在Safari中可靠地创建和分派键盘事件吗?(如果可能的话,我更喜欢用纯JavaScript实现它。)

EN

回答 4

Stack Overflow用户

发布于 2012-08-09 22:44:48

我正在研究DOM Keyboard Event Level 3 polyfill。在最新的浏览器中或使用此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
});

示例here

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

Polyfill demo

票数 45
EN

Stack Overflow用户

发布于 2011-05-07 17:26:23

您是否正确地调度了事件?

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) });
}
票数 31
EN

Stack Overflow用户

发布于 2013-01-23 05:43:28

这是由于Webkit中的bug造成的。

您可以使用createEvent('Event')而不是createEvent('KeyboardEvent')来解决Webkit错误,然后分配keyCode属性。参见this answerthis example

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/961532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档