// 解决 IE 和非 IE 浏览器在事件绑定方面的兼容性 function addEventHandler(elem, event, handler) { if (elem.addEventHandler) { elem.addEventHandler(event, handler, false); } else if (elem.attachEvent) { elem.attachEvent("on" + event, handler); } else { elem["on" + event] = handler; } } // 用于添加类名 function addClassName(elem, newClassName) { if (elem.className.split(/\s/).indexOf(newClassName) === -1) { elem.className += (' ' + newClassName); return true; } return false; } // 用于删除类名 function removeClassName(elem, oldClassName) { var names = elem.className.split(/\s/); var index = names.indexOf(oldClassName); if (index !== -1) { names.splice(index, 1); elem.className = names.join(' '); return true; } return false; } /* DOM */ var verifyBtn = document.getElementById("verify"); var input = document.getElementById("name"); var info = input.nextElementSibling; var isNotEmpty = function(rawVal) { var trimmedVal = rawVal.trim(); if (trimmedVal.length === 0) { return false; } else { return trimmedVal; } }; var notContainWhitespace = function(value) { if (/\s/.test(value)) { return false; } return true; }; var isValidLength = function(value) { var enReg = /[x00-xff]/g; var zhReg = /[^x00-xff]/g; // [a-zA-Z0-9][\u4e00-\u9fa5] var length = 0; /* 计算长度 */ length += value.match(enReg) && value.match(enReg).length; length += value.match(zhReg) && value.match(zhReg).length * 2; /* 控制台打印信息(测试) */ if (value.match(enReg)) { console.log("英文字符长:" + value.match(enReg).length) } if (value.match(zhReg)) { console.log("中文字符长:" + value.match(zhReg).length * 2) } console.log("总长度为:" + length) console.log("----------") /* 判断长度是否合法 */ if (length >= 4 && length <= 16) { return true; } return false; }; var invalidStylish = function(information) { removeClassName(input, "valid"); addClassName(input, "invalid"); info.innerHTML = information; }; var validStylish = function() { removeClassName(input, "invalid"); addClassName(input, "valid"); info.innerHTML = "用户名格式正确~"; }; var checkValue = function(rawVal) { var information = ""; var val = isNotEmpty(rawVal); if (!val) { information = "用户名不能为空!"; } else if (!notContainWhitespace(val)) { information = "用户名不能包含空格!"; } else if (!isValidLength(val)) { information = "用户名长度要在 4 ~ 16 个字符内!"; } if (information) { invalidStylish(information); } else { validStylish(); } }; addEventHandler(verifyBtn, "click", function() { var rawVal = input.value; checkValue(rawVal); });
<div class="main"> <label for="name">用户名</label> <div class="wrapper"> <input type="text" id="name" /> <span class="info">必填项。长度为 4 ~ 16 个字符。</span> </div> <input type="button" id="verify" value="验证"/> </div>
body { margin: 0; } .main { padding: 20px; text-align: center; } label[for="name"] { display: inline-block; line-height: 22px; vertical-align: top; } .wrapper { position: relative; display: inline-block; height: 40px; } #name { border: 1px solid #555; border-radius: 3px; padding: 0 6px; width: 200px; line-height: 20px; outline: none; } #name.invalid { border-color: red; } #name.valid { border-color: yellowgreen; } .info { position: absolute; left: 0; bottom: 0; font-size: 12px; } #name.invalid + .info { color: red; } #name.valid + .info { color: yellowgreen; } #verify { border: 1px solid steelblue; border-radius: 3px; padding: 0 6px; background-color: steelblue; color: #fff; line-height: 20px; outline: none; }