輸入框文本輸入限制問題以及中文輸入法下字符階段的處理


        輸入框文本字數限制問題以及中文輸入法下字符截斷處理

    上次博文寫過處理實時獲取輸入表單的值,傳送門: 博文地址。這次又需要處理輸入框文本字數限制問題,前期的步驟思想其實就是要先實時獲取輸入框的值然后得到長度。

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

  感興趣的可以親自測試下,效果很是很好的,童叟無欺哦。

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM