我怎样才能让盒子里只能写数字?限制为 6 位数
How can I make only numbers can be written in the box? Limit is 6 digits
怎样才能让盒子里只能写数字?限制为 6 位数字。
<?php
$barcode_name = "Seal Number:";
$barname = "placeholder=\"Scan the Serial Number\"";
?>
<label class="control-label col-sm-4" for="barcodeno"><?php echo $barcode_name; ?></label>
<div class="col-sm-4">
<p class="form-control-static" style="margin-top: -6px;">
<textarea class="form-control" rows="10" id="barcodeno" name="barcodeno" onkeydown="return KeyDown()" onkeyup="this.value=this.value.toUpperCase()" <?php echo $barname; ?>></textarea>
</p>
</div>
<br>
已添加Javascript
var barcodeno = $('#barcodeno').val().trim();
barcodeno = barcodeno.split('\n');
//checking duplicate barcodeno
let barcodeno_array = []
for (let i = 0; i < barcodeno.length; i++) {
if (barcodeno_array.indexOf(barcodeno[i]) == -1) {
barcodeno_array.push(barcodeno[i])
}
}
所以,一些开始的笔记:
- 通常 来说,您不会对单个数据点值使用
<textarea/>
——您会使用 <input/>
或其他表单控件。 <textarea/>
通常保留用于大量文本数据。但是,从您的问题中不一定清楚,您正在将它用于一种 "批量输入" 多个值,因此因此它可能是可以接受的。
- 一些评论建议使用
type="number"
是正确的做法,但我会警告不要在输入字符为数字的任何时候跳到那个——数字输入专门用于当包含的值表示 数量 或其他数字数据点——然而,还有许多其他情况,例如数字 pin 或产品 ID,可能仅限于数字字符,但并不具体表示 数
- 有一个
pattern
attribute 可以用来指定条目要遵循的模式;然而:
- 这仅限于少数表单元素,不包括
<textarea/>
pattern
属性实际上并不限制输入;它仅用于本机 validation,这与您的用例不同。
由于这些原因,不幸的是,您最好的选择可能是利用 JavaScript。我会建议 运行 在输入的每个键上都有一个脚本来验证它是数字字符还是换行符,否则不要将它写入 <textarea/>
。鉴于您的示例代码正在利用 jQuery,我将对我的示例执行相同的操作:
$(document).ready(() => {
const pidTextarea = $('#productIds');
const allowedChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'Enter'];
pidTextarea.on('keypress', (e) => {
const { key } = e;
if (!allowedChars.includes(key)) {
e.preventDefault();
}
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label for="productIds">Product IDs (bulk input)</label>
<textarea id="productIds" name="productIds"></textarea>
这允许您防止仅输入数字键和回车键(并且删除和返回space键和箭头键不会被此脚本捕获,因此它允许编辑)。
但是,这不会将条目限制为六位或更少。为此,我们可以尝试评估每个按键,找出光标的位置,以及由此产生的新值是否会违反我们的限制。然而,这看起来相当复杂——例如,我们需要管理用户是否选择了一系列要替换的值,而不是只使用一个没有选择的光标。相反,我们可以在每次有效更改后缓存最后一个值,然后使用 .on('input', ...)
侦听所有更改并评估该值是否有效——如果无效,我们恢复最后一个有效值:
$(document).ready(() => {
const pidTextarea = $('#productIds').eq(0);
const allowedChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'Enter'];
let cachedTextAreaValue = pidTextarea.value;
pidTextarea.on('keypress', (e) => {
const { key } = e;
if (!allowedChars.includes(key)) {
e.preventDefault();
}
});
pidTextarea.on('input', (e) => {
const newValue = pidTextarea.val();
const splitNewValue = newValue.split('\n');
for (let i = 0; i < splitNewValue.length; i++) {
const currentVal = splitNewValue[i];
if (currentVal.length > 6) {
pidTextarea.val(cachedTextAreaValue);
return;
}
}
// if we exit the for loop having not left the function we cache the new value
cachedTextAreaValue = newValue;
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label for="productIds">Product IDs (bulk input)</label>
<textarea id="productIds" name="productIds"></textarea>
这有一个额外的好处,可以防止错误的输入粘贴到一个值中。
注意:
Don’t hijack the keyboard. Display an error message if the characters entered aren’t numeric.
– onosendi
10 hours ago
这是一个很好的观点——虽然我的 post 确实 向您展示了如何实现您所要求的,但它没有做出任何判断这是否真的是一个好主意。当然有理由不限制输入,而是等到用户尝试提交表单,然后验证并显示有意义的反馈,说明可能出了什么问题。此外,您应该确保为表单控件提供明确的方向,以减少摩擦——例如,不要让用户猜测分隔符是否为新行,space , 或逗号 - 相反,在表单字段旁边提供消息。虽然这些更多的是 UX 问题而不是软件问题,但通常在构建前端时,我们还必须负责做出选择,以便为我们的用户构建最佳、最易访问的体验。对于它的价值,我发现 The Smashing Magazine publication Form Design Patterns by Adam Silver 是一个很好的声音来源,可用用户界面的合理设计模式。
怎样才能让盒子里只能写数字?限制为 6 位数字。
<?php
$barcode_name = "Seal Number:";
$barname = "placeholder=\"Scan the Serial Number\"";
?>
<label class="control-label col-sm-4" for="barcodeno"><?php echo $barcode_name; ?></label>
<div class="col-sm-4">
<p class="form-control-static" style="margin-top: -6px;">
<textarea class="form-control" rows="10" id="barcodeno" name="barcodeno" onkeydown="return KeyDown()" onkeyup="this.value=this.value.toUpperCase()" <?php echo $barname; ?>></textarea>
</p>
</div>
<br>
已添加Javascript
var barcodeno = $('#barcodeno').val().trim();
barcodeno = barcodeno.split('\n');
//checking duplicate barcodeno
let barcodeno_array = []
for (let i = 0; i < barcodeno.length; i++) {
if (barcodeno_array.indexOf(barcodeno[i]) == -1) {
barcodeno_array.push(barcodeno[i])
}
}
所以,一些开始的笔记:
- 通常 来说,您不会对单个数据点值使用
<textarea/>
——您会使用<input/>
或其他表单控件。<textarea/>
通常保留用于大量文本数据。但是,从您的问题中不一定清楚,您正在将它用于一种 "批量输入" 多个值,因此因此它可能是可以接受的。 - 一些评论建议使用
type="number"
是正确的做法,但我会警告不要在输入字符为数字的任何时候跳到那个——数字输入专门用于当包含的值表示 数量 或其他数字数据点——然而,还有许多其他情况,例如数字 pin 或产品 ID,可能仅限于数字字符,但并不具体表示 数 - 有一个
pattern
attribute 可以用来指定条目要遵循的模式;然而:- 这仅限于少数表单元素,不包括
<textarea/>
pattern
属性实际上并不限制输入;它仅用于本机 validation,这与您的用例不同。
- 这仅限于少数表单元素,不包括
由于这些原因,不幸的是,您最好的选择可能是利用 JavaScript。我会建议 运行 在输入的每个键上都有一个脚本来验证它是数字字符还是换行符,否则不要将它写入 <textarea/>
。鉴于您的示例代码正在利用 jQuery,我将对我的示例执行相同的操作:
$(document).ready(() => {
const pidTextarea = $('#productIds');
const allowedChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'Enter'];
pidTextarea.on('keypress', (e) => {
const { key } = e;
if (!allowedChars.includes(key)) {
e.preventDefault();
}
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label for="productIds">Product IDs (bulk input)</label>
<textarea id="productIds" name="productIds"></textarea>
这允许您防止仅输入数字键和回车键(并且删除和返回space键和箭头键不会被此脚本捕获,因此它允许编辑)。
但是,这不会将条目限制为六位或更少。为此,我们可以尝试评估每个按键,找出光标的位置,以及由此产生的新值是否会违反我们的限制。然而,这看起来相当复杂——例如,我们需要管理用户是否选择了一系列要替换的值,而不是只使用一个没有选择的光标。相反,我们可以在每次有效更改后缓存最后一个值,然后使用 .on('input', ...)
侦听所有更改并评估该值是否有效——如果无效,我们恢复最后一个有效值:
$(document).ready(() => {
const pidTextarea = $('#productIds').eq(0);
const allowedChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'Enter'];
let cachedTextAreaValue = pidTextarea.value;
pidTextarea.on('keypress', (e) => {
const { key } = e;
if (!allowedChars.includes(key)) {
e.preventDefault();
}
});
pidTextarea.on('input', (e) => {
const newValue = pidTextarea.val();
const splitNewValue = newValue.split('\n');
for (let i = 0; i < splitNewValue.length; i++) {
const currentVal = splitNewValue[i];
if (currentVal.length > 6) {
pidTextarea.val(cachedTextAreaValue);
return;
}
}
// if we exit the for loop having not left the function we cache the new value
cachedTextAreaValue = newValue;
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label for="productIds">Product IDs (bulk input)</label>
<textarea id="productIds" name="productIds"></textarea>
这有一个额外的好处,可以防止错误的输入粘贴到一个值中。
注意:
Don’t hijack the keyboard. Display an error message if the characters entered aren’t numeric. – onosendi 10 hours ago
这是一个很好的观点——虽然我的 post 确实 向您展示了如何实现您所要求的,但它没有做出任何判断这是否真的是一个好主意。当然有理由不限制输入,而是等到用户尝试提交表单,然后验证并显示有意义的反馈,说明可能出了什么问题。此外,您应该确保为表单控件提供明确的方向,以减少摩擦——例如,不要让用户猜测分隔符是否为新行,space , 或逗号 - 相反,在表单字段旁边提供消息。虽然这些更多的是 UX 问题而不是软件问题,但通常在构建前端时,我们还必须负责做出选择,以便为我们的用户构建最佳、最易访问的体验。对于它的价值,我发现 The Smashing Magazine publication Form Design Patterns by Adam Silver 是一个很好的声音来源,可用用户界面的合理设计模式。