js文本框字符數輸入限制


  我們常常在前台頁面做一些文本輸入長度的驗證,為什么呢?因為數據庫字段設置了大小,如果不限制輸入長度,那么寫入庫時就會引發字符串截斷異常。今天就給大家分享一個jquery插件來解決這一問題。

 1 (function ($) {
 2     $.fn.limitTextarea = function (opts) {
 3         var defaults = {
 4             maxNumber: 500, //允許輸入的最大字數
 5             position: 'top', //提示文字的位置,top:文本框上方,bottom:文本框下方
 6             onOk: function () { }, //輸入后,字數未超出時調用的函數
 7             onOver: function () { } //輸入后,字數超出時調用的函數
 8         }
 9         var option = $.extend(defaults, opts);
10         this.each(function () {
11             var _this = $(this);
12             var info = '<div id="info' + option.maxNumber + '">還可以輸入<b>' + (option.maxNumber - getByteLen(_this.val())) + '</b>字符</div>';
13             var fn = function () {
14                 var $info = $('#info' + option.maxNumber + '');
15                 var extraNumber = option.maxNumber - getByteLen(_this.val());
16 
17                 if (extraNumber >= 0) {
18                     $info.html('還可以輸入<b>' + extraNumber + '</b>個字符');
19                     option.onOk();
20                 } else {
21                     $info.html('還可以輸入<b>0</b>個字符');
22                     option.onOver();
23                 }
24             };
25             switch (option.position) {
26                 case 'top':
27                     _this.before(info);
28                     break;
29                 case 'bottom':
30                 default:
31                     _this.after(info);
32             }
33             //綁定輸入事件監聽器
34             if (window.addEventListener) { //先執行W3C
35                 _this.get(0).addEventListener("input", fn, false);
36             } else {
37                 _this.get(0).attachEvent("onpropertychange", fn);
38             }
39             if (window.VBArray && window.addEventListener) { //IE9
40                 _this.get(0).addEventListener("onkeydown", function () {
41                     var key = window.event.keyCode;
42                     (key == 8 || key == 46) && fn(); //處理回退與刪除
43                 });
44                 _this.get(0).addEventListener("oncut", fn); //處理粘貼
45             }
46         });
47     }
48     function getByteLen(val) {
49         var len = 0;
50         for (var i = 0; i < val.length; i++) {
51             if (val[i].match(/[^\x00-\xff]/ig) != null) //全角 
52                 len += 2;
53             else
54                 len += 1;
55         }
56         return len;
57     }
58     function getByteVal(val, max) {
59         var returnValue = '';
60         var byteValLen = 0;
61         for (var i = 0; i < val.length; i++) {
62             if (val[i].match(/[^\x00-\xff]/ig) != null)
63                 byteValLen += 2;
64             else
65                 byteValLen += 1;
66             if (byteValLen > max)
67                 break;
68             returnValue += val[i];
69         }
70         return returnValue;
71     }
72 })(jQuery)

48行以下,我的同事添加了兩個函數,其實這么寫有點奇怪,我們完全可以采用函數表達式的寫法。比如:

  this.getByteLen= function(val) {
        var len = 0;
        for (var i = 0; i < val.length; i++) {
            if (val[i].match(/[^\x00-\xff]/ig) != null) //全角 
                len += 2;
            else
                len += 1;
        }
        return len;
    }

不過需要注意的一點是,此定義形同變量定義,要寫到被調用代碼之前。不過這就牽扯到了“閉包”等一系列概念,我們以后再討論。

再看看這個插件如何使用:

 1  $('#Remarks').limitTextarea({
 2             maxNumber: 800, //最大字數
 3             position: 'bottom', //提示文字的位置,top:文本框上方,bottom:文本框下方
 4             onOk: function () {
 5                 $('#Remarks').css('background-color', 'white');
 6             }, //輸入后,字數未超出時調用的函數
 7             onOver: function () {
 8                 var value = $('#Remarks').val();
 9 
10                 $('#Remarks').val(getByteVal(value, 800));
11 
12             }
13         });

經實踐,用起來還不錯,特此推薦。

如上圖,13個漢字,26個字節,數據庫名稱限制是28個字節。

 


免責聲明!

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



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