我正在为我的框架制定一个规范,该规范需要用shift
键测试事件。所以我想实际地插入一个!
,就好像我按下了shift + 1
一样。
我一直在使用Syn框架,但无法使其模拟SHIFT + 1
根据文档应该是
Syn.type('[shift]1[shift-up]', 'textInput2');
但这并不奏效。我希望!
字符,event.shiftKey
是true
,和event.key
是33
,但我得到的是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);
将给出您期望的输出但是,它实际上并没有将值写入输入框。当然,你可以伪造它,也可以在那里添加文本,我不确定这是对事件工作方式的限制,还是代码有问题。当然,为了测试,这可能就是你所需要的。
这是小提琴,也许其他人能跳到最后。