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

我正在为一些涉及用户按住Shift键点击复选框的function编写测试。 我正在使用$('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的更好方法,请告诉我!

 body.on('click', function(e) { //e.stopPropagation(); console.log('body', e.shiftKey); }); 

我刚刚更新了你的jsfiddle: http : //jsfiddle.net/hus​​kssk1/1/

我做的唯一更改是jQuery版本到1.8.3,因为它没有触发输入的click事件所以我评论来自body click事件处理程序的e.stopPropogation

这清楚地表明jQuery的两个版本之间存在某些不同。

@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 

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

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

您可以查看以下小提琴,了解您的问题的答案:

http://jsfiddle.net/fsp265p8/

您只需按shift键并单击结果区域,即可通过单击检测shift键。

代码如下:

 function mouseDown(e) { var shiftPressed=0; if (parseInt(navigator.appVersion)>3) { var evt = e ? e:window.event; if (document.layers && navigator.appName=="Netscape" && parseInt(navigator.appVersion)==4) { var mString =(e.modifiers+32).toString(2).substring(3,6); shiftPressed=(mString.charAt(0)=="1"); self.status="modifiers="+e.modifiers+" ("+mString+")" } else { shiftPressed=evt.shiftKey; self.status="" + "shiftKey="+shiftPressed } if (shiftPressed) alert ("Mouse clicked with the following keys:\n" + (shiftPressed ? "Shift ":"") ); } return true; } if (parseInt(navigator.appVersion)>3) { document.onmousedown = mouseDown; if (navigator.appName=="Netscape") { document.captureEvents(Event.MOUSEDOWN); } } 

希望这可以帮助

Body是什么,它有一些元素而不是整个页面(意味着空白页面)。 因此,如果body中没有元素,则click事件不会触发。 还要指出一个事情是您的复选框点击事件发生,因为它本身就是一个元素。

如果您希望在单击时触发页面,则必须使用$(document)代替$(document.body)

 $(document).on('click', function(e) { e.stopPropagation(); console.log('body', e.shiftKey); }); 

工作演示

此外,要validation正文区域,您可以添加CSS进行测试

 body{ border:1px solid #F00; } 

在演示中查看您的代码,为什么它不起作用(仅适用于演示的红色边框区域)