原生 input输入框,按字符or字节数计算输入内容长度,超出部分截取掉。

需求

这做的是一个原生输入框,按字节或者字符数计算内容长度,超出部分截取掉。

分析

首先,用maxlength肯定是不行的,因为,aaa的长度为3,啊啊啊的字节长度肯定是大于3的,但是maxlength还是将他计算为3,跟我们的需求不太一样。所以计算一下。

首先计算输入内容的长度,需要在输入时就开始计算,就需要我们在onchange的时候对输入内容长度进行判断,这里又涉及到一个问题。就是中文在输入时,还没有组合完就会被拿去计算,所以这里针对中文还是要用单独的事件做处理。

话不多说,上代码,引入
JQ,复制粘贴可以直接使用

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <style>
  html {
    height: 100%
  }
/* 设置背景颜色 */
  body {
    margin: 0;
    height: 100%;
    background: #fff;
  }

  </style>
</head>
<script type="text/javascript" src="./jquery.js"></script>
<body>
  <input type="text" style="width: 500px;"  placeholder="例:输入内容"  autocomplete="off" maxlength="253" name="ping" id="input_id" />

  <script>
  	//定义一个标志位
    var flag = false;
	$(document).ready(function(){
		$('#input_id').on({
			//输入中文组合时,flag设置为true
			'compositionstart':function(){
				flag = true
			},
			//输入中文结束时,将flag置为false
			'compositionend':function(){
				flag = false;
				//flag为false代表中文输入组合结束,就可以进行字符长度的计算了
				if(!flag) {
					var value = $(this)[0].value
					//checkValue为计算字符长度的方法,超过规定字符长度则截取
					let checkResult = checkValue(value)
					// console.log(checkResult)
				}
			},
			//正常的内改变时触发的事件,但这里加了flag开关,当flag为true时,中文输入还在进行中,此时不进行字符长度计算
			'input propertychange':function(){
				if(!flag) {
					var value = $(this)[0].value
					let checkResult = checkValue(value)
					// console.log(checkResult)
				}
			}
		})
	});
	//计算字符长度,超过部分截取掉,textVal为输入内容
	function checkValue(textVal){
		//computedSize为计算字符长度的方法,下面有些,这里定义的最大字符长度为60。可以按照具体情况自由设置
		//reslut为计算之后的结果,具体参数看computedSize方法
		let reslut = this.computedSize(textVal,60)
		console.log(reslut)
		if(reslut.over){
			 //将超过部分截取之后赋值给输入框
			 let value = textVal.substr(0,reslut.posistion)
			 $('#input_id')[0].value = value
		}
	}
	function computedSize(str,maxlength){
		var charcode,total = 0;
		//循环输入的每一个字符,并计算总长度,这里是按照utf-8的方式计算的,有其他就算方式可以不用这个
		for (var i = 0 ; i < str.length; i++){
			charcode = str.charCodeAt(i);
			if (charcode >= 0xd800 && charcode <= 0xdbff) {
				charcode = charcode + str.charCodeAt(++i);
			}
			if (charcode <= 0x007f) {
				total += 1;
			} else if (charcode <= 0x07ff) {
				total += 2;
			} else if (charcode <= 0xffff) {
				total += 3;
			} else {
				total += 4;
			}
			//每次循环都对总长度做一个判断,看其是否超过定义的总长度
			console.log(total);
			if(total>maxlength){
				let data = {
					over:true,//是否超过,true表示超过,false表示没有超过
					posistion:i-1//超过总超度的前一位字符的位置,不能用当前的因为当前已超过
				}
				return data
			}
		}
		let data = {
			over:false,//是否超过,true表示超过,false表示没有超过
			posistion:0//此时不需要返回posistion,因为没有超过不需要进行截取,但是我这还是返回了
		}
		return data;
	}
  </script>
</body>

</html>

以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值