58 votes

plugin jquery.validate - comment couper les valeurs avant la validation du formulaire

Je suis l'aide de l'excellent jquery.validation plugin par Jörn Zaefferer et je me demandais si il ya un moyen facile de découper automatiquement les éléments de formulaire avant de valider?

Ce qui suit est un coupé, mais de travail exemple d'un formulaire qui valide une adresse e-mail:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script>
    <script src="http://ajax.microsoft.com/ajax/jquery.validate/1.5.5/jquery.validate.js" type="text/javascript"></script>
    <script type="text/javascript">
    $().ready(function() {
        $("#commentForm").validate({
            rules: {
                email: {
                    required: true,
                    email: true
                }
            }
        });
    });
    </script>
</head>
<body>

<form class="cmxform" id="commentForm" method="get" action="">
<label for="cemail">E-Mail:</label><input id="cemail" name="email" class="required email" />
<input class="submit" type="submit" value="Submit"/>
</form>

</body>
</html>

Le problème est que certains utilisateurs sont confus parce qu'ils accidentellement entrer dans certains espaces dans leur adresse e-mail, par ex. "test@test.com ". Et la forme ne se soumettent pas et a un message d'erreur: "Veuillez entrer une adresse email valide.". Non techy les utilisateurs ne sais pas comment repérer les espaces et peut-être juste quittez le site plutôt que d'essayer de travailler sur ce qu'ils ont fait de mal.

De toute façon, j'espérais que je pourrais chaîne "jQuery.trim(value)" avant la validation de sorte que le les espaces sont supprimés et la validation de l'erreur ne se produit jamais?

Je pourrais utiliser addMethod de construire mon propre e-mail de validation de fonction. Mais je suis sûr qu'il y a une solution plus élégante?

92voto

MDP Points 446

Je l'ai fait avec succès.

Au lieu de:

 Email: { required: true, email: true }
 

J'ai fait ça:

 Email: {
    required: {
        depends:function(){
            $(this).val($.trim($(this).val()));
            return true;
        }
    },
    email: true
}
 

23voto

hwiechers Points 4717

Ce code fonctionne pour moi. Je ne l'ai pas beaucoup utilisé, il y a peut-être des bugs.

Il enveloppe chaque méthode et coupe le premier élément qui est value.

 (function ($) {

    $.each($.validator.methods, function (key, value) {
        $.validator.methods[key] = function () {           
            if(arguments.length > 0) {
                arguments[0] = $.trim(arguments[0]);
            }

            return value.apply(this, arguments);
        };
    });
} (jQuery));
 

14voto

xuser Points 160

Comme je veux ce comportement sur tous mes formulaires par défaut, j'ai décidé de modifier le fichier jquery.validate.js. J'ai appliqué le changement suivant à la méthode onfocusout:

Original:

 onfocusout: function (element, event) {
    if (!this.checkable(element) && (element.name in this.submitted || !this.optional(element))) {
        this.element(element);
    }
}
 

À:

 onfocusout: function (element, event) {
    if (element.tagName === "TEXTAREA" || (element.tagName === "INPUT" && element.type !== "password")) {
        element.value = $.trim(element.value);
    }
    if (!this.checkable(element) && (element.name in this.submitted || !this.optional(element))) {
        this.element(element);
    }
}
 

Je veux autoriser des espaces au début et à la fin du mot de passe.

autoTrim peut être ajouté en tant que propriété aux options.

8voto

jeremyzilar Points 81

Lors du téléchargement de validator.js, il existe un fichier appelé additional-methods.js qui contient la méthode "nowhitespace" et "lettersonly" qui supprimera tout espace blanc dans un champ.

 rules: {
  user_name: {
    required: true,
    minlength: 3,
    nowhitespace: true
  }
}
 

4voto

Tom Points 3697

Pour référence, jusqu'à ce que je trouve une solution plus élégante, j'utilise addMethod comme suit:

 // Extend email validation method so that it ignores whitespace
jQuery.validator.addMethod("emailButAllowTrailingWhitespace", function(value, element) {
    return (this.optional(element) || jQuery.validator.methods.email.call(this, jQuery.trim(value), element));
}, "Please enter a valid email");

$().ready(function() {
    $("#commentForm").validate({
        rules: {
            cemail: {
                required: true,
                emailButAllowTrailingWhitespace: true
            }
        }
    });
});
 

Remarque: cela ne supprime pas les espaces du champ, mais les ignore. Vous devez donc vous assurer que vous exécutez trim côté serveur avant de les insérer dans la base de données.

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