我正在尝试通过 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?
);
似乎没有任何方法可以传递密钥代码(在keyCode
orwhich
属性中)。我试图关注 WebKit 源代码,但这并没有帮助。KeyboardEvent
IDL 定义似乎引用了一个属性keyCode
(和一个charCode
属性),但我一直无法弄清楚它是如何获得值的。
来自 WebKit 源的相关文件:
这是一个演示这个问题的小提琴。打开控制台,KeyboardEvent
应该在那里进行检查。那是合成的。注意keyCode
和which
属性如何具有值0
。如果您聚焦“结果”框架并按任意键,您可以检查本机事件对象以查看差异。
所以,我的问题是:是否可以在 WebKit中为合成对象添加一个keyCode
或值,如果可以,我该怎么做?which
KeyboardEvent