我正在为同事编写一些Javascript / Jquery,它应该在用户输入时编辑文本字段中的文本。代码的目的是为一串字符添加格式(特别是将十二个字符的字符串格式化为有效的格式化的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() + ':');
}
}
});
});
});
编辑:我想出了更多关于这个错误的信息。当我开始输入时,让我说" abc",当我输入" c"该脚本编辑该字段以显示" ab:c"。我可以退格" c"和":"但没有更多。此时,文本字段显示" ab"但是如果我使用ctrl-a选择all,则文本字段将更改为" ab:"
答案 0 :(得分:2)
请在if(event.key == "Backspace") {return;}
处理程序的开头检查:keypress
,您应该没问题。
注意:您必须将event
参数添加到keypress
处理程序函数中。
答案 1 :(得分:2)
这是一个更强大的解决方案(如果用户开始删除除了搅拌结束之外的任何地方,当前解决方案将会中断):
$(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)(?!$)
)。