【问题标题】:Parsley.js validate parts of form based on selected radio buttonParsley.js 根据选定的单选按钮验证表单的一部分
【发布时间】:2014-11-23 18:55:15
【问题描述】:

通过这个小提琴可能最容易解释:http://jsfiddle.net/shanomurphy/dL688o9j/

我想根据选择的单选按钮显示/隐藏表单的某些部分。检查单选按钮时,我显示一些额外的表单字段并隐藏其他字段。我只希望 Parsley.js 验证显示的字段。

当更改所选的单选按钮时,我遇到问题,并且已经运行了欧芹验证。

// Vars
var drinks_fields = $('#drinks');
var food_fields   = $('#food');
    
// Hide fields until needed
drinks_fields.hide();
food_fields.hide();

$("input[name=choice]").on('click', function() {

    if ( $(this).val() == 'Drinks' ) {
        
        // Show drinks hide food
        drinks_fields.show();
        food_fields.hide();
        
        // Update required
        $("input[name=drinks]").prop('required',true);
        $("input[name=food]").prop('required',false);
        
    } else if ( $(this).val() == 'Food' ) {
        
        // Show food hide drinks
        food_fields.show();
        drinks_fields.hide();
        
        // Update required
        $("input[name=food]").prop('required',true);
        $("input[name=drinks]").prop('required',false);
    
    }
    
});
<form data-parsley-validate="true">
    
   <fieldset>
       <legend>Choice</legend>
       <input type="radio" name="choice" value="Drinks" required data-parsley-error-message="Choose drinks or food"/>Drinks
       <input type="radio" name="choice" value="Food"/>Food
   </fieldset>
    
   <fieldset id="drinks">
       <legend>Drinks</legend>
       <input type="checkbox" name="drinks" data-parsley-mincheck="2" data-parsley-trigger="change" data-parsley-error-message="Choose min 2 drinks"/>Water
       <input type="checkbox" name="drinks"/>Pepsi
       <input type="checkbox" name="drinks"/>Orange Juice
   </fieldset>
    
   <fieldset id="food">
       <legend>Food</legend>
       <input type="checkbox" name="food" data-parsley-mincheck="2" data-parsley-trigger="change" data-parsley-error-message="Choose min 2 foods"/>Cake
       <input type="checkbox" name="food"/>Hotdog
       <input type="checkbox" name="food"/>Pizza
   </fieldset>
       
   <button type="submit">submit</button>

</form>

【问题讨论】:

    标签: javascript jquery forms validation parsley.js


    【解决方案1】:

    显示/隐藏字段后,需要重新绑定 Parlsey。

    类似这样的:

    $("input[name=choice]").on('click', function() {
        if ( $(this).val() == 'Drinks' ) {
            // your code
        } else if ( $(this).val() == 'Food' ) {
            // your code
        }
    
        $("form").parsley().destroy();
    
        $("form").parsley();
    });
    

    或者,您可以为隐藏的字段销毁 ParsleyField 对象,并为显示的字段创建 ParsleyField 对象,如下所示:

    $("input[name=choice]").on('click', function() {
        if ( $(this).val() == 'Drinks' ) {
            // Show drinks hide food
            drinks_fields.show();
            drinks_fields.parsley();
            food_fields.hide();
            food_fields.parsley().destroy();
            // Update required
            $("input[name=drinks]").prop('required',true);
            $("input[name=food]").prop('required',false);
        } else if ( $(this).val() == 'Food' ) {
            // Show food hide drinks
            food_fields.show();
            food_fields.parsley();
            drinks_fields.hide();
            drinks_fields.parsley().destroy();
            // Update required
            $("input[name=food]").prop('required',true);
            $("input[name=drinks]").prop('required',false);
        }  
    });
    

    【讨论】:

    • 是的,但我认为 parlsey v2 旨在避免这种事情。
    • @Marc-AndréLafortune 正如他们所说,这不是一个错误,而是一个特性:) 问题是,当您将欧芹应用于表单时(在本例中,通过 data-parsley-validate="true"),欧芹将为每个字段创建一个ParsleyForm 对象和一个ParsleyField(未从配置中排除)。如果即时隐藏或显示字段,ParsleyField 要么保留,要么根本不存在。这就是为什么你需要销毁 parsley 并重新绑定它,所以它会销毁现有对象并创建新对象。
    • 这个问题有另一种解决方案。即销毁每个隐藏字段的 ParsleyField 对象,并为每个显示的字段创建 ParsleyField 对象。查看更新的答案。
    • 对,但这些都不是必需的。请参阅我发现的两个错误的更新答案。
    【解决方案2】:

    有趣的例子和很棒的小提琴。

    现在 2.0.6 已经发布,如果你也相应地更改了 data-parsley-mincheck 属性,你的小提琴就可以工作了。这是an example 错误显示无法正常工作,不知道为什么。

    您的问题说明a bug 删除了必填字段。它还说明了another bug 删除了所有约束(这也带来了一些flawed tests)。

    这些错误已在 2.0.6 中修复。

    不过,还有另一种方式来看待这个问题。您可以简单地排除隐藏输入,而不是更改字段的 required 属性:

    jQuery("form").parsley({ excluded: ":hidden" });
    

    完成fiddle here。在这个例子中,错误消息不会显示,我不知道为什么(我昨天才开始认真查看parlsey)。

    【讨论】:

    • 似乎在创建验证器实例时隐藏的所有元素都缺少应该包含错误消息的 ul.parsley-errors-list 元素。我刚刚为此记录了一个问题,因为这显然是一个错误 -> github.com/guillaumepotier/Parsley.js/issues/864
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2013-02-01
    • 2017-03-16
    相关资源
    最近更新 更多