阻止用户在文本框中输入双字节字符

Block users from entering double-byte characters in textboxes

我希望用户防止在输入字段中输入双字节字符。以下代码将允许用户输入 a-z 或 A-Z。我希望用户避免输入韩文、中文等双字节字符。但应该允许用户输入西班牙文字符,因为它们不是双字节字符。这应该在用户复制粘贴双字节字符时起作用。

$("#myTextBox").bind("keypress", function(event) { 
        var charCode = event.which;
        var keyChar = String.fromCharCode(charCode); 
        return /[a-zA-Z]/.test(keyChar); 
    });

从技术上讲,您可以设置 pattern 属性并列出所有允许的字符,如下所示:

<input pattern="^[-a-zA-Z0-9 äÄöÖüÜßẞÇçâêîôûàèùéêëïü]*$" />

或者,如果您希望允许阿拉伯语范围内的所有 unicode 字符:

<input pattern="^[ -&#2303;]+$" />

请注意,这两种解决方案都遗漏了一些 non-Asian 用户可能会使用的字符,例如第一种模式中的斯堪的纳维亚字符,如 å 或 ø,第二种模式中的 upper-case ẞ、表情符号、和更多。如果你能class确定 Unicode 标准中的 100000+ 个字符,你可以简单地列出模式中允许的所有字符。

模式允许输入字符,但您可以使用 :invalid CSS class 给出适当的反馈。如果你真的想删除字符,你可以清理它们,像这样(live demo):

input.addEventListener('input', () => {
    var allowed_m = /\[([^\]]*)\]/.exec(input.pattern);
    var negative_pattern = new RegExp('[^' + allowed_m[1] + ']', 'g');
    input.value = input.value.replace(negative_pattern, '');
}

这些解决方案中的任何一个都是 user-hostile。你几乎肯定会错过极端情况(已经在这里:阿拉伯语是一种亚洲语言吗?出现在亚洲语言和 non-Asian 语言中的字符是否被禁止?),来自世界各地的用户将对 上的体验感到沮丧你的网站。

相反,修复处理外来字符的代码,并向用户解释为什么首选拉丁字符。