52 votes

La meilleure solution JavaScript pour la validation et l’interaction de formulaires côté client?

Nos formulaires web sont vraiment complexe. Ce est une excellente solution pour extensible de validation de formulaire, de préférence un qui fonctionne avec jQuery?

Arrière-plan:

Notre site dispose d'un peu d'Ajax, mais l'accent est mis sur l'expérience utilisateur au travers d'environ 20 multi-page des formulaires ou des assistants. Ces formes sont complexes.

  • Présentation: Certains champs sont des flotteurs ou ints. La Validation des moyens de décapage non décimal caractères, mais nous voulons aussi faire en sorte que, si un utilisateur saisit 5 dans un champ de prix, le champ est mis à jour en 5.00.
  • Effets secondaires: Certains champs ont des effets secondaires lors de la mise à jour. E. g., mise à jour du prix ou de la quantité d'un élément doit mettre à jour un champ sous-total.
  • Widget piloté par les éléments: Certains champs sont cachés et ont des valeurs peuplée par des widgets. E. g., une carte widget permet de pointer vers un emplacement et un champ caché est mis à jour avec la latitude-longitude, mais l'emplacement doit être à l'intérieur d'une certaine région.
  • Groupes: Certains champs sont des groupes, tels que l'adresse/ville/état/code postal, et ne doit être validée lorsque tous les champs ont été remplis.
  • La validation côté serveur: Validation de certains champs nécessite de back-end pour vérifier via des requêtes Ajax
  • De multiples formes par page: Parfois, un utilisateur doit remplir un formulaire avant de le une boîte de dialogue s'ouvre avec une autre forme. Un cadre doit être plus polyvalent que la liaison à onSubmit - nous parfois de poste multiples formes dans l'ordre à partir de la même page en utilisant Ajax. (E. g., nous permettez aux utilisateurs de s'inscrire et créer un widget en un seul coup mais, en raison des systèmes de legs, que le débit nécessite deux requêtes POST.)
  • Personnalisable d'affichage d'erreur: Parfois, des erreurs apparaissent au-dessus des champs, parfois dans le champ des changements de style, et nos nouveaux modèles appel à info-bulle-comme les popups (ala qTip) pour certaines erreurs.
  • Le saut de départ imperceptible: l'expérience Utilisateur est la clé et la rétroaction tactile est important. Toute solution
  • Boutons de soumission: Cliquer sur le bouton soumettre doit valider tout et de montrer ensuite une réponse, mais depuis quelques de la validation se produit de manière asynchrone.

Nous sommes actuellement en utilisant le jQuery de Validation de la bibliothèque, mais nos formes semblent être à l'étroit de sa capacité. J'ai été regarder les choses comme <angulaire/>, knock-out et Backbone.jsmais je suis inquiet qu'ils sont trop lourds, ou qu'ils ont besoin de nous pour réécrire notre frontend.

(Ce doit être une communauté wiki.)

55voto

Vivin Paliath Points 40975

C'est un plug sans vergogne, mais pourrait-je faire du bénévolat un cadre que j'ai dessiné? J'ai construit sur la base d'annotations (à la Hibernate Validator). Il prend en charge personnalisée des contraintes et je pense qu'il est assez puissant. Ici est également un Stackoverflow question où j'ai demandé une révision de l'encadrement.

  • Présentation: Avec de validation personnalisée de contraintes, vous pouvez lier la validation de la onChange élément. Aussi, parce que Regula prend en charge les validateurs personnalisés, vous pouvez avoir votre validateur personnalisé de mise à jour de la valeur d'un champ (donc changement 5 de 5.00).
  • Effets secondaires: Regula prend en charge les effets secondaires via personnalisé contrainte-validateurs.
  • Groupes: Regula prend en charge les groupes de validation. Vous pouvez cibler des groupes spécifiques pour la validation. En combinant un validateur personnalisé et d'un groupe, vous pouvez contrôler le comportement de l'agent de validation de sorte qu'il valide seulement lorsque tous les éléments de ce groupe sont remplis (vous pouvez effectuer cette vérification via Javascript normale).
  • La validation côté serveur: Avec des contraintes, vous pouvez faire un appel AJAX pour effectuer la validation côté serveur. Avec la façon dont le cadre est structuré actuellement, ce doit être nécessairement un blocage de l'ajax à l'appel. J'ai l'intention d'ajouter une fonction asynchrone dans l'avenir.
  • Multiplee formes par page: Regula n'est pas limité à la validation d'un formulaire par page. Il peut gérer de multiples formes (pas sûr si j'ai bien compris votre exigence correctement de sorte que je n'aurais pas répondu à cette partie correctement).
  • Personnalisable d'affichage d'erreur: Regula ne fait rien à l'INTERFACE de la page d'aussi loin que la validation est concerné. Lorsque vous validez, vous obtenez un ensemble de violations de contrainte qui contiennent des messages d'erreur et autres. C'est à vous, comment les afficher.
  • Le saut de départ imperceptible: je n'ai pas exécuté l'une quelconque des repères, donc je ne peux pas dire à mon cadre de performance à cet égard.
  • Boutons de soumission: C'est quelque chose que j'ai encore à résoudre (vs asynchrone synchrone).

Voici quelques exemples:

Le tableau suivant indique la norme de validation, avec des contraintes:

<input id = "myInput"
       name = "myInput"
       type = "text"
       class = "regula-validation"
       data-constraints = '@NotEmpty @IsNumeric @Between(min=1, max=5)' />

jQuery(document).ready(function() {
    // must call regula.binnd() first. The best place would be in an
    // onload handler. This function looks for elements with
    // a class name of "regula-validation" and binds the
    // appropriate constraints to the elements

    regula.bind(); 

    jQuery("#myForm").submit(function() {
        // this function performs the actual validation
        var validationResults = regula.validate();

        for(var index in validationResults) {
             var validationResult = validationResults[index];
             alert(validationResult.message);
        }
    });
});

Comme vous pouvez le voir, vous êtes seul à travailler avec les violations de contraintes, et donc la manière dont vous afficher le message d'erreur est entièrement à vous.

Voici un exemple d'une coutume contrainte:

regula.custom({
   name: "MustBe42",
   defaultMessage: "The answer must be equal to 42",
   validator: function() {
      return this.value == 42;
   }
});

Et son utilisation:

<input id = "theAnswerToLifeTheUniverseAndEverything" 
       name = "theAnswerToLifeTheUniverseAndEverything" 
       value = ""
       class = "regula-validation"
       data-constraints = "@MustBe42" />

Depuis le validateur est une fonction Javascript, vous pouvez avoir n'importe quoi (si cela répond à votre question sur les effets secondaires).

Voici un exemple d'une autre contrainte qui accepte des paramètres:

regula.custom({
   name: "DivisibleBy",
   defaultMessage: "{label} must be divisible by {divisor}",
   params: ["divisor"],
   validator: function(params) {
      var divisor = params["divisor"];
      return (this.value % divisor) == 0;
   }
});

Et l'utilisation:

<input id = "number" 
       name = "number" 
       value = ""
       class = "regula-validation"
       data-constraints = "@DivisibleBy(divisor=3, label='The Number')" />

Voici un exemple d'utilisation de groupes de validation:

<input id = "score"
       name = "score"
       type = "text"
       class = "regula-validation"
       data-constraints = '@IsNumeric(label="Score", 
                                      message="{label} needs to be a number!"
                                      groups=[FirstGroup, SecondGroup, ThirdGroup]' />

<input id = "age"
       name = "age"
       type = "text"
       class = "regula-validation"
       data-constraints = '@IsNumeric(label="Age", 
                                      message="{label} needs to be a number!"
                                      groups=[SecondGroup]' />

<input id = "name"
       name = "name"
       type = "text"
       class = "regula-validation"
       data-constraints = '@NotEmpty(label="Name", 
                                     message="{label} cannot be empty!"
                                     groups=[FirstGroup]' />

Et un extrait de code qui valide seulement FirstGroup (donc seulement score et name sont validés):

var constraintViolations = regula.validate({groups: [regula.Group.FirstGroup]});
var messages = "";

for(var index in constraintViolations) {
      var constraintViolation = constraintViolations[index];
      messages += constraintViolation.message + "\n";
}

if(messages != "") {
   alert(messages);
}

Si vous avez l'intention de l'essayer, je vous conseille de télécharger la version 1.1.1. La documentation actuelle correspond à celle de la version en particulier. En 1.2.1 j'ai ajouté le support pour la composition de contraintes, mais je n'ai pas mis à jour ma documentation pour refléter cela.

Je comprends, si ce n'est pas l'adresse de tous vos soucis, ou si ce n'est pas ce que vous cherchez. J'ai pensé que je venais de mettre ça là. Aussi, si vous ne vérifiez ensuite je ferai en sorte de mettre à jour la documentation pour refléter la version 1.2.1. J'ai été très occupé avec l'école et au travail et donc je n'ai pas eu le temps de le faire.

Mise à JOUR #1

Sohnee mentionné la validation côté client. Je travaille actuellement sur une intégration entre le Régulateur et le Printemps 3. J'espère que je devrait être en mesure de libérer le plus tôt possible (en fonction de nouveau, sur le travail et l'école). L'intégration fonctionne grâce à la traduction de Hibernate validation des contraintes de Regula validation de contraintes. De cette façon, vous n'avez qu'à écrire le code de validation une fois (pour la plupart). Pour personnalisé contraintes bien, vous allez toujours avoir à écrire du code Javascript côté (le validateur personnalisé). Mais une fois que vous annoter le code côté serveur avec Hibernate validation de contraintes, vous n'avez pas besoin de faire quoi que ce soit sur le côté client; ces contraintes sont automatiquement appliquées à des éléments de formulaire côté client.

