input输入框限制20个字符,十个汉字

英文和数字为一个字符,汉字为两个字符

在 Web 开发中,经常要对表单元素的输入进行限制,比如说不允许输入特殊字符,标点。通常我们会监听 input 事件:

inputElement.addEventListener('input', function(event) { let regex = /[^1-9a-zA-Z]/g; event.target.value = event.target.value.replace(regex, ''); event.returnValue = false });

这段代码在 Android 上是没有问题的,但是在 iOS 中,input 事件会截断非直接输入,什么是非直接输入呢,在我们输入汉字的时候,比如说「喜茶」,中间过程中会输入拼音,每次输入一个字母都会触发 input 事件,然而在没有点选候选字或者点击「选定」按钮前,都属于非直接输入。

这显然不是我们想要的结果,我们希望在直接输入之后才触发 input 事件,这就需要引出我要说的两个事件—— compositionstartcompositionend

compositionstart 事件在用户开始进行非直接输入的时候触发,而在非直接输入结束,也即用户点选候选词或者点击「选定」按钮之后,会触发 compositionend 事件。

var inputLock = false;
function do(inputElement) { var regex = /[^1-9a-zA-Z]/g; inputElement.value = inputElement.value.replace(regex, ''); } inputElement.addEventListener('compositionstart', function() { inputLock = true; }); inputElement.addEventListener('compositionend', function(event) { inputLock = false; do(event.target); }) inputElement.addEventListener('input', function(event) { if (!inputLock) { do(event.target); event.returnValue = false; } });

添加一个 inputLock 变量,当用户未完成直接输入前,inputLock 为 true,不触发 input 事件中的逻辑,当用户完成有效输入之后,inputLock 设置为 false,触发 input 事件的逻辑。这里需要注意的一点是,compositionend 事件是在 input 事件后触发的,所以在 compositionend事件触发时,也要调用 input 事件处理逻辑。

对于input输入框限制20个字符,十个汉字

根据这个原理,我们可以这样实现

var inputLock = false;
var deviceName=document.getElementById("device_name_input");
if(localStorage.getItem("deviceName")){
deviceName.setAttribute("value",localStorage.getItem("deviceName"));
}
//中文输入开始
deviceName.addEventListener('compositionstart', function() {
inputLock = true;
});
//中文输入结束
deviceName.addEventListener('compositionend', function(event) {
inputLock = false;
limitWords()
});
//计算输入字符的总数
function limitWords() {
var ChiLength=0;//中文汉字数
var maxLength=0;
function strlen(str){
var newDeviceNameVal;
var len = 0;
ChiLength=0;//中文汉字数
for (var i=0; i<str.length; i++) {
var c = str.charCodeAt(i);
var one = (c >= 0x0001 && c <= 0x007e) || (0xff60<=c && c<=0xff9f);
//单字节加1
if (one&&len<=20) {
len++;
maxLength++;
} else if(len<20) {
len+=2;
ChiLength++;
maxLength++;
}
}
return len;
}
var deviceNameVal=event.currentTarget.value;
var deviceNameInput=document.getElementById("device_name_input");
var strLength=strlen(deviceNameVal);
//根据字符串中的汉字数,截取最终显示的字符
deviceNameInput.value=event.currentTarget.value.substring(0,20-ChiLength);
    if(strLength>=20){
var newMaxLength=maxLength;
deviceNameInput.setAttribute("maxlength",newMaxLength);
}else{
deviceNameInput.setAttribute("maxlength",20);
}
}
deviceName.addEventListener("input",function(event){
if (!inputLock) {
limitWords()
event.returnValue = false;
}
})

转载于:https://www.cnblogs.com/yzhihao/p/7422432.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 JavaScript 的事件监听器来实现输入框限制字节长度的功能。具体做法如下: 1. 在 HTML 中,给输入框添加一个事件监听器,监听输入事件(oninput): ``` <input type="text" oninput="checkLength(this)" /> ``` 2. 在 JavaScript 中,编写 checkLength 函数,该函数会在用户输入时被调用: ``` function checkLength(input) { // 获取输入框的值 var value = input.value; // 计算字节数 var byteLength = 0; for (var i = 0; i < value.length; i++) { var charCode = value.charCodeAt(i); if (charCode <= 127) { byteLength += 1; // 英文字符 } else { byteLength += 2; // 中文字符 } } // 如果字节数超过了限制,截断输入框的值 if (byteLength > 50) { input.value = truncate(value, 50); } } function truncate(str, len) { var byteLen = 0; for (var i = 0; i < str.length; i++) { var charCode = str.charCodeAt(i); if (charCode <= 127) { byteLen += 1; } else { byteLen += 2; } if (byteLen > len) { return str.substring(0, i); } } return str; } ``` 3. checkLength 函数中,先获取输入框的值,然后计算字节数。为了区分中文字符和英文字符,我们使用 charCodeAt 函数获取字符的 Unicode 编码,如果编码小于等于 127,就认为是英文字符,否则就认为是中文字符。英文字符算一个字节,中文字符算两个字节。 4. 如果字节数超过了限制,我们就使用 truncate 函数截断输入框的值。truncate 函数也是通过计算字节数来实现的。如果字节数超过了 len,就返回字符串的前 len 个字符。 这样,就可以实现输入框限制字节长度的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值