-3

我有一个看似简单的问题,但我找不到解决方案。给定以下代码:

<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 中它可以正常工作(通过键码发出警报)。

如果我使用window.onkeypress而不是文档处理程序,则在 IE 中根本不会调用它。如果我在事件中附加处理程序,onload它没有任何区别。使用类似keydownkeyup不产生影响的事件(在 IE 中仍然存在问题)。

然而,当我使用jsfiddle 作为示例时,它在 IE 中运行良好。

那么:jsfiddle 与上面的代码有什么不同,我如何让它在 IE 中工作?

4

3 回答 3

3

IE 不会将事件对象传递给您的事件处理程序;相反,它在 window.event 中可用。在 IE 中,当在事件侦听器中使用 addEventListener 或 attachEvent“this”时,将引用窗口而不是事件来自并附加/添加的元素。

        document.onkeypress = function(ev) {
            ev = window.event||ev;
            var key = ev.charCode || ev.keyCode;
            alert(key);
        }
于 2013-05-27T04:42:16.967 回答
3

包含 DOCTYPE 在任何浏览器中都很重要,但在 IE 中更是如此。如果省略一个,我相信它使用的是怪癖模式,这意味着不好的事情。您可以添加 HTML5 文档类型:

<!DOCTYPE html>

Doctypes 应该是 HTML 文件中的第一个非空行。这意味着即使是注释也不应该出现在文档类型之前,并且可能导致 IE 使用怪癖模式。

这是关于标准模式和怪癖模式之间区别的一个很好的小读物:https ://developer.mozilla.org/en-US/docs/Quirks_Mode_and_Standards_Mode

另外,请注意,IE 使用全局event变量来表示事件,因此您应该检查它而不是认为它已损坏。例如:

ev = ev || window.event;

可以替换您的if语句行。

于 2013-05-27T04:48:14.837 回答
0

jQuery 还有助于解决其中一些跨浏览器问题,这里是 jQuery:

$(document).keypress(function(e) {
      alert(e.keyCode);
});

在这里提琴

于 2013-05-27T04:45:44.613 回答