我正在尝试使用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。
答案 0 :(得分: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
/ 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码相同,但它们不是一回事。特别是,虚拟键代码指的是键盘上按下的实际按钮,因此它们不区分小写字母和大写字母 - 这与 Ctrl W等键组合无关。 在keydown
处理。另一方面,文本字段(处理keypress
)非常关心这种差异 - 这里使用的ASCII代码表示要添加的实际字符。
请注意,这种方法(区分键盘上按下按钮的事件和这些按钮产生的实际字符)和实际虚拟键码都是从Windows“借用”的。
答案 1 :(得分: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);
注意:我无法对此进行测试,而且直接基于文档。