1

我正在尝试通过 JavaScript 创建一个KeyboardEvent尽可能接近浏览器本机创建的一个(例如,当我按下一个键时,keyDown事件会触发。与此事件关联的事件对象就是我正在尝试的重现)。

createEvent方法可用于创建特定类型的事件:

var evt = document.createEvent("KeyboardEvent");

然后,该initKeyboardEvent方法可用于使用一些数据初始化事件对象。此方法的签名似乎在浏览器之间差异很大。我已经在 Firefox 中使用了这个initKeyEvent方法,它使用了这个方法。据我所知,WebKit 期望以下论点:

evt.initKeyboardEvent(
    "keydown",          // The name of the event
    true,               // Whether it bubbles
    true,               // Whether it can be cancelled
    window,             // The `window` in which it is being fired
    "U+004A",           // The "key identifier" (this is an uppercase "J")
    0,                  // The "key location" (0 for the normal character keys)
    false,              // Whether the Control key was held
    false,              // Whether the Alt key was held 
    false,              // Whether the Shift key was held 
    false,              // Whether a meta key was held 
    false               // Whether the "Alt Graph" key was held?
);

似乎没有任何方法可以传递密钥代码(在keyCodeorwhich属性中)。我试图关注 WebKit 源代码,但这并没有帮助。KeyboardEventIDL 定义似乎引用了一个属性keyCode(和一个charCode属性),但我一直无法弄清楚它是如何获得值的。

来自 WebKit 源的相关文件:

这是一个演示这个问题的小提琴。打开控制台,KeyboardEvent应该在那里进行检查。那是合成的。注意keyCodewhich属性如何具有值0。如果您聚焦“结果”框架并按任意键,您可以检查本机事件对象以查看差异。

所以,我的问题是:是否可以在 WebKit中为合成对象添加一个keyCode或值,如果可以,我该怎么做?whichKeyboardEvent

4

0 回答 0