背景:我们的网络应用程序使用 jquery.constrain.js 插件来处理某些文本框中的数据输入,只允许添加有效字符。该插件允许对数据进行各种约束,使用正则表达式、白名单/黑名单字符等。直到今天,我们一直在运行该插件的 1.0 版本,未经修改。
几天前我注意到一些文本框仍然允许输入无效数据。例如,仅数字文本框允许使用字母字符等。它还显示 javascript 错误“对象不支持此属性或方法”。我将其追踪到 jquery.constrain 插件中的以下函数。
function match(item, input, e) {
var arr = item.chars.split("");
for (var i in arr) {
var token = arr[i];
if (token.charCodeAt(0) == e.which) {
return true;
}
}
if (item.regex) {
var re = new RegExp(item.regex);
if (re.test(String.fromCharCode(e.which))) {
return true;
}
}
return false;
};
通过这段代码进行调试,我确定了以下内容:
- item是一个具有两个字符串属性的对象:chars和regex
- item.chars在失败时是一个空字符串 ("")。
- arr,item.chars.split("")的结果正如预期的那样是一个空数组。
这就是奇怪的地方。即使arr是一个空数组,for 循环也会为i分配一个有效值。值为“删除”。所以我们进入循环。 token显然为空,因为 arr["remove"] 为空。所以token.charCodeAt(0)抛出。
我通过在 for 循环周围添加 if 语句来纠正错误,如下所示:
if (arr.length > 0) {
for (var i in arr) {
var token = arr[i];
if (token.charCodeAt(0) == e.which) {
return true;
}
}
}
但是,我完全困惑为什么这甚至是必要的 - 这是一个 IE 错误,插件中的一个错误,还是我在编译应用程序时只是屏住呼吸?