javascript for in 与 $().bind结合出现奇怪的问题!
问题
函数 bindInputBlur()
绑定输入框的输入内容格式限制,但是用了for in
来循环绑定 bind
,结果却发现 当触发 input.bind-email
的 onblur
事件的时候,触发的是 arrRegExp
的最后一个 bind-hobby
而不是 bind-email
。
代码
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<!--<script src="/jquery.min.js"></script>-->
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
</head>
<body>
<input type="text" name="qq" class="bind-email" value="111"/>
<script>
bindInputBlur();
function bindInputBlur() {
var arrRegExp = {
'bind-email': ["[^a-zA-Z0-9\.@-]+", 20],
'bind-qq': ['(^0|[\D]+)', 14],
'bind-phone': ['(^0|[\D]+)', 11],
'bind-mobile': ['(^0|[\D]+)', 11],
'bind-vcode-4': ['[^a-zA-Z0-9]+', 4],
'bind-vcode-sms': ['[\D]', 6],
'bind-cardNo': ['[\D]+', 18],
'bind-cardPwd': ['[\D]+', 18],
'bind-username': ['[^a-zA-Z0-9]', 18],
'bind-hobby': ['', 13]
}
var bindString = 'blur keyup keypress click';
for (var i in arrRegExp) {
$('.' + i).bind(bindString, function () {
console.log(i, arrRegExp[i]);
if (!this.value || !(i in arrRegExp)) return;
var _regFind = arrRegExp[i][0] || '';
var _maxLen = arrRegExp[i][1] || 0;
if (_regFind) {
var regExp = new RegExp(_regFind, 'g');
if (regExp && regExp.test(this.value)) {
this.value = this.value.replace(regExp, '');
}
}
if (typeof _maxLen == 'number' && _maxLen && this.value.length > _maxLen) {
this.value = this.value.substring(0, _maxLen);
}
});
}
}
</script>
</body>
</html>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
教科书式的闭包问题
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops_A_common_mistake
教科书式的闭包问题+1
因为是过来人,所以给你举个简单易懂的例子,如果你想了解闭包的更多知识,请阅读闭包在 JavaScript 中的解释。
参考链接