我們常常在前台頁面做一些文本輸入長度的驗證,為什么呢?因為數據庫字段設置了大小,如果不限制輸入長度,那么寫入庫時就會引發字符串截斷異常。今天就給大家分享一個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個字節。