2013-02-21 4 views
0

У меня есть простой скрипт проверки формы, который проходит через мои входы, проверяет, находится ли идентификатор в массиве, и если это так проверяет, что что-то было введено в поле. Однако по какой-то причине всякая часть кода разбивает его.jQuery .each функция взлома кода

Мой код:

function ValForm() { 
    var validate = ['name', 'addr1', 'city', 'county', 'pcode']; 
    var regpcode = '/^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$/i'; 
    var fail = false; 
    $('#summary-wrap input').each(function() { 
     var id = $(this).attr('id'); 
     if($.inArray(id, validate)) { 
      if(id == 'pcode' && !regpcode.test(this.value)) { 
       fail = true; 
      } else if(this.value.length < 2) { 
       fail = true; 
      } 
     } 
    }); 
    if(fail) { 
     alert('Please complete all required fields before continuing.'); 
     $(this).focus(); 
     return false; 
    } 
    return true; 
} 

Если я кладу в недостоверных данных, форма по-прежнему представляет. Даже если я установил fail = true или вернул все значения false, форма все еще отправляется. Вот моя форма:

<form name="delivery" action="knee-icepack.php" method="post" onsubmit="return ValForm();"> 
      <label for="name">Name <span class="req">*</span>:</label><input type="text" name="name" id="name" required="required" /> 
      <br clear="all" /> 
      <label for="addr1">Address Line 1 <span class="req">*</span>:</label><input type="text" name="addr1" id="addr1" required="required" /> 
      <br clear="all" /> 
      <label for="addr2">Address Line 2:</label><input type="text" name="addr2" id="addr2" /> 
      <br clear="all" /> 
      <label for="city">Town/City <span class="req">*</span>:</label><input type="text" name="city" id="city" required="required" /> 
      <br clear="all" /> 
      <label for="county">County <span class="req">*</span>:</label><input type="text" name="county" id="county" required="required" /> 
      <br clear="all" /> 
      <label for="pcode">Post Code <span class="req">*</span>:</label><input type="text" name="pcode" id="pcode" required="required" /> 
      <br clear="all" /> 
      <input type="submit" id="submit" value="Proceed to Payment" /> 
      <input type="hidden" name="deliveryDetailsSubmitted" value="1" /> 
      <img src="images/paypal.jpg" align="right" /> 
      <br clear="all" /> 
      <span class="small"><span class="req">*</span> required field.</span> 
     </form> 

Однако, если удалить петлю .each из функции ValForm, он останавливает форму от представления, когда я устанавливаю неудачу = верно. У меня не может быть кода внутри цикла, и он все равно не будет работать. Что происходит? Это сводило меня с ума.

+0

Узнайте, как использовать консоль браузера. Это дает много полезной информации об ошибках в коде. Например, в этом случае у Chrome есть 'Uncaught TypeError: Object/^ ([A-PR-UWYZ0-9] [A-HK-Y0-9] [AEHMNPRTVXY0-9]? [ABEHMNPRVWXY0-9]? {1,2 } [0-9] [ABD-HJLN-UW-Z] {2} | GIR 0AA). Когда я запускаю ваш код, $/i не имеет метода «test» на консоли. –

+0

Я использую Firebug с Firefox, и он не придумал никаких ошибок ... Хотя это довольно очевидно. На самом деле, я просто проверил в консоли Chrome, и для меня это тоже не показывает ошибок. У вас есть дополнения для консоли? – Styphon

+0

Hm. Странный. Ничего особенного в хроме. Единственная возможная причина, по которой я вижу сейчас, это то, что я использую ветвь dev chrome. –

ответ

1

Ваше определение регулярного выражения неверно. В настоящее время это всего лишь строка. Вместо того, чтобы:

var regpcode = '/^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$/i'; 

вы должны иметь (не используя регулярное выражение буквально, не оборачивая ' символов)

var regpcode = /^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$/i; 

или (вызов конструктора объекта с регулярным выражением)

var regpcode = new RegExp('/^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$/i'); 

Подробнее here

В настоящее время ваш код не работает на этом: !regpcode.test(this.value) С кодом, regpcode является строкой, а не регулярным выражением. И не имеет теста метода.

+0

Да, это была проблема. Но почему он все еще терпит неудачу с пустым тестом $ .each, где регулярное выражение не используется? Это меня смутило! – Styphon

+0

Что касается меня, вы просто ошиблись, когда попробовали его с пустым 'each'. Возможно, проблема кэширования. Трудно сказать, что я не смог воспроизвести проблему с пустым каждым. –

Смежные вопросы