Javascript按键事件在Firefox中无法正常运行

时间:2016-04-20 19:11:04

标签: javascript

这是我的代码:

function filter(obj,re) {
      if (obj&&obj.tagName.toLowerCase()=="input") {
        obj.filter=re;
        on(obj,"keypress",function(e) {
          if (e.keyCode<32) return true;
          if (!(String.fromCharCode(e.keyCode).match(this.filter))) {
            e.stopPropagation(); e.preventDefault(); return false;
          }
        });
      }
    }

filter(element,new RegExp('[\\w\\d]+'));

它在谷歌浏览器中运行良好,但它在Firefox中不起作用。发生的是我在dom元素中添加一个按键事件,该事件根据过滤器过滤出数据。

无论如何,我们将不胜感激。

更新

以下是on功能:

function on(obj,evt,func) { 
   if (obj.addEventListener) obj.addEventListener(evt,func,false); 
   else obj.attachEvent("on"+evt,func); 
}

1 个答案:

答案 0 :(得分:1)

不推荐使用KeyboardEvent.keyCode属性 - 在Firefox中,所有可打印字符都会导致零值,因此您的处理程序始终返回而不执行任何操作。 charCode属性似乎仍然适用于Chrome和Firefox,但您不应该依赖它,因为实际上所有字符代码属性都已弃用或非标准。

如MDN所述:

  

新的Web应用程序不应该使用它。 IE和Firefox已经(部分)支持KeyboardEvent.key。此外,Google Chrome和Safari支持在DOM Level 3事件的旧草稿中定义的KeyboardEvent.keyIdentifier。如果你可以使用它们或其中一个,你应该尽可能地使用它们。

  

注意:在处理keydown和keyup事件时,Web开发人员不应将keycode属性用于可打印字符。如上所述,keycode属性对可打印字符没有用,特别是那些按下Shift或Alt键输入的字符。

如果您定位的是现代浏览器或设备,则key属性旨在保留所按键的,但此选项仍然很新,而不是跨浏览器。< / p>

对于跨浏览器/旧版支持,大多数人所做的是验证整个输入而不是一个键。例如,下面的简单示例允许用户键入,但随后从值字符串中删除与正则表达式不匹配的字符。

<input id="myInput"/>
var input = document.getElementById('myInput'),
    sanitise = function(){
        input.value = input.value.replace(/\w+/, '');
    };

input.addEventListener('keyup', sanitise);

» Fiddle