模拟shift+1键盘事件,并在事件处理程序中检索它



我正在为我的框架制定一个规范,该规范需要用shift键测试事件。所以我想实际地插入一个!,就好像我按下了shift + 1一样。

我一直在使用Syn框架,但无法使其模拟SHIFT + 1根据文档应该是

Syn.type('[shift]1[shift-up]', 'textInput2'); 

但这并不奏效。我希望!字符,event.shiftKeytrueevent.key33,但我得到的是1而不是!event.key == 49

使用Syn或香草javascript怎么可能做到这一点?

我制作了这个jsFiddle来测试它,检查控制台。

如果您在这里查看Syn测试https://github.com/bitovi/syn/blob/c77ae2cbb19ff0a5d3ecd3f9968e15adad289a79/test/qunit/key_test.js

你可以看到他们通过做"[shift]a[shift-up]"来模拟大写的"a"。Syn只是创建一个事件并传递和设置值。它不模拟较低级别的键盘交互。

 Syn.type('[shift]![shift-up]', 'textInput2');
 // outputs 33 true 

设置超时会使其工作,不确定原因,但它确实:http://jsfiddle.net/2zsNV/5/

好吧,你是对的,Syn没有正确地做到这一点,我可以猜到为什么——浏览器不能告诉你的键盘布局(请参阅此处:用javascript检测键盘布局),所以它真的不能告诉你Shift+1应该得到什么,所以它只给你一个"1"。

你会认为

Syn.type('[shift]![shift-up]', 'textInput2'); 

会按预期工作,但也不行。。。我认为这是Syn的一个错误。

那么,你能在原始JavaScript中做到这一点吗?我可以靠近。

显然,很难让它跨浏览器工作,这让我陷入了尝试不同事物的兔子洞。首先,我研究了这个问题:有可能通过编程模拟按键事件吗?但这在chrome中并不正确,然后我根据它们的文档尝试了各种事件和值的组合,但没有取得更多成功。然后我发现了这个问题:在Chrome上启动一个键盘事件,导致我产生了这个代码。

将该代码粘贴到JS中,然后用调用它

var e = crossBrowser_initKeyboardEvent("keypress", {"key": 1, "char": "!", shiftKey: true})
document.getElementById('textInput2').dispatchEvent(e);

将给出您期望的输出但是,它实际上并没有将值写入输入框。当然,你可以伪造它,也可以在那里添加文本,我不确定这是对事件工作方式的限制,还是代码有问题。当然,为了测试,这可能就是你所需要的。

这是小提琴,也许其他人能跳到最后。

最新更新