输入框文本输入限制问题以及中文输入法下字符阶段的处理

        输入框文本字数限制问题以及中文输入法下字符截断处理

    上次博文写过处理实时获取输入表单的值,传送门: 博文地址。这次又需要处理输入框文本字数限制问题,前期的步骤思想其实就是要先实时获取输入框的值然后得到长度。

  使用onkeyup判断字符长度

    可以参考我前面写的博文,地址如上。onkeyup确实是可以做到实时获取的效果,因此我就是使用键盘事件来达到效果。HTML代码:

<div class="content">
    <textarea name="complain" id="text" onkeyup="limiNum(this)"  placeholder="请输入投诉内容"></textarea>
    <p><span><strong id="num">0</strong>/16</span></p>
</div>

    JS代码:

 1   // 限制内容长度函数
 2   function limiNum(domEle) {
 3      //最大长度为16
 4     var maxLen = 16;
 5     var curtLen = domEle.value.length;
 6     if ( curtLen > maxLen ) { //当长度大于16就截取字符串
 7         domEle.value = domEle.value.substring(0, maxLen);
 8     }
 9     document.getElementById("num").innerHTML = domEle.value.length.toString();
10   }

     当你输入的字符串长度大于16时,字符串会被进行截。大致效果如图(1)。 但是此时输入的是纯英文或者是字符数字的混合,不是在中文输入法下的,我们来看看在中文输入法下会怎么样。图(2)

       图(1)    。    图(2)  图(3)

 如图我输入“程序员”的拼音而并没有选择好,此时的长度就已经是11,在控制台也输出了“chengxuyuan”图(3),这样导致的问题是如果我已经输好了长度为15的字符串,还要输入一个中文时,会被在用户输入达到边界值时,莫名其妙地将用户的输入截断,导致中文输入无法接续。假如我想接着输入中文“坐”字,先按了字母“z”,输入字符长度就变为16了,图(4),  控制台的判断如图:图(5)

       图(4)                图(5)

因此我们再按字母“u”,就必定会被截断,达不到预想的效果,这对于用于体验是不好的。所以需要进行改进。

  compositionstart,compositionend

    采用compositionstart、compositionend来捕获IME(input method editor)的启动和关闭事件.我使用chrome的版本是56.0.2924.87,亲测先触发compositionstart,接着触发compositionend,最后触发input,因此我在compositionend事件处理程序中也添加了截断字符串处理函数,就解决了上面产生的问题。

若我想输入“中”字,此时字母a-o已经有15个字符了,但“zhong”并不会被截断。图(6)(7)

         图(6)           图(7)

    此时输入完成如图,完美解决了中文输入法截断的问题。改进代码如下:

 1 var node = $("#text").get(0);
 2 var cpLock = false;
 3 node.addEventListener('compositionstart', function(){
 4      cpLock = true;
 5      console.log('中文输入开始');
 6 })
 7 node.addEventListener('compositionend', function(){
 8     cpLock = false;
 9      console.log('中文输入结束');
10      calNum(this);
11 })
12 node.addEventListener('input', function(){
13     console.log("触发input");
14     calNum(this);
15 });
16 //字符串截断函数            
17 function calNum(domEle) {
18     if(!cpLock) { 
19         var maxLen = 16;
20         var curtLen = domEle.value.length;
21         console.log('当前输入' + domEle.value);
22         if ( curtLen > maxLen ) {
23           domEle.value = domEle.value.substring(0, maxLen);
24         }                                                 
25     document.getElementById("num").innerHTML = domEle.value.length.toString(); 26 } 27 }

  感兴趣的可以亲自测试下,效果很是很好的,童叟无欺哦。

  

原文地址:https://www.cnblogs.com/cleaverlove/p/6790714.html