Matthew Abbott a également été en mesure d' intégrer avec Regula ASP.NET MVC.

Mise à JOUR #2

J'ai une démo de l'application web (mavenized) sur github qui met en valeur l'intégration entre Regula et Spring 3.0.x Web MVC en utilisant Hibernate Validator. Ce n'est pas vraiment documenté ou quoi que ce soit, c'est plus une preuve de concept. J'ai l'intention d'ajouter de la documentation à la page github sur l'intégration et la façon dont il fonctionne.

Mise à JOUR #3

J'ai mis à jour la documentation sur le wiki, et à présent, il correspond à la dernière version 1.2.2 (j'ai fait une petite correction, c'est pourquoi il est 1.2.2 maintenant).

13voto

Mitch Points 726

J'ai utilisé ce formulaire jQuery plusieurs fois en conjonction avec tout un tas d'environnements différents. J'espère que cela m'aidera car j'ai rarement passé plus d'une heure à le configurer.

À votre santé!

8voto

Tracker1 Points 6573

Je dirais que le jQuery de Validation plugin fait un bon travail. Je l'ai combiné avec les métadonnées plugin pour passer la validation côté serveur, les paramètres pour le client. J'ai également emballé quelques points clés à toutes les formes, de sorte que je peux utiliser un modèle commun pour la validation, et un peu exceptionnelle/custom unis. Cela comprend un personnalisé message d'alerte et l'affichage.

