2009-05-19 99 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