2009-05-19 64 views
1

背景:我们的web应用程序使用jquery.constrain.js插件来处理某些文本框中的数据输入,以仅允许添加有效字符。这个插件允许对数据进行各种约束,使用正则表达式,白名单/黑名单字符等。直到今天,我们运行了这个插件的1.0版本,未经修改。JQuery“Constrain”插件 - 奇怪的Javascript错误

我注意到几天前,一些文本框仍然允许无效的数据输入。例如,只有数字的文本框允许使用字母字符等。它还显示一个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是失败时的空字符串(“”)。
  • arr的结果如预期的那样,item.chars.split(“”)是一个空数组。

这里是它的地方很奇怪。尽管arr是一个空数组,但for循环将有效值分配给i。值是“删除”。所以我们进入循环。 令牌显然为空,因为arr [“remove”]为空。所以token.charCodeAt(0)抛出。

我通过增加一个,如果周围的语句循环更正错误,如下所示:

 if (arr.length > 0) { 
      for (var i in arr) { 
       var token = arr[i]; 
       if (token.charCodeAt(0) == e.which) { 
        return true; 
       } 
      } 
     } 

不过,我完全感到困惑,这是为什么即使必要 - 这是一个IE漏洞,插件中的错误,还是我在编译应用程序时只是屏住呼吸错误?

回答

1

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

此外,根据在这里读到:“为什么你应该停止使用...迭代(或者从来没有把它上升)”
http://www.prototypejs.org/api/array

+0

是的,就是这样。 JQuery修改Array.prototype,然后我们再添加一些。我会让插件作者知道,并修复我们的本地版本。 – GalacticCowboy 2009-05-19 16:04:11