在FireFox中输入密钥陷阱事件

时间:2009-09-30 06:08:50

标签: javascript javascript-events

以下代码适用于IE,但不适用于FireFox。

我未能成功尝试下面链接中提出的所有解决方案。

按下ENTER时调用函数。如果放在第一行功能中,警报会触发。但是,首先if语句不被处理。

通过以下方式调用:onKeyPress =“javascript:isEnter();”在控制标记中。

function isEnter(evnt) {
    evnt = (evnt) ? evnt : ((event) ? event : null);
        if (evnt) {

            var charCode = (evnt.charCode || evnt.charCode == 0) ? evnt.charCode : ((evnt.keyCode) ? evnt.keyCode : evnt.which);
            if (charCode == 13) {
                //do stuff
            }
        }
    }

link text

4 个答案:

答案 0 :(得分:2)

onKeyPress="javascript:isEnter();"有两个原因是错误的:首先,你不应该有javascript:前缀,因为密钥处理程序属性的全部内容都被处理为JavaScript。这不会阻止您的代码工作,因为javascript:前缀被解释为标签。阻止它工作的是你没有将事件对象传递给isEnter函数。您的onkeypress属性应为

onkeypress="isEnter(event);"

这适用于大多数浏览器。原因是事件处理程序属性的值充当函数的主体,该函数传递名为event的参数。在IE event而不是解析为window.event,因此这种方法适用于大多数浏览器。

您还可以按如下方式简化您的功能:

function isEnter(evnt) {
    if (evnt)
        var charCode = evnt.keyCode || evnt.which;
        if (charCode == 13) {
            //do stuff
        }
    }
}

答案 1 :(得分:2)

谢谢大家。

我从另一个来源得到了这个。它解决了这个问题,看起来非常接近上面的答案,但跳过了if(evnt)部分。

如上所述,有必要调用:onkeypress =“isEnter(event);”

function isEnter(e) {
    e = e || window.event || {};
    var charCode = e.charCode || e.keyCode || e.which;
        if (charCode == 13) {
            // do stuff  
        }

 }

答案 2 :(得分:0)

您的代码更加令人困惑,您需要它:

第一行功能:evnt = evnt || window.event; 这将做同样的事情。

接下来,charcode行:charCode = evnt.charCode || event.keyCode || event.which; 这实际上比你的更好,因为(evnt.charCode || event.charCode == 0) 总是返回true。

x == 0xnullundefined""时,

0将返回true。

现在,如果我记得我的HTML事件,我认为您的javascript:isEnter()函数应该更像这样:isEnter(event)。您的代码未将事件传递给某些浏览器(例如Firefox)上的函数。

所以,这就是我们所拥有的:

onKeyPress="isEnter(event)"

function isEnter(e) {
    e = e || window.event;
    if (e) {
       var charCode = e.charCode || evnt.keyCode || evnt.which;
       if (charCode == 13) {
          //do stuff
       }
    }
}  

我不记得这是否是获取charCode的最佳方式,但javascript库如prototype,jQuery,dojo,如果你想查看其中一个,将为你抽象出很多浏览器差异。欢呼声。

答案 3 :(得分:0)

您可以扩展活动:

jQuery.Event.prototype.isEnter = function() {
  return this.which == 13;
}

然后使用

e.isEnter();

注意:如果你没有使用jQuery,只需删除“jQuery”。从上面的代码。

你可以做得更好:

$(function(){
  $("input:text").keydown(function(e) {
   if (e.isEnter()) $(this).trigger("enterPressed", e);      
  });
});

$(function() {
  $("#myfield").bind("enterPressed", function(e) {
   console.log("enter pressed");
  });
});

测试它:http://jsfiddle.net/TfE6m/

这里没有jQuery:http://jsfiddle.net/zqFer/

您的扩展方法和触发事件的方法可以位于单独的文件中,例如,可以称为events.js。 你的代码会更干净!