Skip to content

Commit dc780d9

Browse files
unknownunknown
authored andcommitted
Nouvelle version du post sur le login en js
1 parent 74167f3 commit dc780d9

File tree

1 file changed

+31
-29
lines changed

1 file changed

+31
-29
lines changed

_posts/2011-10-19-subtilite-du-login.markdown renamed to _posts/2011-10-19-subtilites-du-login.markdown

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
---
22
layout: post
3-
title: Les subtilité des formulaire de login en JS
3+
title: Les subtilités des formulaires de login en JS
44
author: feugy
5-
tags: [javascript, login, formulaire, chrome, firefox]
5+
tags: [javascript, login, formulaire, chrome, firefox, jQuery]
66
published: false
77
---
88

@@ -12,20 +12,20 @@ En HTML, certes, mais lorsque qu'on parle d'application riche en javascript, c'e
1212
Si vous ne comprenez pas pourquoi le navigateur ne retient pas vos logins, ne propose pas le mot de passe associé, ou ne réagit pas à la touche entrée, lisez la suite !
1313

1414
Cet article est le résultat de **l'étude empirique du comportement des navigateurs**.
15-
Il est donc sujet à caution: tout dépends de votre navigateur, et de sa version.
15+
Il est donc sujet à caution: tout dépends de votre navigateur et de sa version.
1616
J'espère simplement vous aider à comprendre et éviter les principaux chausse-trappes, sans avoir recours à l'installation d'un plugin :)
1717

1818

1919
## Mais ce n'est qu'un formulaire !
2020

21-
Hélas non... Les formulaire de login (un champs <tt>text</tt> + un champ <tt>password</tt>) sont détecté par le navigateur, qui va traiter différemment des autres champs textuels.
21+
Hélas non... Les formulaires de login (un champs <tt>text</tt> + un champ <tt>password</tt>) sont détectés par le navigateur, qui va les traiter différemment des autres champs textuels.
2222

2323
C'est là le premier problème :
2424
>**Le formulaire doit être présent dans le DOM au chargement de la page.**
2525
26-
Oui, vous avez compris : si vous construisez votre formulaire directement en JS, ou si vous utilisez un template que vous accrochez une fois la page chargée, votre formulaire ne sera ignorés par certains navigateurs.
26+
Oui, vous avez compris : si vous construisez votre formulaire directement en JS, ou si vous utilisez un template que vous accrochez une fois la page chargée, votre formulaire sera ignoré par certains navigateurs.
2727

28-
L'astuce que j'utilise consiste a :
28+
L'astuce que j'utilise consiste à:
2929

3030
* inclure le formulaire de login dans ma page index.html
3131
* le masquer avec un style CSS <tt>display:none</tt>.
@@ -74,23 +74,23 @@ Même s'il est masqué (le bouton n'est pas encore bien skinnable, même en CSS
7474
}).button({label:'log in !'});
7575

7676

77-
## Doit-on stopper la propagation de l'évènement <tt>submit</tt> ?
77+
## Doit-on stopper la propagation de l'événement <tt>submit</tt> ?
7878

79-
Le problème se pose si vous ne réalisez pas de "vrai" POST lorsque l'utilisateur déclenche la soumission du formulaire.
80-
Dans la majorité des applications riches, l'authentification se fait via une Api, et donc un appel Ajax.
79+
Le problème se pose si vous ne réalisez pas un "vrai" POST lorsque l'utilisateur déclenche la soumission du formulaire.
80+
Dans la majorité des applications riches, l'authentification se fait via une API, et donc un appel Ajax.
8181

82-
On se branche alors sur l'évènement submit, et on annule sa propagation. Par exemple :
82+
On se branche alors sur l'événement submit, et on annule sa propagation.
8383

84-
Seulement, en stoppant l'évènement de soumission, le navigateur ne retient pas le login et le mot de passe.
84+
Seulement, en stoppant l'événement de soumission, le navigateur ne retient pas le login et le mot de passe.
8585

86-
>**Pour que le navigateur mémorise le couple login/mot de passe, l'évènement <tt>submit</tt> doit se propager.**
86+
>**Pour que le navigateur mémorise le couple login/mot de passe, l'événement <tt>submit</tt> doit se propager.**
8787
8888
Cela implique:
8989

