Javascript 如何正确附加到按键事件?
我有一个看似简单的问题,我找不到解决办法。给定以下代码:Javascript 如何正确附加到按键事件?,javascript,internet-explorer,keypress,Javascript,Internet Explorer,Keypress,我有一个看似简单的问题,我找不到解决办法。给定以下代码: <html> <head> <script type="text/javascript"> document.onkeypress = function(ev) { if (!ev) { alert("Broken"); return; } var key = ev.charCode || e
<html>
<head>
<script type="text/javascript">
document.onkeypress = function(ev) {
if (!ev) { alert("Broken"); return; }
var key = ev.charCode || ev.keyCode;
alert(key);
}
</script>
</head>
<body>Test</body>
</html>
如果我将它保存为文件并加载到IE中,然后我按下一个键,它总是会出现中断的警报,而在Firefox中,它可以很好地处理keycode警报
如果我使用window.onkeypress而不是文档处理程序,它在IE中根本不会被调用。如果我在onload事件中附加处理程序,它不会有什么区别。使用像keydown或keyup这样的事件并不会对IE造成影响
然而,当我使用它时,它在IE中运行良好
那么:JSFIDLE与上面的代码有什么不同?我如何让它在IE中工作?IE不会将事件对象传递给您的事件处理程序;相反,它在window.event中可用。在IE中,当使用addEventListener或attachEvent时,事件侦听器中的此项将引用窗口,而不是事件来源和附加/添加的元素
document.onkeypress = function(ev) {
ev = window.event||ev;
var key = ev.charCode || ev.keyCode;
alert(key);
}
jQuery还可以帮助解决一些跨浏览器问题,以下是jQuery:
$(document).keypress(function(e) {
alert(e.keyCode);
});
包含DOCTYPE在任何浏览器中都很重要,但在IE中更为重要。如果省略一个DOCTYPE,我相信它会使用怪癖模式,这意味着糟糕的事情。您可以添加HTML5 doctype:
<!DOCTYPE html>
可以替换您的if语句行。您的代码和小提琴的区别在于它将您的代码放入window.onload。只是说说而已。还有,你的DOCTYPE在哪里?你应该把最上面的作为第一行。此外,你不需要检查电动汽车。只需使用ev=ev | | window.event;作为函数的第一行,去掉if行。不确定这是否是问题所在,但DOCTYPE在IE中尤其重要;否则IE将以怪癖模式呈现。好了,就是这样,DOCTYPE丢失了。我不敢相信IE会以如此不明显的微妙方式崩溃,特别是因为实际的代码在页面中嵌入了更多的javascript,而这些javascript只起作用fine@Ian当前位置如果您将此作为答案发布,我将接受。这似乎也有效。可能应该同时执行两项操作:添加DOCTYPE和使用window.event IE中的this context is window语句不正确。在这种情况下,您考虑的是attachEvent。当侦听器作为DOM属性添加时,这将引用所有浏览器中的元素。此外,在ES5中,术语上下文仅用于以下方面:。函数的这只是该上下文的一部分,可以通过调用在严格模式下设置为任何对象或任何值。@RobG是的,您是正确的。如果要附加多个处理程序,则不能使用Element.onSomething,但必须使用attachEvent或addEventListener@ChrisWue添加doctype很重要,在firefox页面中,未定义doctype时,呈现方式会有所不同;例如,如果忽略大小值的px。任何浏览器都会进入怪癖模式,因为如果没有文档类型,html是无效的html,浏览器会为您更正它。
ev = ev || window.event;