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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 !

+ 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