javascript限制输入框输入中文时的字节长度, 且避免输入过程中的字符问题

概述

在日常使用过程中有一些特殊情况, 需要限制输入框的字节数, 注意是字节数而不是字符数;
对于字符数, 我们简单的用maxlength就可以解决
对于字节数, 如果是单字节字符当然也可以通过 maxlength 来限制, 但是对于多字节字符, 显然就无法正常限制了;
而对于常用编码 UTF-8来说, 字符的占用字节数范围为 [1:6], 因此需要进行相关计算

需要解决的问题

以中文为例:

  1. 需要一个计算字符串的字节数的方法;
  2. 需要一个事件监听, 监听输入变化, 比如 input;
  3. 需要一个计算最大长度范围内, 输入字符的极限长度字符串的方法;
  4. 需要保证在输入过程中, 如果是拼音输入法且通过input事件来监听变化的话, 那么在输入过程中输入的英文字符也会同时计数, 导致字符串错误 ;

具体实现

// 用于计算字符长度
function calc_char_length(param) {
  var totalLength = 0
  // UTF-8编码
  for (var i = 0; i < param.length; i++) {
    if (param.charCodeAt(i) <= parseInt('0x7F')) { totalLength += 1 }
    else if (param.charCodeAt(i) <= parseInt('0x7FF')) { totalLength += 2 }
    else if (param.charCodeAt(i) <= parseInt('0x7FFFF')) { totalLength += 3 }
    else if (param.charCodeAt(i) <= parseInt('0x1FFFF')) { totalLength += 4 }
    else if (param.charCodeAt(i) <= parseInt('0x3FFFFFF')) { totalLength += 5 }
    else { totalLength += 6 }
  }
  return totalLength
}

// 用于获取最大长度范围内, 输入字符的极限长度字符串
function set_max_char(originStr, maxLen) {
  var totalLength = 0
  var newStr = ''
  // UTF-8编码
  for (var i = 0; i < originStr.length; i++) {
    if (originStr.charCodeAt(i) <= parseInt('0x7F')) { totalLength += 1 }
    else if (originStr.charCodeAt(i) <= parseInt('0x7FF')) { totalLength += 2 }
    else if (originStr.charCodeAt(i) <= parseInt('0x7FFFF')) { totalLength += 3 }
    else if (originStr.charCodeAt(i) <= parseInt('0x1FFFF')) { totalLength += 4 }
    else if (originStr.charCodeAt(i) <= parseInt('0x3FFFFFF')) { totalLength += 5 }
    else { totalLength += 6 }

    if (totalLength > maxLen) break
    newStr += originStr[i]
  }
  return newStr
}

var isInputting = false
$('input').off()
    .on('compositionstart', function () { // 开始输入
      isInputting = true
    })
    .on('compositionend', function () {  // 结束输入, 并触发input
      isInputting = false
      $(this).trigger('input')
    })
    .on('input', function () {
      if (isInputting) return  // 输入过程中, 不做处理
      var value = $(this).val()
      $(this).val(set_max_char(value, 64))
    })

结语

以上方法通过测试, 实际可用; 但是实现较为复杂, 如果你能有更简单的方法, 还请告知一二~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值