Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确附加到按键事件?_Javascript_Internet Explorer_Keypress - Fatal编程技术网

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;