1 回答
TA贡献1773条经验 获得超3个赞
我在这里写了一个更通用的答案,关于对固定大小的格式化输入使用可见掩码。如果您接受输入掩码始终可见,那应该对您有用。要使其正常工作,请将以下属性添加到您的input:
<input placeholder="__-__-__-____" data-slots="_" data-accept="\w" size="13">
请注意,它不会将小写字母转换为大写字母(我建议不要这样做:您不希望人们认为他们的 CAPS 锁定键出现故障)。如果这不是您希望它的工作方式(使用掩码或缺少大写),这里是专门适合您的要求的代码:
const el = document.getElementById("vname"),
pattern = "__-__-__-____",
prev = [1, 2, 2, 4, 5, 5, 7, 8, 8, 10, 11, 12, 13],
accept = /\w/g,
clean = input => {
input = input.match(accept) || [];
return Array.from(pattern, c =>
input[0] === c || c == "_" ? input.shift() || c : c
);
},
format = () => {
const [i, j] = [el.selectionStart, el.selectionEnd].map(i => {
i = clean(el.value.slice(0, i)).indexOf("_");
return i<0? prev[prev.length-1]: back? prev[i-1] || 0: i;
});
let s = clean(el.value).join``.toUpperCase();
el.value = s.slice(0, (s+"_").indexOf("_"));
el.setSelectionRange(i, j);
back = false;
};
let back = false;
el.addEventListener("keydown", (e) => back = e.key === "Backspace");
el.addEventListener("input", format);
<input type="text" id="vname" />
就像我提到的答案一样,这也涉及复制/粘贴(即使复制的值没有连字符)、选择、将光标放在中间、删除那里的字符等。
添加回答
举报