【问题标题】:JQuery "Constrain" plugin - Weird Javascript ErrorJQuery“约束”插件 - 奇怪的 Javascript 错误
【发布时间】:2009-05-19 15:43:11
【问题描述】:

背景:我们的网络应用使用 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 是一个具有两个字符串属性的对象:charsregex
  • item.chars 在失败时是一个空字符串 ("")。
  • arritem.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 错误、插件中的一个错误,还是我在编译应用程序时屏住了呼吸?

【问题讨论】:

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


    【解决方案1】:

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

    另请阅读“为什么你应该停止使用 for...in 来迭代(或永远不要使用它)”下的此处
    http://www.prototypejs.org/api/array

    【讨论】:

    • 是的,就是这样。 JQuery 修改了 Array.prototype,然后我们添加了更多内容。我会让插件作者知道,并修复我们的本地版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    相关资源
    最近更新 更多