Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JQuery";约束;插件-奇怪的Javascript错误_Javascript_Jquery_Jquery Plugins_Internet Explorer 7 - Fatal编程技术网

JQuery";约束;插件-奇怪的Javascript错误

JQuery";约束;插件-奇怪的Javascript错误,javascript,jquery,jquery-plugins,internet-explorer-7,Javascript,Jquery,Jquery Plugins,Internet Explorer 7,背景:我们的web应用程序使用jquery.Constraint.js插件处理某些文本框中的数据输入,只允许添加有效字符。该插件允许对数据进行各种约束,使用正则表达式、白名单/黑名单字符等。直到今天,我们还在运行该插件的1.0版本,未经修改 几天前我注意到一些文本框仍然允许输入无效数据。例如,仅数字文本框允许使用字母字符等。它还显示javascript错误“Object不支持此属性或方法”。我在jquery.Constraint插件中找到了以下函数 function match(item

背景:我们的web应用程序使用jquery.Constraint.js插件处理某些文本框中的数据输入,只允许添加有效字符。该插件允许对数据进行各种约束,使用正则表达式、白名单/黑名单字符等。直到今天,我们还在运行该插件的1.0版本,未经修改

几天前我注意到一些文本框仍然允许输入无效数据。例如,仅数字文本框允许使用字母字符等。它还显示javascript错误“Object不支持此属性或方法”。我在jquery.Constraint插件中找到了以下函数

    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;
    };
通过调试这段代码,我确定了以下几点:

  • 项是一个具有两个字符串属性的对象:chars和regex
  • item.chars在失败时是一个空字符串(“”)
  • 如预期的那样,item.chars.split(“”)的结果是一个空数组
这就是奇怪的地方。即使arr是空数组,for循环也会为i指定一个有效值。该值为“删除”。所以我们进入了循环。令牌显然为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 bug,插件中的bug,还是我编译应用程序时屏住呼吸的错误?

你不应该使用for(I in-arr)来循环数组。如果脚本将方法添加到数组原型中,这些方法也将使用for(i in arr)循环进行迭代。这可能就是导致您出错的原因。您可能添加了一个脚本来修改Array.prototype链

另外,请阅读“为什么您应该停止使用for…in进行迭代(或从不使用它)”

您不应该使用for(arr中的i)在阵列上循环。如果脚本将方法添加到数组原型中,这些方法也将使用for(i in arr)循环进行迭代。这可能就是导致您出错的原因。您可能添加了一个脚本来修改Array.prototype链

另外,请阅读“为什么您应该停止使用for…in进行迭代(或从不使用它)”

是的,就是这样。JQuery修改了Array.prototype,然后我们又添加了一些。我会让插件作者知道,并修复我们的本地版本。是的,就是这样。JQuery修改了Array.prototype,然后我们又添加了一些。我会让插件作者知道,并修复我们的本地版本。