表單功能之"即時提示可輸入字元(區分中英文)"

最近學開車, 所以較疲憊...

但看到這個功能的code又令人精神一振...一看就知道是非新手才寫的出來的,

非常簡潔且設計感高,

所以想向這個code學習,

很多人都怕給別人看到自己的source code, 其實根本不用擔心,

這種事只能防懶人, 如果真的有心要看是防不住的, 而這種有心人我是覺得不多拉~

我自己要看懂以下的每個code也是花一段時間>"<



以下是完整的code:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>2-10 即時顯示可輸入字元</title>
<style>
.remainingCharacter {
color: green;
font-weight: bold;
}
</style>
</head>
<body>

    <h2>即時顯示還可以輸入多少字元(區分中英文)</h2>
    <input type="text" data-length="5" id="remainingCharacters" data-           remainingCharacters="charActers1,charActers2" data-model="Ch" name="remainingCharacters"/><br />
    <p>測試1:還可以輸入<span class="remainingCharacters" id="charActers1">5</span>字元</p>
    <p>測試2:還可以輸入<span class="remainingCharacters" id="charActers2">5</span>字元</p>

<script>

window.onload = function(){

var forElementArr = function(_elementArr, callBack){ //走訪節點

var arr =_elementArr,         //所有節點物件
self = this;                //外層環境  --> 其實這個在這功能中都沒用到@@

if(!(_elementArr instanceof Array)) { //如果不是陣列,變成陣列物件方便處理

arr = [_elementArr];

};

for(var i= 0,arrLen = arr.length ;i<arrLen;i++){ //走訪陣列

var arrI = arr[i];

if(typeof arrI == "string"){                  //判斷是否為字串

arrI = document.getElementById(arrI);       // 取得html中那兩個<p></p>的innerHTML

}

callBack && callBack(i, arrI);         //如果有回呼則執行回呼 --> 新手才寫不出來"callBack &&"這行, 真的厲害

}
},

showRemainingCharacters = function(_nums, _remainingCharacters){

if(_remainingCharacters.search(",") != -1){

_remainingCharacters = _remainingCharacters.split(","); //英文字串分割

}

forElementArr(_remainingCharacters, function(_index, _this){

_this.innerHTML = (_nums && _nums.toString()) || "0";             //新手才寫不出來"nums && "這行, 真的厲害

});

},

strLen = (function() {                                //統計中英文字元數

var trim = function(chars){                                            // trim是私有變數, 形成閉包

return (chars || "").replace( /^(\s|\u00A0)+|(\s|\u00A0)+$/g, "" );

}

return function(_str, _model) { //返回字元處理的函數

_str = trim(_str),
_model = _model || "Ch";        //預設為中文模式
var _strLen = _str.length;        //獲取字元長度
if(_strLen == 0){                //如果字元長度為0直接返回

return 0;

}

else{

var chinese = _str.match(/[\u4e00-\u9fa5]/g);      //匹配中文
return _strLen + (chinese && _model == "Ch" ? chinese.length: 0);                                                     // 因為中文佔的位子是非中文的2倍, 所以這邊如果在中文模式下 ,要加上 var chinese的數字

}
};
})(),
//獲取限制對象
remainingCharacters = document.getElementById("remainingCharacters"),
clearNonumber = function(tThis){ //清除數字字元

var _v = tThis.value,
_vLen = _v.length,
dataLength = tThis.getAttribute("data-length"),
remainingCharacters = tThis.getAttribute("data-remainingCharacters"); //如果有即時顯示的屬性,則在指定元素上顯示

/*區分中英文前 (這段被註解掉是因為這用在不區分中英文的功能中)
if(_v.length > dataLength) tThis.value = _v.substr(0, dataLength);*/

var dataModel = tThis.getAttribute("data-model");
                     
                        //區分中英文後
var subLen = dataLength;
if(dataModel == "Ch"){                 //如果為中文模式

_vLen = strLen(_v, dataModel); //獲取長度
var vv = _v.match(/[\u4e00-\u9fa5]/g);
subLen = dataLength - (!vv ? 0 : vv.length);

}

if(_vLen > dataLength)  tThis.value = _v.substr(0, subLen);

if(remainingCharacters){

showRemainingCharacters(!_vLen ? dataLength :(_vLen > dataLength ? 0 :dataLength - _vLen), remainingCharacters);

}

};

remainingCharacters.onfocus = function(){ //獲取焦點

clearNonumber(this);

}

remainingCharacters.onkeyup = function(){ //鍵盤事件

clearNonumber(this);

}

remainingCharacters.onblur = function(){         //失去焦點

clearNonumber(this);

}

};
</script>
</body>
</html>



留言

熱門文章