在FireFox 3.6.25中,javascript事件的keyCode属性在keydown、keypress或keyup事件中无法正常工作。

3

请有心人帮助一个非常绝望和疲惫的新手。我已经到处搜索答案,但是没有结果。

我想捕获keyCode/charCode以测试是否按下了回车键(我一直在使用keydown,但只要能工作,我就不介意)。我已经尝试了每种可能的解决方案,在IE、Safari、Chrome和Opera中都可以正常工作,但在FireFox 3.6.25(最新版本)中却无法工作?!我知道事件肯定会触发,因为我可以从调用的函数中显示一个简单的警报框,但是声明一个变量来保存事件.keyCode的内容,那是另一回事!

我的表单代码基本上是这样的...

<form method="post" name="giftaidform" onsubmit="javascript:return validateForm();" action="../scripts/form-to-email.php">
<table width="500" border="0" align="center" cellpadding="5" cellspacing="0">
  <tr>
    <td width="180" align="right">Forename:</td>
    <td align="left"><input name="forename" type="text" size="30" maxlength="30" onfocus="javascript:setUnchecked(this);" onkeydown="javascript:testForEnter(this);" onblur="javascript:isValidName(this);"></td>
  </tr>

and so on...

As for my "testForEnter" function...

function testForEnter(obj) {
// store code of key that was pressed
var keyCode = obj.keyCode;
alert(keyCode);
// if the enter key was pressed then prevent default action
if (keyCode == 13) {
    if(event.preventDefault) event.preventDefault();
    event.returnValue = false;
}
 }

我尝试过各种其他表述,包括 obj.charCode 以及下面这种方式?!

function checkKey(evt) {
  var keyID = (window.event) ? window.event.keyCode : event.which;
  alert(keyID);
}

在 FireFox 中什么都不起作用!


1
什么都不起作用,因为你将参数命名为evt而不是event。在你的代码中,window.eventevent都指向window.event,但在Firefox中不存在。你应该先规范化事件,使用var event = window.event || event;。最新的Firefox版本是9,而不是3.6。此外,请注意,如果您想要访问它,则必须将event对象传递给内联事件处理程序中的函数。 - Felix Kling
你不需要在“onfoo”处理程序字符串的开头添加“javascript:”。 - Pointy
@FelixKling,你是传奇!我现在已经通过了“事件”,并解决了我的有问题的代码,它完美地工作了 - 更不用说升级到Firefox 9版本(我不知道我如何安装旧版本)! - Dougie
@Pointy - 谢谢!我现在可以简化我的HTML了! - Dougie
我将我的评论作为答案提供,这样你就可以接受它(点击旁边的勾勾)。我还纠正了我的评论中的一个错误。 - Felix Kling
3个回答

4

由于您将参数命名为evt而不是event,因此无法正常工作。在您的代码中,window.eventevent都指向window.event,但在Firefox中不存在。

您应该先规范化事件,例如使用:

var event = evt || window.event;

或者将参数从evt重命名为event(然后删除上面的var)。

还要注意,当您从内联事件处理程序调用函数时,如果想要访问事件对象,则必须将事件对象传递给它。


如果您知道答案并且可以再容忍我一会儿的无知,那么这只是一个相关的问题。returnValue和preventDefault在除了FF之外的所有浏览器中都会停止Enter键按下时的默认操作。我读到添加stopPropagation将适用于FF,但我已经添加了它以及cancelBubble,但似乎无法阻止表单验证函数运行。有什么想法? :S - Dougie
调用 event.stopPropagation() 应该有效。确保 event 对象在你的 testForEnter 函数中可用,目前它不可用。我还建议安装 Firebug 来调试你的代码。当你的代码抛出错误时,你会在控制台上看到。 - Felix Kling

3

以下是我现在拥有的代码,它在所有五个主要的浏览器中都能完全正常运行:

我现在按照以下方式调用函数:

<input name="forename" type="text" size="30" maxlength="30" onkeydown="testForEnter(this,event);" onblur="isValidName(this);">

我的函数如下:

// testForEnter() disables the enter keypress on all form objects except for submit button
// this function works in IE, chrome, safari, opera and firefox
function testForEnter(obj,evt) {
    var keyCode = evt.keyCode;
    var objType = obj.type;
    if ((keyCode == 13) && (objType != "submit")) {
        evt.returnValue = false;
        evt.stopPropagation(); // this line added for firefox
        if(evt.preventDefault) evt.preventDefault();
}
} //end of testForEnter()

希望这能帮助其他人!

1

尝试使用

var keycode = evt.charCode;

它似乎在两个浏览器中都能正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接