javascript 在FireFox中输入按键陷阱事件

pbossiut  于 2023-01-24  发布在  Java
关注(0)|答案(4)|浏览(131)

下面的代码可以在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

guykilcj

guykilcj1#

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
        }
    }
}
r9f1avp5

r9f1avp52#

谢谢大家。
我从另一个来源得到了这个。它解决了这个问题,看起来非常接近上面的答案,但是跳过了if(evnt)部分。
如上所述,有必要致电:onkeypress ="是输入(事件);"

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

 }
9bfwbjaz

9bfwbjaz3#

您的代码更容易混淆,而您需要它:
函数的第一行:evnt = evnt || window.event;这也会做同样的事情。
接下来是charcode行:charCode = evnt.charCode || event.keyCode || event.which;这实际上会比你的更好,因为(evnt.charCode || event.charCode == 0)将 * 总是 * 返回true。
xnullundefined""0时,x == 0将返回真。
现在,如果我还记得我的HTML事件,我认为javascript:isEnter()函数应该看起来更像这样:在某些浏览器(例如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,将为您抽象出许多浏览器差异,如果您想查看其中之一的话。

ac1kyiln

ac1kyiln4#

您可以将事件:

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,这样你的代码会更干净!

相关问题