防止 Backspace 和 Delete 在 vanilla JS 中被输入事件 "handled"
Prevent Backspace and Delete from being "handled" by input event in vanilla JS
我正在尝试创建一个简单的程序,自动将“连字符”添加到文本输入字段。目标是在第 5、9 和 14 个字符处添加连字符。除此之外,它应该只允许数字,它通过“替换”由空字符串键入的任何内容来实现。
现在它工作正常:如果您键入内容,没问题,系统会添加连字符并且只考虑数字。当您复制/粘贴字符串时(通过 ctrlcmd + C / ctrlcmd + v 或右键单击复制/粘贴),它会删除 ReGex 不允许的字符并将连字符放在正确的位置。但是,当我尝试删除连字符时,它不起作用。我想,看看我的代码,连字符被删除了,所以字符串现在是 4、9 或 14 个字符长,连字符一被删除就会自动再次添加。
我已经尝试用 keyup、keypress 或 keydown 替换输入侦听器,如果我只是 return 当 event.key 是退格或删除时函数的错误结果,这很好,但是,右键单击复制粘贴不再起作用,我希望它起作用。
有没有办法让我使用输入事件侦听器来侦听除 backpsace 或 del 键之外的任何输入?还有其他想法吗?我想要一个普通的 JS 答案(虽然我猜 jQuery 一个可能对其他人有用)。
这是我的代码:
const selectConfirmBtn = document.querySelector(".confirm");
const selectSNInput = document.querySelector(".serial-number");
let serialNumberLength;
let serialNumber;
selectSNInput.addEventListener("input", function(event) {
// if (event.key === "Backspace" || event.key === "Delete") {
// return false;
// }
selectSNInput.value = selectSNInput.value.replace(/[^0-9]/g, "");
console.log(selectSNInput.value);
console.log(selectSNInput.value.length);
if (selectSNInput.value.length >= 4) {
selectSNInput.value =
selectSNInput.value.substring(0, 4) +
"-" +
selectSNInput.value.substring(4, selectSNInput.value.length);
if (selectSNInput.value.length >= 9) {
selectSNInput.value =
selectSNInput.value.substring(0, 9) +
"-" +
selectSNInput.value.substring(9, selectSNInput.value.length);
}
if (selectSNInput.value.length >= 14) {
selectSNInput.value =
selectSNInput.value.substring(0, 14) +
"-" +
selectSNInput.value.substring(14, selectSNInput.value.length);
}
}
if (selectSNInput.value.length == 19) {
selectConfirmBtn.disabled = false;
} else {
selectConfirmBtn.disabled = true;
}
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<label>Enter a serial number!
<input type="text" value="" class="serial-number">
</label>
<input class="confirm" type="button" value="confirm" disabled><br>
<div class="message"></div>
<script src="js/condition.js"></script>
</body>
</html>
您将 -
添加到第 4 位数字后缀,您可以尝试将前缀添加到第 5 位数字,即仅当第 5 位数字可用时才插入 -
,如下所示。
const selectConfirmBtn = document.querySelector(".confirm");
const selectSNInput = document.querySelector(".serial-number");
let serialNumberLength;
let serialNumber;
selectSNInput.addEventListener("input", function(event) {
const splitByLen = 4;
const value = selectSNInput.value.replace(/[^0-9]/g, "");
let result = [],
start = 0,
end = 0;
do {
end = start + splitByLen > 12 ? start + value.length : start + splitByLen;
const subValue = value.slice(start, end);
if (subValue) {
result.push(subValue);
}
start = end;
} while (end < value.length);
selectSNInput.value = result.join('-');
if (selectSNInput.value.length == 19) {
selectConfirmBtn.disabled = false;
} else {
selectConfirmBtn.disabled = true;
}
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<label>Enter a serial number!
<input type="text" value="" class="serial-number">
</label>
<input class="confirm" type="button" value="confirm" disabled><br>
<div class="message"></div>
<script src="js/condition.js"></script>
</body>
</html>
我正在尝试创建一个简单的程序,自动将“连字符”添加到文本输入字段。目标是在第 5、9 和 14 个字符处添加连字符。除此之外,它应该只允许数字,它通过“替换”由空字符串键入的任何内容来实现。
现在它工作正常:如果您键入内容,没问题,系统会添加连字符并且只考虑数字。当您复制/粘贴字符串时(通过 ctrlcmd + C / ctrlcmd + v 或右键单击复制/粘贴),它会删除 ReGex 不允许的字符并将连字符放在正确的位置。但是,当我尝试删除连字符时,它不起作用。我想,看看我的代码,连字符被删除了,所以字符串现在是 4、9 或 14 个字符长,连字符一被删除就会自动再次添加。 我已经尝试用 keyup、keypress 或 keydown 替换输入侦听器,如果我只是 return 当 event.key 是退格或删除时函数的错误结果,这很好,但是,右键单击复制粘贴不再起作用,我希望它起作用。
有没有办法让我使用输入事件侦听器来侦听除 backpsace 或 del 键之外的任何输入?还有其他想法吗?我想要一个普通的 JS 答案(虽然我猜 jQuery 一个可能对其他人有用)。
这是我的代码:
const selectConfirmBtn = document.querySelector(".confirm");
const selectSNInput = document.querySelector(".serial-number");
let serialNumberLength;
let serialNumber;
selectSNInput.addEventListener("input", function(event) {
// if (event.key === "Backspace" || event.key === "Delete") {
// return false;
// }
selectSNInput.value = selectSNInput.value.replace(/[^0-9]/g, "");
console.log(selectSNInput.value);
console.log(selectSNInput.value.length);
if (selectSNInput.value.length >= 4) {
selectSNInput.value =
selectSNInput.value.substring(0, 4) +
"-" +
selectSNInput.value.substring(4, selectSNInput.value.length);
if (selectSNInput.value.length >= 9) {
selectSNInput.value =
selectSNInput.value.substring(0, 9) +
"-" +
selectSNInput.value.substring(9, selectSNInput.value.length);
}
if (selectSNInput.value.length >= 14) {
selectSNInput.value =
selectSNInput.value.substring(0, 14) +
"-" +
selectSNInput.value.substring(14, selectSNInput.value.length);
}
}
if (selectSNInput.value.length == 19) {
selectConfirmBtn.disabled = false;
} else {
selectConfirmBtn.disabled = true;
}
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<label>Enter a serial number!
<input type="text" value="" class="serial-number">
</label>
<input class="confirm" type="button" value="confirm" disabled><br>
<div class="message"></div>
<script src="js/condition.js"></script>
</body>
</html>
您将 -
添加到第 4 位数字后缀,您可以尝试将前缀添加到第 5 位数字,即仅当第 5 位数字可用时才插入 -
,如下所示。
const selectConfirmBtn = document.querySelector(".confirm");
const selectSNInput = document.querySelector(".serial-number");
let serialNumberLength;
let serialNumber;
selectSNInput.addEventListener("input", function(event) {
const splitByLen = 4;
const value = selectSNInput.value.replace(/[^0-9]/g, "");
let result = [],
start = 0,
end = 0;
do {
end = start + splitByLen > 12 ? start + value.length : start + splitByLen;
const subValue = value.slice(start, end);
if (subValue) {
result.push(subValue);
}
start = end;
} while (end < value.length);
selectSNInput.value = result.join('-');
if (selectSNInput.value.length == 19) {
selectConfirmBtn.disabled = false;
} else {
selectConfirmBtn.disabled = true;
}
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<label>Enter a serial number!
<input type="text" value="" class="serial-number">
</label>
<input class="confirm" type="button" value="confirm" disabled><br>
<div class="message"></div>
<script src="js/condition.js"></script>
</body>
</html>