2009-05-19 3 views
1

Фон: наше веб-приложение использует плагин jquery.constrain.js для обработки ввода данных в некоторых текстовых полях, позволяя добавлять только допустимые символы. Этот плагин допускает различные ограничения на данные, используя регулярные выражения, символы «белый список/черный список» и т. Д. До сегодняшнего дня мы запускали версию 1.0 этого модуля без изменений.JQuery Плагин «Constrain» - Weird Javascript Error

Я заметил несколько дней назад, что некоторые текстовые поля по-прежнему допускают недопустимый ввод данных. Например, текстовое поле с числовым значением допускало альфа-символы и т. Д. Оно также отображало ошибку 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. Значение «remove». Итак, мы заглядываем в петлю. token, очевидно, null, потому что arr ["remove"] имеет значение null. Итак, token.charCodeAt (0) throws.

я исправил ошибку, добавив, если заявление вокруг для цикла следующим образом:

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

Однако я совершенно сбит с толку, почему это было даже необходимо - разве это ошибка IE , ошибка в плагине, или я просто задерживаю дыхание, когда компилирую приложение?

ответ

1

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

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

+0

Да, это был он. JQuery изменяет Array.prototype, а затем мы добавили к нему еще несколько. Я дам автору плагина знать и исправить нашу локальную версию. – GalacticCowboy