2017-10-10 99 views
0

这里被验证是我的小提琴:My Fiddle (updated)动态添加和删除表单字段由Parsley.js

以我形式(ID:#form),输入字段中示出或基于选择的所选择的选项隐藏输入。

每个输入及其标签都封装在一个div中,隐藏或显示基于所选选项。 select的属性data-children包含信息(采用JSON格式),当选择某个选项时,将显示哪些输入。

我用数据香菜排除属性移除香菜验证(Parsley Documentation) 不可见的领域之前,我执行香菜方法$('#form').destroy();,在结束$('#form').parsley();

我的HTML:

<div class="container"> 
    <div class="row"> 
    <div class="col-sm-offset-2 col-sm-8"> 
     <form id="form" method="post" accept-charset="UTF-8" class="form-horizontal" data-parsley-validate=""> 
      <div class="form-group"> 
       <label class="control-label" for="question_01" style="">Question 1</label> 
       <select class="form-control" name="question_01" id="question_01" required data-children="{&quot;option_01&quot;:[&quot;input_01&quot;,&quot;input_02&quot;,&quot;input_03&quot;,&quot;input_04&quot;,&quot;input_05&quot;,&quot;input_06&quot;],&quot;option_02&quot;:[&quot;input_01&quot;,&quot;input_06&quot;,&quot;input_07&quot;,&quot;input_08&quot;,&quot;input_09&quot;,&quot;input_10&quot;],&quot;option_03&quot;:[&quot;input_02&quot;,&quot;input_04&quot;,&quot;input_05&quot;,&quot;input_07&quot;,&quot;input_09&quot;,&quot;input_10&quot;,&quot;input_11&quot;]}"> 
        <option value="" selected>Bitte auswählen</option> 
        <option value="option_01">Option 01</option> 
        <option value="option_02">Option 02</option> 
        <option value="option_03">Option 03</option> 
       </select> 
      </div> 
      <div id="div_input_01" class="form-group input-div hidden"> 
       <label for="input_01" style="">Input 01</label> 
       <input type="text" class="form-control" name="input_01" id="input_01" required> 
      </div> 
      <div id="div_input_02" class="form-group input-div hidden"> 
       <label for="input_02" style="">Input 02</label> 
       <input type="text" class="form-control" name="input_02" id="input_02" required> 
      </div> 
      <div id="div_input_03" class="form-group input-div hidden"> 
       <label for="input_03" style="">Input 03</label> 
       <input type="text" class="form-control" name="input_03" id="input_03" required> 
      </div> 
      <div id="div_input_04" class="form-group input-div hidden"> 
       <label for="input_04" style="">Input 04</label> 
       <input type="text" class="form-control" name="input_04" id="input_04" required> 
      </div> 
      <div id="div_input_05" class="form-group input-div hidden"> 
       <label for="input_05" style="">Input 05</label> 
       <input type="text" class="form-control" name="input_05" id="input_05" required> 
      </div> 
      <div id="div_input_06" class="form-group input-div hidden"> 
       <label for="input_06" style="">Input 06</label> 
       <input type="text" class="form-control" name="input_06" id="input_06" required> 
      </div> 
      <div id="div_input_07" class="form-group input-div hidden"> 
       <label for="input_07" style="">Input 07</label> 
       <input type="text" class="form-control" name="input_07" id="input_07" required> 
      </div> 
      <div id="div_input_08" class="form-group input-div hidden"> 
       <label for="input_08" style="">Input 08</label> 
       <input type="text" class="form-control" name="input_08" id="input_08" required> 
      </div> 
      <div id="div_input_09" class="form-group input-div hidden"> 
       <label for="input_09" style="">Input 09</label> 
       <input type="text" class="form-control" name="input_09" id="input_09" required> 
      </div> 
      <div id="div_input_10" class="form-group input-div hidden"> 
       <label for="input_10" style="">Input 10</label> 
       <input type="text" class="form-control" name="input_10" id="input_10" required> 
      </div> 
      <div id="div_input_11" class="form-group input-div hidden"> 
       <label for="input_11" style="">Input 11</label> 
       <input type="text" class="form-control" name="input_11" id="input_11" required> 
      </div> 
      <button type="button" class="btn btn-info btn-block btn-submit-settings">Submit</button> 
     </form> 
    </div> 
    </div> 
</div> 

我的javascript:

$(document).ready(function() { 
    $('.btn-submit-settings').on('click', function(e) { 
     window.Parsley.on('field:error', function() 
     { 
      console.log('Validation failed for: ', this.$element); 
     }); 
     $('#form').submit(); 
    }); 

    $('#form select').change(function() { 
     var $this = $(this); 
     if ($this.data('children')) { 
      $('#form').parsley().destroy(); 
      // Hide all child elements 
      $.each($this.data('children'), function(value_id, input_id_array) { 
       $.each(input_id_array, function(key, input_id) { 
        if ($('#div_' + input_id).length) { 
         $('#' + input_id).val(null); 
         if (!$('#div_' + input_id).hasClass('hidden')) { 
          $('#div_' + input_id).addClass('hidden'); 
         } 
        } 
       }); 
      }); 
      // show the child elements of the selected option 
      if ($this.data('children')[$this.val()]) { 
       $.each($this.data('children')[$this.val()], function(key, input_id) { 
        if ($('#div_' + input_id).length) 
        { 
         if ($('#div_' + input_id).hasClass('hidden')) 
         { 
          $('#div_' + input_id).removeClass('hidden'); 
         } 
        } 
       }); 
      } 
      // For all inputs inside hidden div set attribute "data-parsley-excluded" = true 
      $('#form div.input-div.hidden').find(':input').each(function() { 
       var attr_data_parsley_excluded = $(this).attr('data-parsley-excluded'); 
       if (typeof attr_data_parsley_excluded === typeof undefined || attr_data_parsley_excluded === false) { 
        $(this).attr('data-parsley-excluded', 'true'); 
       } 
      }); 
      // For all inputs inside not hidden div remove attribute "data-parsley-excluded" 
      $('#form div.input-div:not(.hidden)').find(':input').each(function() { 
       console.log(this.id); 
       $(this).removeAttr('data-parsley-excluded'); 
      }); 

      $('#form').find(':input').each(function() { 
       // Log shows that attribute is set right, seems to be ignored by parsley 
       console.log('ID: ' + this.id + ' TYPE: ' + $(this).prop('nodeName') + ': excluded=' + $(this).attr('data-parsley-excluded')); 
      }); 
      $('#form').parsley(); 
      $('#form').parsley().refresh(); 
     } 
    }); 
}); 

我不能让它开始工作即使这些属性似乎是正确的。

这些字段一旦被隐藏,就不在验证中。

+0

我应该添加更多的代码的问题,虽然小提琴退出? – Phantom

+0

如果问题中包含代码和小提琴,我将对潜在的答疑者有所帮助 –

回答

1

我想你应该添加属性data-parsley-required =“false”来从验证中排除隐藏的字段。

我的意思是,试图改变

<input type="text" class="form-control" name="input_01" id="input_01" required> 

这个

<input type="text" class="form-control" name="input_01" id="input_01" data-parsley-required="false"> 

,如果你想验证它只是改变属性值或不

+0

非常感谢您的回答。 它应该工作在一般情况下:可能有其他验证标准比“必需”。 – Phantom

0

你可能需要调用refresh在修改excluded之后,在你的香菜形式上。

+0

非常感谢您的回答,但没有帮助。实际上,refresh()应该可以正常工作,在版本2.8之前它只能与destroy()和parsley()一起使用。 – Phantom

1

这不仅仅是一个真实的答案,而是我个人的观点,但我认为你试图错误地解决问题。如果我这样做,我会创建2个香菜组“shouldValidate”和“shouldNotValidate”,并根据它们是否显示来相应地添加字段。然后当你调用validate时,传递组名“shouldValidate”,并且只有那组元素将被验证。