Ce n'est pas faire tout ce que vous voulez hors de la boîte, mais c'est la meilleure solution et le meilleur comportement par défaut que j'ai vu. Encore une fois, je dois utiliser les métadonnées (attribut "data-meta"). Et il peut être plié à sa volonté. Je suis aussi à l'aide de métadonnées pour le contrôle de la liaison à des éléments d'entrée côté client. Ceci divise mon côté client, la logique côté serveur, mais plus facile dans le long terme sur les essaie d'injecter js à partir de la logique côté serveur.

5voto

simone Points 5580

Parsley.js semble être un choix agréable et populaire au moment de la rédaction de cet article (août 2013).

2voto

a paid nerd Points 11716

Répondre à cette question à moi-même depuis que quelqu'un de notre équipe remarqué le programme de validation d'Outils de jQuery !

  • Présentation - support de HTML5 champs de saisie. pattern champs assurez-vous que l'utilisateur ne peut test d'entrée dans un certain modèle.
  • Effets secondaires - Déclenche des événements sur la forme et sur les différents champs: onFail et onSuccess
  • Widget piloté par les éléments - "type d'entrée Personnalisé" sont encouragés. La base de démo inclut même un nombres naturels-vieux "âge" sur le terrain.
  • Groupes - Écrire une fonction de "matcher" dont le seul but est de filtrer les champs pour être validé.
  • La validation côté serveur - T-il et il le fait de manière intelligente - dépend de votre programme de validation d'appeler une fonction de rappel (il est donc asynchrone de l'environnement) au lieu d'une valeur de retour.
  • De multiples formes par page - des Outils de jQuery semble très bien construit et cela ne devrait pas être un problème.
  • Personnalisable d'affichage d'erreur , les Erreurs de côté des champs? Le tout dans un seul endroit? Pas de problème. N'est pas encore assez? Lier les événements en cas d'échec. Utilise même les info-bulles par défaut.
  • Le saut de départ imperceptible - Démos sont très accrocheurs
  • Boutons de soumission - Pas de problème.

Mise à jour: oui, juste ré-implémenté une partie de notre site avec jQuery Tools programme de validation des info-bulles. Fantastique!!!!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X