フォームの検証に parsleyjs.org を使用しています。
入力に検証エラーがある場合、プラグインはui.parsley-errors-list
を作成します。
問題は、.parsley-errors-list
がフォーム要素の「input、textarea、radioなど」の直後に配置されていることです。次のようにレイアウトが壊れています。
<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>
内の最後の子/要素になるように配置する必要があります。
これは達成可能ですか?
エラーコンテナは(少なくとも)2つの方法で設定できます。
DOM属性を持つコンテナーを変更します
入力が1つ(または入力のグループ)しかなく、それらの入力のエラーのコンテナーを変更する場合は、data-parsley-errors-container="#element"
( ドキュメントを参照 を使用できます。 =)。これが例です(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
で「グループ化」しているため、すべてのチェックボックスにdata-parsley-multiple="checkbox2"
を追加する必要はありません。
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();
}
多くのフィールドで機能するため、クラスを使用します。