2016-11-09 5 views
1

Основная информацияjquery validation - есть ли более эффективный способ сделать это?

У меня есть таблица, где каждая строка представляет контактную информацию. Нет необходимости иметь контактные данные, но если пользователь указывает внутренний номер, они должны указывать данные для каждого поля.

проблема

код у меня есть до сих пор, чтобы проверить для большинства полей работает .. но у меня есть набор флажков, представляющих день в неделю. Необходимо выбрать хотя бы один день. Код прямо сейчас не удается ... даже если у меня есть один флажок, я все равно получаю сообщение об ошибке.

Также мне интересно, есть ли способ упростить мой оператор IF, который проверяет статус флажка. Код очень многословный ... и уродливый.

HTML

<table class="table table-bordered table-hover tcdata"> 
    <tbody><tr><td colspan="6"><h3>Time Conditions</h3></td></tr> 
    <tr><td colspan="6">Default Rule:</td></tr> 

    <tr id="time_conditions"> 
     <td><input class="form-control starttc tcdata" type="input" placeholder="UTC Start Time (format 00:00:00)" name="starttime" id="starttime"></td> 
     <td><input class="form-control tcdata" type="input" placeholder="UTC End Time (format 00:00:00)" name="endtime" id="endtime"></td> 
     <td><input class="form-control tcdata" type="input" placeholder="Extension" name="extension" id="extension"></td> 
     <td><input class="form-control tcdata" type="input" placeholder="Domain" name="domain" id="domain"></td> 
     <td> 
      <label class="checkbox-inline"><b>Days of Week:</b></label> 
      <input class="checkbox-inline tcdata" type="checkbox" name="dow_m">Mon&nbsp; 
      <input class="checkbox-inline tcdata" type="checkbox" name="dow_t">Tue&nbsp; 
      <input class="checkbox-inline tcdata" type="checkbox" name="dow_w">Wed&nbsp; 
      <input class="checkbox-inline tcdata" type="checkbox" name="dow_r">Thu&nbsp; 
      <input class="checkbox-inline tcdata" type="checkbox" name="dow_f">Fri&nbsp; 
      <input class="checkbox-inline tcdata" type="checkbox" name="dow_s">Sat&nbsp; 
      <input class="checkbox-inline tcdata" type="checkbox" name="dow_t">Sun&nbsp; 
     </td> 
     <td><button id="addtc" type="button" class="btn btn-success btn-circle"><i class="fa fa-plus"></i></button></td>      
    </tr> 
    <tr class="showAdditionalRulesLabel" style=""><td colspan="6">Addtional Rules:</td></tr> 
    <tr> 
     <td><input class="form-control starttc tcdata" type="input" placeholder="UTC Start Time (format 00:00:00)" name="starttime2"></td> 

     <td><input class="form-control tcdata" type="input" placeholder="UTC End Time (format 00:00:00)" name="endtime2"></td> 
     <td><input class="form-control tcdata" type="input" placeholder="Extension" name="extension2"></td> 
     <td><input class="form-control tcdata" type="input" placeholder="Domain" name="domain2"></td> 
     <td colspan="2"><label class="checkbox-inline"><b>Days of Week:</b></label><input class="checkbox-inline tcdata" type="checkbox" name="dow_m2">Mon&nbsp;<input class="checkbox-inline tcdata" type="checkbox" name="dow_t2">Tue&nbsp;<input class="checkbox-inline tcdata" type="checkbox" name="dow_w2">Wed&nbsp;<input class="checkbox-inline tcdata" type="checkbox" name="dow_r2">Thu&nbsp;<input class="checkbox-inline tcdata" type="checkbox" name="dow_f2">Fri&nbsp;<input class="checkbox-inline tcdata" type="checkbox" name="dow_s2">Sat&nbsp;<input class="checkbox-inline tcdata" type="checkbox" name="dow_n2">Sun&nbsp; 
    </td></tr> 

<tr id="submitbtnsection"><td colspan="6"><input type="submit" name="submit" id="submit" class="btn btn-primary" value="Assign"></td></tr> 

      </tbody> 
</table> 

И вот Javascript (частично), который вызывается при попытке отправить форму:

$('.tcdata tr').each(function (i, row) { 
      var $row = $(row); 
      var $ext = $row.find('input[name*="extension"]'); 
      if ($ext.val()) { 
        //extension data has been defined.. make sure you have start time/end time 
        var $start = $row.find('input[name*="starttime"]'); 
        var $end = $row.find('input[name*="endtime"]'); 
        var $domain = $row.find('input[name*="domain"]'); 
        if (!$start.val() || !$end.val() || !$domain.val()) { 
          $(".btn-warning").html("Whoops! Every time condition must have a start/end time, and a domain"); 
          e.preventDefault(); 
          return; 
        } 

        //check days of week. 
        var $dow_m = $row.find('input[name*="dow_m"]'); 
        var $dow_t = $row.find('input[name*="dow_t"]'); 
        var $dow_w = $row.find('input[name*="dow_w"]'); 
        var $dow_r = $row.find('input[name*="dow_r"]'); 
        var $dow_f = $row.find('input[name*="dow_f"]'); 
        var $dow_s = $row.find('input[name*="dow_s"]'); 
        var $dow_s = $row.find('input[name*="dow_n"]'); 
        if ((!$("#dow_m").is(':checked')) && (!$("#dow_t").is(':checked')) && (!$("#dow_w").is(':checked')) && (!$("#dow_r").is(':checked')) && (!$("#dow_f").is(':checked')) && (!$("#dow_s").is(':checked')) && (!$("#dow_n").is(':checked'))) { 
          //nothing selected 
            $(".btn-warning").html("Whoops! Every time condition must have a day of week assign to it"); 
            e.preventDefault(); 
            return; 
        } 


      } 
    }); 

