J'essaie de valider le champ select2 en utilisant le plugin jquey.validation mais rien ne se passe.
Je veux faire sélectionner le champ requis.
J'utilise cette fonction de validation personnalisée:
$.validator.addMethod("requiredcountry", function(value, element, arg){
return arg != value;
}, "Value must not equal arg.");
et c'est la règle:
rules:
{
country:
{
required: true,
requiredcountry: ""
}
}
Quel champ select2 dois-je utiliser pour que la règle corresponde?
J'apprécie toute idée de la manière dont select2 fonctionne avec jquery.validation
10x
Ajoutez simplement ignore: [],
dans la fonction de validation de votre formulaire. Cela activera la validation des champs cachés.Alors vous obtiendrez une validation pour Select 2
$("#ContactForm").validate({
ignore: [],
rules: {
//Rules
},
messages: {
//messages
}
});
Je l'ai détaillé dans un article de blog: http://chadkuehn.com/jquery-validate-select2/
Lorsque vous placez un Select2 sur une balise SELECT, l’élément d’origine est masqué. Ainsi, dans le plug-in de validation, vous devez ajuster le balisage d'emballage approprié lors de la mise en surbrillance et de la mise en surbrillance.
highlight: function (element, errorClass, validClass) {
var elem = $(element);
if (elem.hasClass("select2-offscreen")) {
$("#s2id_" + elem.attr("id") + " ul").addClass(errorClass);
} else {
elem.addClass(errorClass);
}
},
unhighlight: function (element, errorClass, validClass) {
var elem = $(element);
if (elem.hasClass("select2-offscreen")) {
$("#s2id_" + elem.attr("id") + " ul").removeClass(errorClass);
} else {
elem.removeClass(errorClass);
}
}
Voir une DÉMO ici.
En guise d’astuce, considérez que le validate js se lie aux modifications de select not select 2. Ce problème est à l’origine du cas suivant:
select box
qui est converti en select2
Vous pouvez le réparer avec:
$("select").on("select2:close", function (e) {
$(this).valid();
});
En plus de la réponse d'ABIRAMAN, voici un code qui
<style>
span.error{
outline: none;
border: 1px solid #800000;
box-shadow: 0 0 5px 1px #800000;
}
</style>
<script>
$("#form").validate({
rules: {
email: "required"
},
highlight: function (element, errorClass, validClass) {
var elem = $(element);
if (elem.hasClass("select2-hidden-accessible")) {
$("#select2-" + elem.attr("id") + "-container").parent().addClass(errorClass);
} else {
elem.addClass(errorClass);
}
},
unhighlight: function (element, errorClass, validClass) {
var elem = $(element);
if (elem.hasClass("select2-hidden-accessible")) {
$("#select2-" + elem.attr("id") + "-container").parent().removeClass(errorClass);
} else {
elem.removeClass(errorClass);
}
},
errorPlacement: function(error, element) {
var elem = $(element);
if (elem.hasClass("select2-hidden-accessible")) {
element = $("#select2-" + elem.attr("id") + "-container").parent();
error.insertAfter(element);
} else {
error.insertAfter(element);
}
}
});
$('select').select2({}).on("change", function (e) {
$(this).valid()
});
</script>
J'ai constaté que faire fonctionner Select2 avec jQuery Validate dépendait beaucoup du balisage utilisé pour créer le contrôle Select2.
Pour une utilisation plus pratique du plugin, vous utiliserez probablement des données chargées dynamiquement (données obtenues via un service Web par rapport aux éléments <option/>
statiques de la page). Et conformément à leurs spécifications , la solution consiste à attacher Select2 à un élément <input type="hidden"/>
. Cependant, les éléments de type = "hidden" ne sont pas validés par jQuery Validate par défaut.
Pour valider des éléments cachés à l'aide de jQuery Validate, il faut modifier la propriété ignore
dans l'objet de configuration de jQuery Validate. Voir l’option ignore
dans leur spec . Essayez d’initialiser la valeur ignore
à null
pour que la validation se déclenche.
Vous avez trouvé une réponse sur les forums @ https://github.com/select2/select2/issues/215 posté par corinnaerin . A parfaitement fonctionné pour moi. Exemple de code à http://plnkr.co/edit/4QaSguIiYsJtLpuPF8Rc?p=preview
var $select = $('select').select2({
placeholder: 'Choose',
allowClear: true
});
/*
* When you change the value the select via select2, it triggers
* a 'change' event, but the jquery validation plugin
* only re-validates on 'blur'
*/
$select.on('change', function() {
$(this).trigger('blur');
});
$('#myForm').validate({
ignore: 'input[type=hidden], .select2-input, .select2-focusser'
});
ajoutez simplement une ligne dans votre fonction de validation.
$('#_form_id').validate({
ignore: 'input[type=hidden]',
rules: {
//Rules
},
messages: {
//messages
},
}
Cela ne fonctionne pas dans Bootstrap Validator () car le validateur inclut toutes les entrées du formulaire .Cela signifie qu'il validera le champ de recherche d'entrée du plugin select2 . Qui interférera avec la validation multisélect.
Pour résoudre ce problème, rendez-vous simplement dans le fichier validator.js Ajoutez la classe de recherche d'entrée select2 .select2-search__field À la liste des ignorés:
Validator.INPUT_SELECTOR = ':input:not([type="submit"], button, .select2-search__field):enabled:visible'
Lorsque vous créez une règle personnalisée, vous devez également la déclarer correctement. Puisque votre règle personnalisée dépend d'un argument, vous devez alors passer l'argument lorsque vous déclarez la règle.
rules: {
country: {
required: true,
requiredcountry: "your argument here" // <- declare the custom rule
}
}
découvrez mon code. Je résous mon problème en utilisant ces codes ... quelques codes seulement (css, jquery)
$(document).ready(function() {
//form validations---------------------------------------------------------
$('#sample').validate({
ignore: [],
errorClass: "error",
errorElement: "span"
});
$("#receiver_name").select2({
placeholder: "Receiver Name"
});
$("#receiver_name").select2().change(function() {
$(this).valid();
});
});
.error .select2-choice.select2-default,
.error .select2-choices {
color: #a94442;
border-color: #a94442;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
}
.error:focus,
.error .select2-choice.select2-defaultLfocus,
.error .select2-choicesLfocus {
border-color: #843534;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
}
.select2-container .select2-choices .select2-search-field input,
.select2-container .select2-choice,
.select2-container .select2-choices,
.error {
border-radius: 1px;
}
<html>
<head>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.css" rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2-bootstrap.css" rel="stylesheet" />
</head>
<body>
<form id='sample'>
<select class="form-control" name="receiver_name[]" id="receiver_name" multiple required>
<option value="1">1</option>
<option value="2">2</option>
</select>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.js"></script>
</body>
</html>
$("select.select2-me").each(function(index, el) {
if ($(this).is("[data-rule-required]") &&
$(this).attr("data-rule-required") == "true") {
$(this).on('select2-close', function(e) {
$(this).valid()
});
}
});
travaille pour moi.
Pour valider les entrées 'select2', vous devez d'abord dire à jquery validate de prendre en compte les éléments cachés:
$.validator.setDefaults({
ignore: [],
});
C’est une surbrillance personnalisée/non surlignée que j’utilise pour pointer les erreurs select2 et tagit avec jquery validate:
$("#someform").validate({
rules: {
nazwa: {
required: true
},
ilosc_w_opakowaniu: {
required: "#czy_opakowanie_zbiorcze:checked"
}
},
messages: {
nazwa: "Musisz wypełnić pole [Nazwa]",
ilosc_w_opakowaniu: "Musisz podać ilość produktu w opakowaniu zbiorczym",
},
highlight: function( element, errorClass, validClass ) {
if ( element.type === "radio" ) {
this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
} else {
$( element ).addClass( errorClass ).removeClass( validClass );
}
// select2
if( $(element).hasClass('select2-hidden-accessible') ){
dzik = $(element).next('span.select2');
if(dzik)
dzik.addClass( errorClass ).removeClass( validClass );
}
// tagit
dzik2 = $(element).parent().find('ul.tagit')
if( dzik2.length == 1 )
dzik2.addClass( errorClass ).removeClass( validClass );
},
unhighlight: function( element, errorClass, validClass ) {
if ( element.type === "radio" ) {
this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
} else {
$( element ).removeClass( errorClass ).addClass( validClass );
}
// select2
if( $(element).hasClass('select2-hidden-accessible') ){
dzik = $(element).next('span.select2');
if(dzik)
dzik.removeClass( errorClass ).addClass( validClass );
}
// tagit
dzik2 = $(element).parent().find('ul.tagit')
if( dzik2.length == 1 )
dzik2.removeClass( errorClass ).addClass( validClass );
}
});
Et quelques CSS:
/** select2 error hightight **/
.select2.error .select2-selection--single{
border-color:red !important;
color:red !important;
}
/** tagit error highlight **/
.tagit.error{
border-color:red !important;
color:red !important;
}
Vous pouvez vérifier ce lien: https://github.com/rkeshmir/select2-validation Vous trouverez ici le moyen le plus simple de valider les composants de select2. L'idée idée déclenche la validation de tous les éléments <select>
dans DOM lors de leur événement de modification. De plus, j'ai ajouté les règles CSS requises pour mettre en évidence les états d'entrée et d'erreur.
J'ai résolu le problème, la solution consiste à modifier les méthodes de mise en surbrillance, de mise en surbrillance et surtout d'erreur pour chaque instance de validation. Cependant, afin de ne pas modifier chaque fichier, je mets les modifications dans le fichier jquery.validate.js
highlight: function( element, errorClass, validClass ) {
if ( element.type === "radio" ) {
this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
} else {
var elem = $(element);
if (elem.attr('readonly') == 'readonly') {
if (elem.hasClass("input-group-addon")) {
$("#" + elem.attr("id")).parent().addClass(errorClass);
} else {
$( element ).addClass( errorClass ).removeClass( validClass );
}
} else {
if (elem.hasClass("select2-hidden-accessible")) {
$("#select2-" + elem.attr("id") + "-container").parent().addClass(errorClass);
} else {
$( element ).addClass( errorClass ).removeClass( validClass );
}
}
}
},
unhighlight: function( element, errorClass, validClass ) {
if ( element.type === "radio" ) {
this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
} else {
var elem = $(element);
if (elem.attr('readonly') == 'readonly') {
if (elem.hasClass("input-group-addon")) {
$("#" + elem.attr("id")).parent().removeClass(errorClass);
} else {
$( element ).addClass( errorClass ).removeClass( validClass );
}
} else {
if (elem.hasClass("select2-hidden-accessible")) {
$("#select2-" + elem.attr("id") + "-container").parent().removeClass(errorClass);
} else {
$( element ).removeClass( errorClass ).addClass( validClass );
}
}
}
},
errorPlacement: function(error, element) {
var elem = $(element);
if (elem.attr('readonly') == 'readonly') {
element = $("#" + elem.attr("id")).parent();
error.insertAfter(element);
} else {
if (elem.hasClass("select2-hidden-accessible")) {
element = $("#select2-" + elem.attr("id") + "-container").parent().parent().parent();
error.insertAfter(element);
} else {
error.insertAfter(element);
}
}
}