2

我正在尝试使用以下方法模拟一些键盘键码(Alt+ WinitKeyEvent

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

问题是我找不到w. 此处记录了 Firefox 关键事件,但我无法理解。

这里initKeyEvent指定。

4

2 回答 2

4

这确实有点复杂,主要是出于历史原因。事情会有所不同,具体取决于您是在看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 作为. 该参数是指虚拟键码。您将在此处使用的关键代码是:keyupkeyCodecharCodeDOM_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“借来的”。

于 2013-01-18T08:23:23.470 回答
0

查看您引用的页面,您可以使用第二个文档中定义的虚拟键代码:

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);

注意:我无法对此进行测试,它直接基于文档。

于 2013-01-18T07:02:43.817 回答