Справочная информация: наше веб-приложение использует плагин 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 - это объект с двумя строковыми свойствами: char и regex
- item.chars - пустая строка ("") во время сбоя.
- обр. , результат item.chars.split ("") , как и ожидалось, пустой массив.
Вот где это странно. Даже если arr является пустым массивом, цикл for присваивает допустимое значение i . Значение «удалить». Итак, мы падаем в петлю. token очевидно равен нулю, потому что arr ["remove"] равен нулю. Так token.charCodeAt (0) бросков.
Я исправил ошибку, добавив оператор if вокруг цикла for следующим образом:
if (arr.length > 0) {
for (var i in arr) {
var token = arr[i];
if (token.charCodeAt(0) == e.which) {
return true;
}
}
}
Тем не менее, я совершенно сбит с толку относительно того, почему это было даже необходимо - это ошибка IE, ошибка в плагине, или я просто затаил дыхание при компиляции приложения?