zoukankan      html  css  js  c++  java
  • 输入框文本输入限制问题以及中文输入法下字符阶段的处理

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

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

      使用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 }

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

      

  • 相关阅读:
    为什么使用CWinApp类编译以后的文件会比CWinAppEx类小呢?
    遇到问题——IntelliSense: #error directive: Please use the /MD switch for _AFXDLL builds
    理解C++中复杂的指针声明
    运行没有错,但是窗口没有显示出来——Windows编程中的CreateWindow返回值为空?
    错误argument of type "char *" is incompatible with parameter of type "LPCWSTR"的解决方法
    游戏坐标和窗口坐标的变换公式
    一路风雨走过来:那些我亲密接触过的项目
    10 Fun Things to do with Tessellation
    irrlicht引擎:中文支持
    魔兽世界客户端数据研究(一)
  • 原文地址:https://www.cnblogs.com/cleaverlove/p/6790714.html
Copyright © 2011-2022 走看看