我正在尝试使用initKeyEvent模拟一些键盘键码(Alt + W):

evt = document.createEvent("KeyboardEvent");
evt.initKeyEvent("keypress",true,true,window,0,true,0,0,?,?);
body.dispatchEvent(evt);


问题是我找不到w的虚拟键码值和Unicode字符。
Firefox键事件记录在here中,但我对此毫无意义。

initKeyEvent被指定为here

最佳答案

确实有点复杂,主要是出于历史原因。根据您查看的是keypress还是keydown / keyup事件,情况有所不同。 keypress事件尽可能使用字符代码。这意味着对于可打印字符(可以在文本字段中输入的字符),应在charCode参数为0时设置keyCode参数。charCode参数实际上是字符的ASCII码,这意味着对于您的情况(字母w),您可以这样做:

evt.initKeyEvent("keypress", true, true, window, 0, true, 0, 0, 0, "w".charCodeAt(0));


对于不可打印的字符,或者使用keydown / keyup事件时,应设置keyCode参数并将0传递为charCode。此参数引用virtual key codes。您将在此处使用的关键代码是DOM_VK_W

evt.initKeyEvent("keydown", true, true, window, 0, true, 0, 0, evt.DOM_VK_W, 0);


常量DOM_VK_W仅在Firefox中定义,但是,为了与其他浏览器兼容,您应该使用其数值:

evt.initKeyEvent("keydown", true, true, window, 0, true, 0, 0, 87, 0);


对于许多字符,虚拟键码与ASCII码相同,但是它们不是同一回事。尤其是,虚拟键码是指在键盘上按下的实际按钮,因此它们不能区分大小写字母-这与在keydown上处理的CtrlW之类的组合键无关。另一方面,文本字段(处理keypress)非常关心这种差异-这里使用的ASCII码表示要添加的实际字符。

请注意,这种方法(区分在键盘上按下的按钮的事件和这些按钮产生的实际字符之间的区别)和实际的虚拟键代码均已从Windows“借用”。

07-26 08:14