更改 parsley-errors-list 在 parsleyjs 中的位置

Change the position of parsley-errors-list in parsleyjs

我正在使用 parsleyjs.org 来验证我的表格。

当输入有验证错误时,插件会创建一个 ui.parsley-errors-list

问题是 .parsley-errors-list 被放置在表单元素的 "input, textarea, radio etc.." 之后,破坏了我的布局,如下所示:

<fieldset>
    <p>Checkboxs with a max</p>
    <label class="checkbox parsley-error">
        <input name="checkbox2" type="checkbox" required="" data-parsley-maxcheck="2" data-parsley-multiple="checkbox2" data-parsley-id="5492"> <span></span>
        <p>Normal</p>
    </label>
    <ul class="parsley-errors-list filled" id="parsley-id-multiple-checkbox2">
        <li class="parsley-required">This value is required.</li>
    </ul>
    <label class="checkbox">
        <input name="checkbox2" type="checkbox" data-parsley-multiple="checkbox2" data-parsley-id="5492">   <span></span>
        <p>Normal</p>
    </label>
    <label class="checkbox">
        <input name="checkbox2" type="checkbox" data-parsley-multiple="checkbox2" data-parsley-id="5492">   <span></span>
        <p>Normal</p>
    </label>
</fieldset>

相反,.parsley-errors-list 需要定位到容器 <fieldset> 中的最后一个 child/element。

这可以实现吗?

您可以(至少)通过两种方式设置错误容器。

  1. 更改具有 DOM 属性的容器

    如果您只有一个输入(或一组输入,就像您一样)并且您想要更改这些输入的错误容器,您可以使用 data-parsley-errors-container="#element"see the docs). Here is an example (jsfiddle demo)

    <fieldset>
        <label class="checkbox-inline">
            <input type="checkbox" id="inlineCheckbox1" required data-parsley-maxcheck="2" data-parsley-multiple="checkbox2" value="option1" data-parsley-errors-container="#checkbox-errors" /> 1
        </label>
        <label class="checkbox-inline">
            <input type="checkbox" id="inlineCheckbox2" data-parsley-maxcheck="2" data-parsley-multiple="checkbox2" value="option2" /> 2
        </label>
        <label class="checkbox-inline">
            <input type="checkbox" id="inlineCheckbox3" data-parsley-maxcheck="2" data-parsley-multiple="checkbox2" value="option3" /> 3
        </label>
    
        <div id="checkbox-errors"></div>
    </fieldset>
    

    注意第一个复选框上的属性 data-parsley-errors-container="#checkbox-errors" 和字段集末尾的元素 <div id="checkbox-errors"></div>

    在这种情况下,您不需要将 data-parsley-errors-container 添加到所有复选框,因为您是 "grouping" 它们 data-parsley-multiple="checkbox2".

  2. 设置要由 Parsley 使用的自定义配置

    如果您有几个或所有输入并且您想要更改默认容器的位置。假设您所有的字段都放在一个字段集中,并且您想在字段集的末尾显示错误。

    此解决方案允许您更改每个字段的默认容器 (jsfiddle demo)

    <fieldset>
        <label class="checkbox-inline">
            <input type="checkbox" id="inlineCheckbox1" required data-parsley-maxcheck="2" data-parsley-multiple="checkbox2" value="option1" /> 1
        </label>
        <label class="checkbox-inline">
            <input type="checkbox" id="inlineCheckbox2" data-parsley-maxcheck="2" data-parsley-multiple="checkbox2" value="option2" /> 2
        </label>
        <label class="checkbox-inline">
            <input type="checkbox" id="inlineCheckbox3" data-parsley-maxcheck="2" data-parsley-multiple="checkbox2" value="option3" /> 3
        </label>
    
        <div id="checkbox-errors"></div>
    </fieldset>
    
    <script>
    $(document).ready(function() {
        var parsleyConfig = {
            errorsContainer: function(parsleyField) {
                var fieldSet = parsleyField.$element.closest('fieldset');
    
                if (fieldSet.length > 0) {
                    return fieldSet.find('#checkbox-errors');
                }
    
                return parsleyField;
            }
        };
    
    
        $("form").parsley(parsleyConfig);
    });
    </script>
    

    在此解决方案中,我们在字段集末尾之前添加了元素 <div id="checkbox-errors"></div> 并更改了 Parsley 的 errorsContainer 选项。如果我们的元素在字段集中,错误将显示在 #checkbox-errors.

    基于此示例,您还可以为所有字段设置相同的容器。在这种情况下,您的选择将是这样的 (jsfiddle demo):

    var parsleyConfig = {
        errorsContainer: function(parsleyField) {
            return $('#errors');
        }
    };
    

试试这个:

$.listen('parsley:field:error', function(fieldInstance){
            var fieldName = fieldInstance.$element.attr('name');
            var field = $('input[name="'+fieldName+'"]');
            var fieldWrapper = field.parents('fieldset');
            if (fieldWrapper.find('.errors_container').length > 0) {
                setTimeout(function(){
                    fieldWrapper.find('.errors_container').append(fieldWrapper.find('.parsley-errors-list'));
                },100);
            }
        });
        $('form').parsley();
}

使用class,因为它适用于许多领域。

对于 parsley js 中的这种 UI 错误。 您可以使用 data-parsley-errors-container 自定义验证器根据您的表单需要放置欧芹错误消息。

<div>
    <div class="radio radio-primary">
        <input type="radio" id="cellPhone1" value="1" name="rd_cell_phone" required="" data-parsley-error-message="Please select an option" data-parsley-errors-container="#cell-phone-validation-error-block">
        <label for="cellPhone1"> Yes </label>
    </div> 
    <div class="radio radio-primary">
        <input type="radio" id="cellPhone0" value="0" name="rd_cell_phone" required="" data-parsley-error-message="Please select an option" data-parsley-errors-container="#cell-phone-validation-error-block">
        <label for="cellPhone0"> No </label>
    </div> 
</div>
<div class="margin-top10" id="cell-phone-validation-error-block"></div>