我正在尝试使用以下方法模拟一些键盘键码(Alt+ W)initKeyEvent
:
evt = document.createEvent("KeyboardEvent");
evt.initKeyEvent("keypress",true,true,window,0,true,0,0,?,?);
body.dispatchEvent(evt);
问题是我找不到w
. 此处记录了 Firefox 关键事件,但我无法理解。
在这里initKeyEvent
指定。
这确实有点复杂,主要是出于历史原因。事情会有所不同,具体取决于您是在看keypress
还是keydown
/keyup
事件。该keypress
事件尽可能使用字符代码。这意味着对于可打印字符(您可以在文本字段中使用的字符),charCode
应在keyCode
参数为 0时设置参数。charCode
参数实际上是字符的 ASCII 码,这意味着在您的情况下(字母w
)您会这样做:
evt.initKeyEvent("keypress", true, true, window, 0, true, 0, 0, 0, "w".charCodeAt(0));
另一方面,对于不可打印字符或使用keydown
/事件时,您应该设置参数并将 0 作为. 该参数是指虚拟键码。您将在此处使用的关键代码是:keyup
keyCode
charCode
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 码相同,但它们不是一回事。特别是,虚拟键代码是指在键盘上按下的实际按钮,因此它们不区分小写和大写字母 - 这与CtrlW处理的组合键无关keydown
。另一方面,文本字段(处理keypress
)非常关心这种差异 - 这里使用 ASCII 代码来指示要添加的实际字符。
请注意,这种方法(区分键盘上按下按钮的事件和这些按钮产生的实际字符)和实际的虚拟键代码都是从 Windows“借来的”。
查看您引用的页面,您可以使用第二个文档中定义的虚拟键代码:
94 const unsigned long DOM_VK_W = 0x57;
这将给出代码
evt.initKeyEvent("keypress", true, true, window, 0, true, 0, 0, 87, 0);
或者您可以传递相同的值的字符代码(最后一个参数):
evt.initKeyEvent("keypress", true, true, window, 0, true, 0, 0, 0, 87);
注意:我无法对此进行测试,它直接基于文档。