Плагин JQuery "Constrain" - странная ошибка JavaScript - PullRequest
1 голос
/ 19 мая 2009

Справочная информация: наше веб-приложение использует плагин 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, ошибка в плагине, или я просто затаил дыхание при компиляции приложения?

1 Ответ

1 голос
/ 19 мая 2009

Вы никогда не должны использовать for (i in arr) для циклического перебора массивов. Если сценарии добавляют методы к прототипу Array, они тоже будут повторяться с использованием цикла for (i in arr). Это, вероятно, то, что вызывает ваши ошибки. Возможно, вы добавили скрипт, который изменяет цепочку Array.prototype.

Также читайте здесь в разделе «Почему вы должны прекратить использовать for… in для итерации (или никогда не поднимать ее)»
http://www.prototypejs.org/api/array

...