使用输入元素上的修饰键触发单击事件
我正在为一些涉及用户按住Shift键点击复选框的function编写测试。 我正在使用$('input').trigger($.Event('click', { shiftKey: true }));
模拟那个。
但是当事件监听器被调用时, event.shiftKey
属性总是在源自我的合成事件时报告为false
,而实际点击产生所需的效果。 更令人困惑的是,在非input
元素上触发相同的事件似乎工作得很好。 例如,请参见http://jsfiddle.net/huskssk1/ 。
我在我的浏览器(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/huskssk1/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中没有任何怪癖。
您可以查看以下小提琴,了解您的问题的答案:
您只需按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; }
在演示中查看您的代码,为什么它不起作用(仅适用于演示的红色边框区域)