由于Javascript,Backspace(删除字符)在Firefox中无法正常工作

Backspace (deleting characters) not working properly in Firefox due to Javascript

本文关键字:工作 常工作 Javascript Backspace 删除 由于 字符 Firefox      更新时间:2023-09-26

我正在为一位同事编写一些Javascript/Jquery,该同事应该在用户键入时编辑文本字段中的文本。该代码的目的是为字符串添加格式(特别是将12个字符的字符串格式化为有效的格式化mac地址),但在Firefox上,一旦字符输入文本字段,我就无法使用退格删除字符。

以下是进行格式化的代码:

$(document).ready(function () {
    var length = 0;
    $("#mac_input").focusin(function (evt) {
        $(this).keypress(function () {
            content = $(this).val();
            content_pre_format = content.replace(/':/g, '');
            content_formatted = content_pre_format.replace(/'n/g, '');
            var text_input = $('#mac_input');
            if (content_formatted.length % 12 == 0 && length != 0) {
                text_input.val(text_input.val() + "'n");
            }
            length = content_formatted.length % 12;
            if (length % 2 == 0 && length != 0) {
                if (text_input.val().charAt(text_input.val().length - 1) == ':') {
                } else {
                    text_input.val(text_input.val() + ':');
                }
            }
        });
    });
});

编辑:我发现了更多关于这个bug的信息。当我开始键入时,比如说"abc",当我键入"c"时,脚本会编辑字段以显示"ab:c"。我可以退格"c"answers":",但不能再退了。此时,文本字段显示"ab",但如果我使用ctrl-a全选,文本字段将变为"ab:"

这里有一个更强大的解决方案(如果用户开始删除除搅拌结束之外的任何位置,当前的解决方案都会中断):

$(document).ready(function() {
$("#mac_input").keydown(function (event) {
    if (!((event.which > 47 && event.which < 71) || (event.which > 95 && event.which < 106))) {
        event.preventDefault();
    }
});
$("#mac_input").keyup(function () {
    var content=$(this).val();
    content = content.replace(/':/g, '');
    content = content.replace(/'n/g, '');
    content = content.replace(/('w{12}(?!$))/g, '$1'n').replace(/('w{2}(?!'n)(?!$))/g, '$1:')
    $(this).val(content);
});
});

它确保字符串始终被解析为MAC地址的集合

为了解释,它使用正则表达式,([abcdef0123456789]{12}(?!$))匹配任何符合MAC地址且不在字符串末尾的12个字符的序列(这就是(?!$))前瞻性所做的),并将其替换为匹配的字符串和附加的换行符,然后它匹配任何后面没有紧跟换行符或字符串末尾的2个MAC地址字符(([abcdef0123456789]{2})的序列((?!'n)(?!$))。

只要在keypress处理程序的开头检查一下这个:if(event.key == "Backspace") {return;},你就应该没事了。

注意:您必须将event参数添加到keypress处理程序函数中。