Еще один комментарий - в случае, если это помогает ... Вы заметите, что для каждой строки в моей таблице имена полей идентичны, за исключением того, что число в конце увеличивается. Так, например:

name="dow_w" 
    name="dow_w2" 

эти строки генерируются динамически JQuery ... но я не думаю, что это отношение, так что я не включил код. Код html, который вы видите выше, является RENDERED html ... так что это довольно точно.

Любая помощь в определении того, где моя ошибка будет оценена.

+0

я понял одну часть из. Ни одна из контрольных знаков не имела идентификатора. только имя. теперь, когда я изменил его, он работает. Глупая ошибка. Но если это способ упростить код, пожалуйста, дайте мне знать – Happydevdays

ответ

0
  1. Каждое правило состоит из нескольких <tr> - так это на самом деле не имеет смысла цикла по каждому из них. Вместо этого сгруппируйте свой набор <tr>, используя <tbody> и проведите цикл над несколькими <tbody>.

  2. Я думаю, что правильный способ иметь входы с одинаковыми именами - добавить [n] (где n - это номер). Таким образом, все входы с одинаковыми [n] считаются связанными.

  3. Скорее всего, вы хотите, чтобы входы с одинаковыми именами имели похожие стили. Вместо использования идентификаторов используйте классы.

  4. Я считаю, что самый простой способ кэширования элементов с помощью [n] в конце - использовать [name^=name], где ^= означает «начать с».

  5. Вы можете использовать переключатель ^=, а также :checked, чтобы получить проверенные дни. И затем используйте свойство length, чтобы подсчитать, сколько было выбрано.

HTML (1-3)

<table class="table table-bordered table-hover tcdata"> 
    <tbody> 
    <tr> 
     <td colspan="6"> 
     <h3>Time Conditions</h3></td> 
    </tr> 
    <tr> 
     <td colspan="6">Default Rule:</td> 
    </tr> 

    <tr id="time_conditions"> 
     <td> 
     <input class="form-control starttc tcdata starttime" type="input" placeholder="UTC Start Time (format 00:00:00)" name="starttime[0]"> 
     </td> 
     <td> 
     <input class="form-control tcdata endtime" type="input" placeholder="UTC End Time (format 00:00:00)" name="endtime[0]"> 
     </td> 
     <td> 
     <input class="form-control tcdata extension" type="input" placeholder="Extension" name="extension[0]"> 
     </td> 
     <td> 
     <input class="form-control tcdata" type="input" placeholder="Domain" name="domain[0]" id="domain"> 
     </td> 
     <td> 
     <label class="checkbox-inline"><b>Days of Week:</b></label> 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_m[0]">Mon&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_t[0]">Tue&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_w[0]">Wed&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_r[0]">Thu&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_f[0]">Fri&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_s[0]">Sat&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_t[0]">Sun&nbsp; 
     </td> 
     <td> 
     <button id="addtc" type="button" class="btn btn-success btn-circle"><i class="fa fa-plus"></i></button> 
     </td> 
    </tr> 

    </tbody> 
    <tbody> 
    <tr class="showAdditionalRulesLabel" style=""> 
     <td colspan="6">Addtional Rules:</td> 
    </tr> 
    <tr> 
     <td> 
     <input class="form-control starttc tcdata" type="input" placeholder="UTC Start Time (format 00:00:00)" name="starttime[1]"> 
     </td> 

     <td> 
     <input class="form-control tcdata" type="input" placeholder="UTC End Time (format 00:00:00)" name="endtime[1]"> 
     </td> 
     <td> 
     <input class="form-control tcdata" type="input" placeholder="Extension" name="extension[1]"> 
     </td> 
     <td> 
     <input class="form-control tcdata" type="input" placeholder="Domain" name="domain[1]"> 
     </td> 
     <td colspan="2"> 
     <label class="checkbox-inline"><b>Days of Week:</b></label> 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_m[1]">Mon&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_t[1]">Tue&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_w[1]">Wed&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_r[1]">Thu&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_f[1]">Fri&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_s[1]">Sat&nbsp; 
     <input class="checkbox-inline tcdata" type="checkbox" name="dow_n[1]">Sun&nbsp; 
     </td> 
    </tr> 

    <tr id="submitbtnsection"> 
     <td colspan="6"> 
     <input type="button" name="submit" id="submit" class="btn btn-primary" value="Assign"> 
     </td> 
    </tr> 

    </tbody> 
</table> 

JavaScript (4-5)

$('.tcdata tbody').each(function() { 
    // $row is kinda misleading - better to say: $tbody 
    var $row = $(this); 
    // cleaner to store all the elements you need together 
    var $ext = $row.find('[name^="extension"]'), 
     $start = $row.find('[name^="starttime"]'), 
     $end = $row.find('[name^="endtime"]'), 
     $domain = $row.find('[name^="domain"]'); 

    // check if the user specifies an extension number 
    if ($ext.val()) { 
     // they must specify data for every field 
     if (!$start.val() || !$end.val() || !$domain.val()) { 
     $warning.html("Whoops! Every time condition must have a start/end time, and a domain"); 
     e.preventDefault(); 
     return; 
     } 
     // and at least one day must be selected 
     if (!$row.find('[name^=dow_]:checked').length) { 
     $warning.html("Whoops! Every time condition must have a day of week assign to it"); 
     e.preventDefault(); 
     return; 
     } 
    } 
}); 

Demo

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