prototype / javascript - firefox没有触发keypress / keydown事件,除非焦点在文本框中

时间:2009-03-10 13:55:02

标签: javascript events prototypejs

以下在IE6,IE7和Chrome上运行良好。不适用于ff 3.0.7。

<html><head>
<script src="prototype.js" type="text/javascript" ></script>
<script type="text/javascript">
Event.observe(window, 'load', 
    function(){
        Event.observe(document.body, 'keydown', myEventHandler);
        alert('window load');
    });
function myEventHandler(evt) {
    alert(evt);
}
</script>
</head>
<body >
<input type="text" /><br><br>
</body></html>

编辑:“不工作”我的意思是myEventHandler没有在firefox中启动。

EDIT2:此外,当焦点在输入元素上时,它可以正常工作。我想为所有的keydowns开火。

4 个答案:

答案 0 :(得分:7)

我不知道为什么你的代码不起作用,但它太复杂了 - 这应该可以解决问题:

document.observe('keydown', myEventHandler);

由于load可以立即使用,因此无需等待document


您的代码无效,因为并非所有关键事件都来自文档的body元素。 Opera有类似Firefox中的问题,但原始元素似乎还取决于鼠标光标的位置。

无论如何,修复只是捕获document级别的事件,因为只要没有人阻止他们这样做,所有DOM事件最终都会冒出document

答案 1 :(得分:3)

我还发现我的keydown事件没有在Firefox中针对类似代码触发。在我的情况下,我不需要使用Safari和Firefox以外的任何东西,所以我没有在IE上测试过这个。然而,观察'文档'而不是'document.body'似乎有效:

document.observe('dom:loaded', function() {
    Event.observe(document, 'keypress', function(evt) {
       alert("In Keypress Function");
    });
});

现在,我意识到这是观察按键,而不是keydown。 AFAIK,keypress在keydown之后生成。

答案 2 :(得分:0)

尝试使用表单元素包装输入。如果这没有帮助,请在div中扭曲它并将处理程序附加到div。

答案 3 :(得分:0)

顺便说一下,对于tab,esc等,你需要使用keyup,而不是keypress。至少对于Safari来说,花了我一段时间才想出那个。

在anon中添加以下行:alert ("Key :" + evt.keyCode);。功能。只有字形才会响应。

- 戴夫