IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Perte du focus d'un élément après un replaceWith


Sujet :

jQuery

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut Perte du focus d'un élément après un replaceWith
    Bonjour à tous.

    Voila j'ai un petit problème:

    dans un de mes scripts jQuery, j'essaye de remplacer le type d'un input lors de son focus; Hors, il n'est pas possible de modifier directement le type de l'input, cela nous retourne une erreur.

    Pour pallier à ce problème j'ai fait comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $('#monInput').replaceWith($('#monInput').clone().attr('type', 'password'));
    Le problème étant que cette ligne fait perdre le focus à cet élément.

    Dans un cas classique, j'aurai simplement fait un
    sauf que dans mon cas, le replaceWith est déjà dans un on("focus", [...]); ce qui provoque une récursion infinie :/

    Aurriez vous une idée de comment régler le problème ?


    Edit:
    une solution temporaire est de remplacer le on("focus" par un on("click", mais cela ne fait pas exactement ce que je voudrais; j'aimerai que, si possible, cette action ne s’exécute qu'au focus, et non a chaque click sur l'input

    Merci =D

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    A quoi sert le replaceWith ?
    pourquoi ne pas juste modifier le type ?.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" value="mot de passe" id="monInput" />
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $('#monInput').on('focus', function () {
        $(this).attr('type', 'password');
    })
    je n'ai pas d'erreur avec ce code
    http://jsfiddle.net/jRPMh/

    Sinon au pire avec one()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $('#monInput').one('focus', function () {
        $(this).replaceWith($('#monInput').clone().attr('type', 'password'));
        $('#monInput').focus();
    });
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    Ah tient, en effet, changer directement le type avec jQuery 1.9 est possible.

    Malheureusement je dois utiliser jQuery 1.8.3, et ce n'est pas possible avec cette version. Dans ce cas nous avons le message d'erreur suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error: type property can't be changed
    Le problème si j'utilise one(), je suppose, est que cette dernière ne fonctionne qu'une seul fois c'est bien ça ?
    Du coup si l'utilisateur quite l'input, et reviens dessus plus tard ça ne marchera plus, si je comprends bien. a moins de redéfinir l'écouteur manuellement à la rigueure.

    J'ai trouvé une autre solution sinon, c'est simplement de verifier le type de mon champs avant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $("#monInput").on("focus", function(){
        if($(this).attr('type')=="text"){
            $(this).replaceWith($('#monInput').clone().attr('type', 'password'));
            $(this).focus();
        }
        else
        {
            [le reste de ma fonction]
        }
    });
    Pour le moment c'est la solution qui me parait le plus clean: le premier passage dans la fonction change le type de mon input, génère un nouveau focus pour que la fonction s’exécute une seconde fois, mais cette fois sans passer la partie de changement de type + focus.

    J'aurai bien aimer trouver plus propre, mais bon je pense que c'est tout de même une solution viable.
    Si quelqu'un à mieux, je suis preneur
    sinon je passerai le post en résolu demain

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    one me semble plus propre ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    Bah, dans mon cas, l'utilisation de one() me parrait compliqué:

    Enfait, il s'agis d'un script d'inscription.

    J'ai donc bindé des on("blur") sur le champs de password, pour qu'a la perte du focus de celui ci, un script de verification se lance.
    Selon mon cahier des charges, en cas d'erreur je dois faire apparaitre le message d'erreur dans... le champs en question.

    Donc, lors de mon on("blur"), je fais mes petites verif, et s'il y a une erreur, je transorme mon input type="password" en input type="text" afin d'y inserer le message d'erreur en value (et donc que celui ci soit lisible).

    Par la suite, le but du on("focus") est donc de repasser cet input en type="password" afin que l'utilisateur puisse de nouveau modifier son password éronné. Mais, évidement, à la perte du focus, celui ci doit de nouveau être vérifier et donc peut éventuellement repasser du type="password" à text, et ainsi de suite.


    Donc, si j'ai bien compris l'utilisation de one(), lors du premier focus, il n'y aurra pas de problème, mais si après vérification il y a une erreur, et que l'utilisateur prends le focus de ce champs de nouveau, cette fois-ci one() ne fonctionnera pas.


    Alors, comme je disais, il y a toujours moyen de binder une one() dans ma fonction de vérification du password, mais ça veut dire re-binder un événement à chaque fois que je vérifie le contenu de mon input :/

    Est-ce vraiment mieux de faire comme ça plutot que ce que j'utilise à l'heure actuelle ? (en espérant avoir été clair )

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    la question de base à se poser serait plutot quelle est vraiment l'utilité de basculer de texte en password ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    Bah pour que le message d'erreur que je dois mettre a l’intérieur du champs s'affiche lisiblement et non pas "●●●●", je dois donc basculer le champs password vers un type text;
    Comme je le disais, le cahier des charges m'impose d'afficher le message d'erreur dans le champ en question; par exemple "Champs Requis" ou "Password trop cours".

    Et donc, le repasser en password pour que l'utilisateur puisse de nouveau entrer un mot de passe différent sans que la personne derière lui puisse le lire

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Ce n'est certainement pas une bonne pratique d'indiquer un message d'erreur dans un champ à remplir...
    Tu devrais utiliser les attributs HTML5 required / pattern / placeholder pour ça en prévoyant éventuellement un polyfill pour les versions obsolètes de IE.
    Voir aussi : L'API HTML5 de contrainte de validation.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  9. #9
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    en effet ... ou afficher le message d'erreur dans un span accolé à ton input en utilisant next() de jquery ...
    Mais en tout état de cause utiliser un input password pour afficher des messages est une erreur de conception
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  10. #10
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    Je suis tout à fait conscient de ça, mais comme je disais, cahier des charges oblige
    je ne suis pas le concepteur, je suis que développeur sur ce projet, et on ne m'a pas spécialement laisser le choix la dessus.

    Alors, je vous suis tout à fait, personnellement j'aurais effectivement mis dans un span a coté, ce qui aurait largement simplifié mon script de vérification.
    Mais malheureusement....

    Par contre je n'avais pas spécialement pensé à mettre le message d'erreur dans le placeholder, ça peut en effet être une solution. Mais est-il possible de changer la couleur du text du place holder ?
    Ouais, par-ce qu'en plus de devoir afficher le message d'erreur dans l'input (et donc toute les galères d'enregistrer la valeur dans une variable, afficher le message, et réplacer la valeur au focus), il faut également que celui ci s'affiche en rouge
    (ouais je sais, c'est une question tout à fait stupide que je vais d'ailleurs tout de suite allez chercher grace à mon ami, ne prenez pas en compte cette dernière question ^^)

  11. #11
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    mieux vaut alors placer un span au dessus de l'input password !
    qui viendra masquer l'input
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  12. #12
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Exemple fonctionnel en 1.8.3 et plus, mais Bovino à raison :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input id="monInput" type="text" value="mot de passe">

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $( "#monInput" ).on( "change", function(){
    	$( this ).prop( "type", "password" );
    });

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  13. #13
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    Je plussoie de nouveau, je sais bien que je n’utilise pas la bonne méthode

    Je n'avais pas pensé du tout à la validation grâce au HTML5, il va falloir que je me penche dessus pour le prochain projet, mais ça à effectivement l'air très puissant et assez personnalisable, je garde ça sous le coude

    J'aurai peut être même pu l'utiliser ici, mais bon, maintenant que j'ai fini tout mes scripts, pas envie de tout me retaper (et surtout, pas spécialement le temps avant la deadline ^^)

    En tout cas, super !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $( this ).prop( "type", "password" );
    fonctionne très bien, ne perds pas le focus et fait exactement ce que je voulais

    Merci beaucoup à tous,
    Super réactivité et très bon conseils =)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Perte de focus d'une JFrame après un toFront()
    Par MonsieurSmith dans le forum Agents de placement/Fenêtres
    Réponses: 0
    Dernier message: 16/01/2009, 10h38
  2. datagrid case a cocher validation apres perte de focus
    Par Julien666 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/01/2008, 21h03
  3. Réponses: 4
    Dernier message: 05/10/2006, 13h10
  4. Réponses: 8
    Dernier message: 26/09/2006, 09h19
  5. Réponses: 9
    Dernier message: 02/02/2006, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo