使用输入元素上的修饰键触发单击事件

Tom*_*oss 4 jquery google-chrome ruby-on-rails poltergeist jquery-events

我正在为某些功能编写测试,其中涉及用户按住 Shift 键并单击复选框。我用$('input').trigger($.Event('click', { shiftKey: true }));它来模拟。

但是,当事件侦听器被调用时,event.shiftKey属性总是会被报告为false源自我的合成事件,而真正的点击会产生所需的效果。更令人困惑的是,在非input元素上触发相同的事件似乎工作得很好。例如,请参阅http://jsfiddle.net/hus​​kssk1/ 。

我在浏览器(Chrome 39、OS X)和测试堆栈(Poltergeist 1.5.1 + PhantomJS 1.9.8)中观察到这种行为。

这是什么原因造成的?有什么办法解决吗?

PS我的完整测试堆栈是Ruby on Rails + RSpec + Capybara + Poltergeist + PhantomJS,如果您知道触发shift-click的更好方法,请告诉我!

gly*_*uck 5

@Vijay 是正确的,这是 jQuery 问题。问题出在这一行: https: //github.com/jquery/jquery/blob/master/src/event.js#L577。它是在 jquery 1.9.0 中添加的

因此,您可以通过向 javascript 添加以下代码来对 jQuery 进行猴子修补:

delete jQuery.event.special.click.trigger
Run Code Online (Sandbox Code Playgroud)

并且复选框单击将按预期工作:http://jsfiddle.net/ofbazqvo/(注意,我e.stopPropogation()也对正文进行了评论),但有一个例外:input.checked值在“onclick”回调中将无效,但稍后会更新为正确的值(令人惊讶的是,这就是为什么这个特殊的复选框处理被添加到 jquery 中)。

或者,您可以通过纯 JavaScript 手动调度事件: http: //jsfiddle.net/6dutftkt/1/。这在 Chrome 中没有任何怪癖。