背景:我們的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漏洞,插件中的錯誤,還是我在編譯應用程序時只是屏住呼吸錯誤?
是的,就是這樣。 JQuery修改Array.prototype,然後我們再添加一些。我會讓插件作者知道,並修復我們的本地版本。 – GalacticCowboy 2009-05-19 16:04:11