JQuery“Constrain”插件 - 奇怪的Javascript错误

时间:2009-05-19 15:43:11

标签: javascript jquery jquery-plugins internet-explorer-7

背景:我们的网络应用程序使用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 显然为null,因为arr [“remove”]为null。所以 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错误,插件中的错误,还是我在编译应用程序时只是屏住呼吸错误?

1 个答案:

答案 0 :(得分:1)

你永远不应该使用(i in arr)循环遍历数组。如果脚本向Array原型添加方法,那么这些方法也将使用for(i in arr)循环进行迭代。这可能是导致错误的原因。您可能添加了一个修改Array.prototype链的脚本。

另请阅读“为什么你应该停止使用...进行迭代(或永不接受)” http://www.prototypejs.org/api/array