Comment déclencher manuellement la validation avec jQuery validate?

143

Je souhaite déclencher manuellement la validation, y compris l'affichage des messages d'erreur avec jQuery Validate .

Le scénario que j'essaie d'accomplir est une forme comme celle-ci:

<form>
 <input id=i1> <button id=b1>
 <input id=i2> <button id=b2>
</form>

En cliquant b1, seul i1doit être validé. poule en cliquant b2, seul i2doit être validé. Cependant, tous les champs doivent être affichés. Comment puis-je faire ceci? J'ai pensé à gérer l'événement de clic b1/b2et à valider manuellement une partie du formulaire.

usr
la source
Pourquoi ne pas le valider manuellement? Ce plugin très utile pour valider le formulaire entier, mais dans ce cas plus situable valider le formulaire manuellement.
Anatoliy
La forme est plus grande que dans mon exemple. Je veux qu'il soit automatisé.
usr

Réponses:

176

Cette bibliothèque semble permettre la validation d'éléments uniques. Associez simplement un événement de clic à votre bouton et essayez ce qui suit:

$("#myform").validate().element("#i1");

Exemples ici:

https://jqueryvalidation.org/Validator.element

Roberto Aloi
la source
15
Cela valide l'ensemble du formulaire ... pour valider seulement 1 champ, la bonne façon est la suivante: stackoverflow.com/a/12195091/114029
Leniel Maccaferri
Pour une raison quelconque, je n'obtiens pas le texte d'erreur personnalisé lorsque je valide de cette façon. Cela peut avoir quelque chose à voir avec le fait que je cours dans une boîte de dialogue Durandal. Avoir des tonnes de problèmes avec ce cadre dans ledit contexte.
P.Brian.Mackey
@Roberto Aloi: Link est obsolète
Sebastian
@Sebastian Merci pour le ping, a mis à jour le lien maintenant!
Roberto Aloi
113

Ou on peut simplement utiliser: $('#myElem').valid()

if ($('#myElem').valid()){
   // will also trigger unobtrusive validation only for this element if in place 
   // add your extra logic here to execute only when element is valid
}

Notez qu'il validate()doit être appelé sur le formulaire avant de le vérifier en utilisant cette méthode.

Lien de documentation: https://jqueryvalidation.org/valid/

Anastasiosyal
la source
15
validate()doit être appelé sur le formulaire avant de le vérifier avec cette méthode.
GETah
j'ai une requête comme celle-ci if ($ ('# myElem'). val () == '2017-4-12') {sélection de date incorrecte} else {sélection valide}
srinivas gowda
29

Mon approche était comme ci-dessous. Maintenant, je voulais juste que mon formulaire soit validé quand une case à cocher spécifique était cliquée / modifiée:

$('#myForm input:checkbox[name=yourChkBxName]').click(
 function(e){
  $("#myForm").valid();
}
)
Yoosaf Abdulla
la source
Ma requête if ($ ('# someID) ===' 2017-4-12) {$ ("# myform"). Validate (). Element ("# i1"). Valid ();} else {$ ( "#myform"). validate (). element ("# i1"). invalid ();} est le code correct
srinivas gowda
14

Comme écrit dans la documentation , la façon de déclencher la validation de formulaire par programme est d'appeler validator.form ()

var validator = $( "#myform" ).validate();
validator.form();
Eva M
la source
2
Cela ne répond pas à la question, car la question concerne la validation d'un seul champ spécifique. Mais c'est exactement ce que je cherchais. Merci!
jlh le
4

Il existe une méthode non documentée à partir de la version 1.14

validator.checkForm()

Cette méthode valide silencieusement le retour vrai / faux. Il ne déclenche pas de messages d'erreur.

user5936891
la source
9
non documenté = peut casser à tout moment.
usr
2

Eva M d'en haut, a presque eu la réponse comme indiqué ci-dessus (merci Eva M!):

var validator = $( "#myform" ).validate();
validator.form();

C'est presque la réponse, mais cela pose des problèmes, même dans le plugin de validation jquery le plus récent au 13 décembre 2018. Le problème est que si l'on copie directement cet échantillon et que JAMAIS appelle ".validate ()" plus d'une fois , le traitement du focus / clé de la validation peut être interrompu et la validation peut ne pas afficher correctement les erreurs.

Voici comment utiliser la réponse d'Eva M et vous assurer que ces problèmes de focus / clé / masquage d'erreur ne se produisent pas:

1) Enregistrez votre validateur dans une variable / global.

var oValidator = $("#myform").validate();

2) NE PAS appeler $ ("# myform"). Validate () JAMAIS à nouveau.

Si vous appelez $ ("# myform"). Validate () plus d'une fois, cela peut provoquer des problèmes de focus / clé / masquage d'erreur.

3) Utilisez la variable / global et le formulaire d'appel.

var bIsValid = oValidator.form();
JSB
la source
1

Dans mon cas similaire, j'avais ma propre logique de validation et je voulais juste utiliser la validation jQuery pour afficher le message. C'est ce que j'ai fait.

//1) Enable jQuery validation
var validator = $('#myForm').validate();

$('#myButton').click(function(){
  //my own validation logic here
  //.....
  //2) when validation failed, show the error message manually
  validator.showErrors({
    'myField': 'my custom error message'
  });
});

user538220
la source
0

je l'ai essayé a fonctionné tnx @Anastasiosyal je veux le partager sur ce fil.

Je ne suis pas sûr de savoir comment les champs de saisie ne se sont pas déclenchés lorsque j'ai vidé les champs. Mais j'ai réussi à déclencher chaque champ obligatoire individuellement en utilisant:

$(".setting-p input").bind("change", function () {
        //Seven.NetOps.validateSettings(Seven.NetOps.saveSettings);
        /*$.validator.unobtrusive.parse($('#saveForm'));*/
        $('#NodeZoomLevel').valid();
        $('#ZoomLevel').valid();
        $('#CenterLatitude').valid();
        $('#CenterLongitude').valid();
        $('#NodeIconSize').valid();
        $('#SaveDashboard').valid();
        $('#AutoRefresh').valid();
    });

voici mon avis

@using (Html.BeginForm("SaveSettings", "Settings", FormMethod.Post, new {id = "saveForm"}))
{
    <div id="sevenRightBody">
        <div id="mapMenuitemPanel" class="setingsPanelStyle" style="display: block;">
            <div class="defaultpanelTitleStyle">Map Settings</div>
            Customize the map view upon initial navigation to the map view page.
            <p class="setting-p">@Html.LabelFor(x => x.NodeZoomLevel)</p>
            <p class="setting-p">@Html.EditorFor(x => x.NodeZoomLevel) @Html.ValidationMessageFor(x => x.NodeZoomLevel)</p>
            <p class="setting-p">@Html.LabelFor(x => x.ZoomLevel)</p>
            <p class="setting-p">@Html.EditorFor(x => x.ZoomLevel) @Html.ValidationMessageFor(x => x.ZoomLevel)</p>
            <p class="setting-p">@Html.LabelFor(x => x.CenterLatitude)</p>
            <p class="setting-p">@Html.EditorFor(x => x.CenterLatitude) @Html.ValidationMessageFor(x => x.CenterLatitude)</p>
            <p class="setting-p">@Html.LabelFor(x => x.CenterLongitude)</p>
            <p class="setting-p">@Html.EditorFor(x => x.CenterLongitude) @Html.ValidationMessageFor(x => x.CenterLongitude)</p>
            <p class="setting-p">@Html.LabelFor(x => x.NodeIconSize)</p>
            <p class="setting-p">@Html.SliderSelectFor(x => x.NodeIconSize) @Html.ValidationMessageFor(x => x.NodeIconSize)</p>
        </div>

et mon entité

   public class UserSetting : IEquatable<UserSetting>
    {
        [Required(ErrorMessage = "Missing Node Zoom Level.")]
        [Range(200, 10000000, ErrorMessage = "Node Zoom Level must be between {1} and {2}.")]
        [DefaultValue(100000)]
        [Display(Name = "Node Zoom Level")]
        public double NodeZoomLevel { get; set; }

        [Required(ErrorMessage = "Missing Zoom Level.")]
        [Range(200, 10000000, ErrorMessage = "Zoom Level must be between {1} and {2}.")]
        [DefaultValue(1000000)]
        [Display(Name = "Zoom Level")]
        public double ZoomLevel { get; set; }

        [Range(-90, 90, ErrorMessage = "Latitude degrees must be between {1} and {2}.")]
        [Required(ErrorMessage = "Missing Latitude.")]
        [DefaultValue(-200)]
        [Display(Name = "Latitude")]
        public double CenterLatitude { get; set; }

        [Range(-180, 180, ErrorMessage = "Longitude degrees must be between {1} and {2}.")]
        [Required(ErrorMessage = "Missing Longitude.")]
        [DefaultValue(-200)]
        [Display(Name = "Longitude")]
        public double CenterLongitude { get; set; }

        [Display(Name = "Save Dashboard")]
        public bool SaveDashboard { get; set; }
.....
}
bherto39
la source
3
Cette réponse suppose un environnement .Net lorsque la question concerne explicitement la validation jQuery.
Kenogu Labz
0

Il existe un bon moyen si vous utilisez validate()des paramètres sur un formulaire et que vous souhaitez valider manuellement un champ de votre formulaire par la suite:

var validationManager = $('.myForm').validate(myParameters);
...
validationManager.element($(this));

Documentation: Validator.element ()

Tobi G.
la source