90-
* Que le formulaire pointe sur une véritable url, sinon, une vilaine 404 apparaitra dans votre console
91-
* Que le résultat de la soumission est routée dans une iframe (désolé pour les puristes :)), sans quoi, toute la page se rechargera
90+
* que le formulaire pointe sur une véritable url, sinon, une vilaine 404 apparaitra dans votre console
91+
* que le résultat de la soumission soit routée dans une iframe (désolé pour les puristes :)), sans quoi, toute la page se rechargera
9292

93-
Donc généralement, mon service web propose une Api POST qui ne fait rien et renvoi une page vide, et j'utilise une iframe masquée.
93+
Donc généralement, mon service web propose une API POST qui ne fait rien et renvoie une page vide, et j'utilise une iframe masquée.
9494

9595
**index.html**
9696

@@ -107,35 +107,37 @@ Donc généralement, mon service web propose une Api POST qui ne fait rien et re
107107
**login.js**
108108

109109
$('#formLogin').submit(function(event){
110-
// Ici mon appel ajax, et surtout, ne pas renvoyer false ni n'invoquer event.stopPropagation().
110+
// Ici mon appel ajax, et surtout, ne pas renvoyer false ni invoquer event.stopPropagation().
111111
});
112112

113113

114114
### Une petite astuce : lorsque l'authentification échoue.
115115

116-
A partir du moment où l'évènement <tt>submit</tt> est propagé, et qu'une réponse HTTP est reçue, le navigateur conservera bien le mot de passe et le login.
116+
A partir du moment où l'événement <tt>submit</tt> est propagé, et qu'une réponse HTTP est reçue, le navigateur conservera bien le mot de passe et le login.
117117

118-
Mais nous pouvons tirer parti de se comportement, lorsque l'authentification échoue, par exemple si l'utilisateur est inconnu, ou le mot de passe erroné.
118+
Mais nous pouvons tirer parti de ce comportement, lorsque l'authentification échoue, par exemple si l'utilisateur est inconnu, ou le mot de passe erroné.
119119

120-
Ainsi, mon appel Ajax est toujours **synchrone** (parfois ça sert !), et s'il échoue, alors dans ce cas, j'annule la propagation de l'évènement <tt>submit</tt> pour ne pas conserver les mauvais identifiants.
120+
Ainsi, mon appel Ajax est toujours **synchrone** (parfois ça sert !), et s'il échoue, alors dans ce cas, j'annule la propagation de l'événement <tt>submit</tt> pour ne pas conserver les mauvais identifiants.
121121

122122

123123

124124
## La touche entrée ne soumet pas toujours mon formulaire...
125125

126-
Hélas oui, c'est un comportement étrange de certains navigateurs : un formulaire sera automatiquement soumit si on appuie sur entrée dans un de ses champs, sauf s'il à plus d'un champ <tt>text</tt>/<tt>password</tt>!
126+
Hélas oui, c'est un comportement étrange de certains navigateurs : un formulaire sera automatiquement soumit si on appuie sur entrée dans un de ses champs, sauf si le bouton submit est invisible !
127127

128-
Nous n'avons donc pas d'autres choix que de gérer nous même en javascript la touche entrée :
128+
Donc il faut eviter le <tt>display:none</tt> ou le <tt>visibility:hidden</tt> sur le champ.
129+
Personnellement, je lui affecte une taille de zéro. Vous pouvez aussi le positionner en absolu, en dehors de la zone visible, ou le mettre en dessous d'un autre élément avec le <tt>z-index</tt>
129130

130-
**login.js**
131+
**index.html**
131132

132-
$('#formLogin input').keyup(function(event){
133-
if (event.which == '13' && !event.metaKey) {
134-
$('#formLogin').submit();
135-
// Annule la propagation de l'évènement clavier, pour ne pas soumettre 2 fois le formulaire sur les navigateurs qui supportent correctement la feature.
136-
return false;
137-
}
138-
});
133+
<div id="loginStock" style="display:none" method="post" action="/api/login/noop" target="postFrame">
134+
<form id="formLogin">
135+
<input autofocus="autofocus" type="text" name="username"/>
136+
<input autocomplete="on" type="password" name="password"/>
137+
<input type="submit" style="width:0; height:0; border:0; padding:0"/>
138+
</form>
139+
<a href="#" class="submit"></a>
140+
</div>
139141

140142

141143
## Conclusion

0 commit comments

Comments
 (0)