为什么在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
在每个浏览器中都不起作用,你需要从我的其他答案中执行returnValue
和preventDefault()
。 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; } } });