OVH Cloud OVH Cloud

[un peu long] Champ de formulaire a ne pas transmettre

25 réponses
Avatar
Olivier Miakinen
Bonjour,

Je cherche la méthode la plus efficace et la plus jolie pour avoir
un champ de formulaire qui ne soit *pas* transmis lors du Submit. Je
m'explique.

Le formulaire ressemble à quelque chose comme ça :
________________________________
Utilisateur : |_MIAKINEN_______________________|
Code PIN : |_****___________________________|
---------
|Continuer|
---------

J'ai une fonction JavaScript appelée par "onsubmit" qui fait appel à une
fonction Java pour se loguer sur une carte à puce en lui passant le code
PIN, puis qui retourne true si ce code était correct. Dans ce cas, la
requête POST part vraiment vers le serveur, avec le nom d'utilisateur,
et aussi d'autres champs cachés que j'ai remplis à la volée par JavaScript.

Mon problème, c'est que le serveur n'a pas de raison de recevoir le code
PIN, qui est un mot de passe local, et donc je ne voudrais pas l'envoyer
dans le POST. J'ai déjà imaginé deux solutions pour éviter cela, mais
toutes deux ont des inconvénients.

1re solution : sortir le champ "Code PIN" du formulaire.
Cette solution a l'avantage de la simplicité, mais du coup je perds la
possibilité de soumettre le formulaire en tapant sur la touche Entrée du
clavier au lieu d'aller appuyer sur le bouton Continuer.

2e solution : vider le contenu du champ avant envoi.
C'est une solution simple aussi, mais celle-ci risque d'effrayer
l'utilisateur s'il voit disparaître les étoiles représentant son code
PIN juste au moment de la soumission : il peut penser que quelque chose
n'a pas marché, et que l'authentification échouera (même si en fait elle
a déjà eu lieu).

D'autres idées ? Par exemple, est-il possible de détecter l'utilisation
de la touche Entrée dans un champ extérieur à un formulaire, puis de
déclencher la soumission du formulaire.

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.

5 réponses

1 2 3
Avatar
Olivier Miakinen

Qu'est-ce qu'on peut mettre comme action en dehors d'une url ? Une
fonction JavaScript ? Dans ce cas, qu'est-ce qu'on met comme
méthode ?


Ben, une URL ;-) Mais tu peux en construire une avec un
"pseudo-protocole" (genre about: ou javascript:)

Supposons que tu aies une fonction que tu souhaites appeler sur le
submit *sans que rien ne parte vers le serveur* : <form
action="javascript:mafonction(mesargs);"> la page n'est pas
rechargée, les champs restent tels quels mais la fonction est
exécutée.


C'était bien ma question.

Je ne sais pas si ça répond à ton problème (fil un peu long...),


Ah oui, la question initiale était un peu longue, mais le fil l'est
devenu lui aussi. En fait, j'ai déjà eu la réponse à mon problème.
Cette nouvelle question a été soulevée en cours de fil par l'une des
réponses de Thierry.

mais à ta question oui.


Eh oui, merci pour cela.

De mémoire, l'attribut method n'est pas "required" dans la DTD HTML
4.01 donc XHTML 1.0 de facto. (sa valeur par défaut est get, ça
n'empêche pas action="javascript:..." de fonctionner correctement sur
les navigateurs récents).


Tiens, je vais vérifier ça. C'est vrai que lorsque le formulaire n'est
là que pour appeler une fonction JavaScript il n'est pas très utile de
préciser une méthode qui ne sera pas utilisée.

Olivier

P.-S. : Tes lignes sont trop longues, ce qui est d'autant plus dommage
que tu utilises le format flowed : grâce à ce format, ceux qui le
veulent peuvent voir des lignes adaptées à leur fenêtre quel que soit le
découpage interne, tandis que ceux qui ne le veulent pas utiliseront la
longueur par défaut. Une longue discussion a déjà eu lieu sur le sujet
dans fr.usenet.logiciels.


Avatar
Cenekemoi

Qu'est-ce qu'on peut mettre comme action en dehors d'une url ? Une
fonction JavaScript ? Dans ce cas, qu'est-ce qu'on met comme méthode
?


Ben, une URL ;-) Mais tu peux en construire une avec un
"pseudo-protocole" (genre about: ou javascript:)
Supposons que tu aies une fonction que tu souhaites appeler sur le
submit *sans que rien ne parte vers le serveur* : <form
action="javascript:mafonction(mesargs);"> l


Personnellement, je déconseille cette forme.

Pour un résultat équivalent mais plus propre (à mon avis), il vaut mieux
écrire :
<form onsubmit="mafonction(mesargs);return false;" action=#>
(le "return false" est là pour ne pas exécuter l'attribut "action")

Ceci est équivalent à ce qui est préconisé pour les ancres :
<a onclick="mafonction(mesargs);return false;" href=#>
plutôt que:
<a href="javascript:mafonction(mesargs);">

--
Cordialement, Thierry ;-)


Avatar
YD

P.-S. : Tes lignes sont trop longues, ce qui est d'autant plus dommage
que tu utilises le format flowed : grâce à ce format, ceux qui le
veulent peuvent voir des lignes adaptées à leur fenêtre quel que soit le
découpage interne, tandis que ceux qui ne le veulent pas utiliseront la
longueur par défaut. Une longue discussion a déjà eu lieu sur le sujet
dans fr.usenet.logiciels.


Désolé, d'habitude sur les ng, je coupe a la mano (sauf les lignes de code)
et là j'ai oublié !

Promis je ne le ferai plus :-(

--
Y.D.

Avatar
YD


Qu'est-ce qu'on peut mettre comme action en dehors d'une url ? Une
fonction JavaScript ? Dans ce cas, qu'est-ce qu'on met comme méthode
?
[...] <form action="javascript:mafonction(mesargs);">




Personnellement, je déconseille cette forme.
Pour un résultat équivalent mais plus propre (à mon avis), il vaut mieux
écrire :
<form onsubmit="mafonction(mesargs);return false;" action=#>


Entièrement d'accord, d'autant que la norme ne précise pas de comportement
standard pour des URL autres que HTTP. Ce que je disais est seulement fondé
sur des tests avec trois navigateurs récents (IE6, FF1.0, Op7.54).

Une remarque sur sur action=#, personnellement je préfère action="", sans
javascript le comportement que j'ai toujours constaté est un envoi vers la
page elle-même (le # ne sert à rien puisqu'il se rajoute à cette URL).

(le "return false" est là pour ne pas exécuter l'attribut "action")


Tu veux dire qu'il est là pour stopper la propagation de l'évènement, en
l'occurrence la soumission du formulaire ?

--
Y.D.



Avatar
Cenekemoi
(le "return false" est là pour ne pas exécuter l'attribut "action")


Tu veux dire qu'il est là pour stopper la propagation de l'évènement,
en l'occurrence la soumission du formulaire ?


Toutafé, il stoppe le "submit", de même que, pour les ancres, il stoppe
le "click"...

--
Cordialement, Thierry ;-)


1 2 3