为什么在keydown回调中返回false不会停止按钮单击事件?

我有一个按钮和以下的javascript例程。

$("button").keydown( function(key) { switch(key.keyCode) { case 32: //space return false; } } ); 

据我了解, return false; 会阻止按键被处理。 所以$("button").click(); 不会被称为。 对于其他keyCodes,这可以按预期工作。 例如,如果我拦截40 ,即向下按钮,则页面不滚动。

我在Firefox中注意到了这种行为。

为什么return false; 没有停止空间上的按钮点击事件? javascript规范对此有何评论?

希望这能回答你的问题:

  

return false; 如果在HTML中的事件处理程序属性的末尾调用,则成功取消跨浏览器的事件。 据我所知,这种行为在任何地方都没有正式指定。

如果您通过DOM元素上的事件处理程序属性(例如button.onkeydown = function(evt) {...} )或使用addEventListener / attachEvent (例如button.addEventListener("keydown", function(evt) {...}, false) )然后只是从该函数返回false在每个浏览器中都不起作用,你需要从我的其他答案中执行returnValuepreventDefault()preventDefault在DOM 2规范中指定,并由大多数主流现代浏览器实现。 returnValue是特定于IE的。

首先,如果您正在检测可打印字符(如空格),那么使用keypress事件会更好。 其次,防止默认操作的方法是在非IE浏览器中对事件调用preventDefault() ,并在IE中将事件的returnValue属性设置为false

 var button = document.getElementById("button"); button.onkeypress = function(evt) { evt = evt || window.event; var charCode = evt.keyCode || evt.which; if (charCode == 32) { if (evt.preventDefault) { evt.preventDefault(); } else { evt.returnValue = false; } } }; 

我不是jQuery专家,我认为它负责为您获取事件:

 $("button").keypress(function(evt) { var charCode = evt.keyCode || evt.which; if (charCode == 32) { if (evt.preventDefault) { evt.preventDefault(); } else { evt.returnValue = false; } } });