Javascript 为什么IE在我的输入字段中不支持我的特殊字符拦截器脚本?

Javascript 为什么IE在我的输入字段中不支持我的特殊字符拦截器脚本?,javascript,internet-explorer,filter,special-characters,keypress,Javascript,Internet Explorer,Filter,Special Characters,Keypress,我的剧本是这样的: var emailmask = /^[a-z0-9.]/g; function restrictCharacters(myfield, e, restrictionType) { if (!e) var e = window.event if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var character = String.fromCharCode(code); if (code==

我的剧本是这样的:

var emailmask = /^[a-z0-9.]/g;

function restrictCharacters(myfield, e, restrictionType) {
if (!e) var e = window.event
if (e.keyCode) code = e.keyCode;
else if (e.which) code = e.which;
var character = String.fromCharCode(code);
if (code==27) { this.blur(); return false; }
if (!e.ctrlKey && code!=9 && code!=8 && code!=36 && code!=37 && code!=38 && (code!=39 || (code==39 && character=="'")) && code!=40) {
    if (character.match(restrictionType)) {
        return true;
    } else {
        return false;
    }

}
}
输入:

<input type="text" name="fx_username" value="asd" id="username" class="normal email need" onkeypress="return restrictCharacters(this, event, emailmask);"/>

它只是不工作与IE,但FF,铬是好的。这件事你能帮我吗


编辑:不工作意味着,它没有去除像@{}·$223这样的特殊字符。

该函数在几个方面是不正确的

  • 您不应该在第一行的参数“e”上使用
    var
    。传统的写作方式是

    e=e | | window.event

    但是,在这种情况下,它实际上不会正常工作,因为“onkeypress”属性值中的代码假定它可以使用
    window.event
    。这是不正确的,在Firefox中不起作用

  • 您没有使用
    var
    将“code”定义为局部变量

  • 代码假设
    将被设置为元素,而实际上第一个参数(“myfield”)是引用元素的唯一对象

  • 如果长时间的“If”测试失败,函数将返回
    未定义的

  • 正则表达式不正确。它匹配字符串开头的任何字符,因为括号中有“.”。此外,“g”修饰符是不必要的。(已修复)(尽管我建议改用“regexp.test(string)”,因为它可能快一点)


  • 很难说您希望代码在这里做什么,但是在所有这些错误得到修复之前,没有明确的方法来说明如何改进它。

    您的函数并不总是有返回值。
    如果出现这种情况:

    if (!e.ctrlKey && code!=9 && code!=8 && code!=36 && code!=37 && code!=38 && (code!=39 || (code==39 && character=="'")) && code!=40) 
    
    不匹配,它将不返回任何内容。看起来浏览器中的行为有所不同。在MSIE中,我认为它在某种程度上没有被评估为false

    解决方案:在函数末尾添加以下内容:

    return false;
    

    定义“不起作用”。发生了什么?你的正则表达式对于电子邮件验证来说很糟糕。。如果我的电子邮件地址中有
    -
    -
    +
    (是的,这是完全有效的)怎么办?你不应该使用幻数;最好使用的常量。实际上,代码通常几乎不可读。你说它是一个特殊的拦截器,但实际上它是一个特殊的接收者。RFC 822中作为正则表达式允许的电子邮件地址的完整范围在这里:只有地址部分在这里有一个很好的分析:任何更少的,或者你没有正确过滤,或者因为客户的邮件地址而拒绝客户。