2010-11-11 8 views
0

J'ai un formulaire qui, en fonction de la valeur sélectionnée du groupe radio userAction, affiche les champs loginFields ou signupFields. En outre, j'ai deux conteneurs d'erreur - errorMessageLogin et errorMessageSignup - à afficher des messages d'erreur respectifs à la valeur sélectionnée de la useraction:JQuery Validation Plugin: Utilisation de plusieurs errorLabelContainers

<div id="errorsSection"> 
    <div id="errorMessageLogin"> 
     <!-- Login Error Messages go here --> 
    </div>     

    <div id="errorMessageSignup"> 
     <!-- Signup Error Messages go here --> 
    </div> 
</div> 
<div id="contentSection">Lorem ipsum dolor sit amet...</div> 
<div id="formSection"> 
    <form id="myForm"> 
     <input name="userAction" type="radio" value="login" checked="checked">Login</input> 
     <br /> 
     <input name="userAction" type="radio" value="signup">Sign Up</input> 

     <div id="loginFields" style="display:none"> 
      <!-- Login fields: email address and, password --> 
     </div> 

     <div id="signupFields" style="display:none"> 
      <!-- Signup fields: name, age, email address, and password --> 
     </div> 
    </form> 
</div> 

J'utilise le jQuery Validation Plugin comme ceci:

$("#myForm").validate({ 
    submitHandler: function (form) { 
     MyWebService.DoWork(form); 
    }, 
    rules: myRules, 
    errorLabelContainer: null, // how to determine at runtime? 
    messages: myMessages, 
    highlight: function (element, errorClass) { 
     $(element).prev().addClass(errorIcon); 
     $(element).addClass(errorClass); 
     $(element.form).find("label[for=" + element.id + "]").addClass(errorClass); 
    }, 
    unhighlight: function (element, errorClass) { 
     $(element).prev().removeClass(errorIcon); 
     $(element).removeClass(errorClass); 
     $(element.form).find("label[for=" + element.id + "]").removeClass(errorClass); 
    } 
}); 

Je souligne champs invalides en changeant la classe des éléments et ajouter une petite icône à proximité; Cela fonctionne très bien. Cependant, en plus de la surbrillance, j'aimerais afficher les messages définis dans myMessages dans errorMessageLogin ou errorMessageSignup en fonction de la sélection dans le groupe radio userAction. Cependant, il semble que la valeur de errorLabelContainer soit d'être un objet jQuery et non une fonction, ce qui est regrettable, car je serais capable de déterminer quelle erreur afficher dans une fonction.

Est-il possible de basculer le conteneur d'erreurs à utiliser par le plugin jQuery Validation?

Répondre

0

Vous pouvez utiliser la fonction de rappel errorPlacement dans votre objet validate pour personnaliser le placement des étiquettes d'erreur créés. Cette fonction accepte deux paramètres: erreur et élément. Un exemple de docs jQuery (http://docs.jquery.com/Plugins/Validation/validate):

$("#myform").validate({ 
    errorPlacement: function(error, element) { 
    error.appendTo(element.parent("td").next("td")); 
    }, 
    debug:true 
}) 
+0

Je ne suis pas certain de pouvoir maintenir la fonctionnalité de surbrillance que j'ai maintenant, combinée à l'affichage d'un conteneur d'erreur basé sur errorMessageLogin ou errorMessageSignup . Je trouve la documentation de ce plugin un peu mince. Des idées? – Bullines

+0

Pourquoi pas? Ce sont des fonctions séparées - l'une traite de la surbrillance des erreurs sur le champ réel où l'erreur apparaît, et l'autre traite du message d'erreur lui-même et de son placement. – guntars

+0

Pourriez-vous regarder cette question?: Http://stackoverflow.com/questions/4532009/placing-error-message-for-a-checkbox-array –

-1

Ce n'est pas testé, mais plutôt une idée de vous lancer sur le chemin ...

$("#myForm").validate({ 
submitHandler: function (form) { 
    MyWebService.DoWork(form); 
}, 
rules: myRules, 
errorLabelContainer: function() { 
    var rdoValue = $("input[name='userAction']:checked").val(); 
    // branch and return the container based on value... 
}, 
messages: myMessages, 
highlight: function (element, errorClass) { 
    $(element).prev().addClass(errorIcon); 
    $(element).addClass(errorClass); 
    $(element.form).find("label[for=" + element.id + "]").addClass(errorClass); 
}, 
unhighlight: function (element, errorClass) { 
    $(element).prev().removeClass(errorIcon); 
    $(element).removeClass(errorClass); 
    $(element.form).find("label[for=" + element.id + "]").removeClass(errorClass); 
} 
}); 
+0

errorLabelContainer ne peut pas être une fonction; Comme je l'ai mentionné, il doit s'agir d'un objet jQuery. – Bullines

+0

Désolé, vous avez raison, je vois ça maintenant. Dans ce cas, l'utilisation de l'errorPlacement semble être le meilleur moyen de résoudre ce problème ... – Schenz

0

Je devine que vous ne pouvez pas utiliser deux formes différentes? Ce serait un moyen plus simple de séparer la fonctionnalité du message d'erreur? Et cachez simplement une forme ou l'autre?

Questions connexes