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

JSF Java Discussion :

Problème avec le Javascript du commandLink sur Firefox


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut Problème avec le Javascript du commandLink sur Firefox
    Bonjour,

    J'ai une application JSF (1.2 avec Facelets, Richfaces, etc) qui était exclusivement destinée à IE6. Désormais, on doit gérer aussi Firefox (ouf !).


    J'ai une page contenant un formulaire, avec un bouton qui rafraichit ce formulaire. Lors du rafraichissement, j'ajoute des liens (<h:commandLink>) dans ce formulaire. En gros, j'ai un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <h:form id="toto">
        ...
        <a4j:commandButton ... reRender="toto"/>
        ...
        <h:commandLink .../>
    </h:form>
    Mon souci vient du code du command link généré par JSF. En gros, il ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="#" onclick="if(typeof jsfcljs == 'function'){jsfcljs(document.forms['toto'],'...','');}return false">BLABLA</a>
    (pour info, jsfcljs est la fonction Javascript générée par le composant <h:commandLink/>)

    Mon souci, c'est que document.forms["toto"] fonctionne initialement, mais dès que le formulaire est regénéré suite au a4j:commandButton, ce code Javascript ne fonctionne pas sur FF (mais bien sur IE) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var x = document.forms["toto"];
    var y = document.getElementById("toto");
    alert("1: " + x + "\n2: " + y);
    me retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1: undefined
    2: [object HTMLFormElement]
    Du coup, sur FF, j'ai une erreur Javascript quand je clique sur le lien, qui ne fonctionne pas du coup.

    Une idée pour résoudre le problème (sans avoir à changer le reRender du <a4j:commandButton>) ?
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu as essayé de remplacer h:form par a4j:form?

  3. #3
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Oui, même résultat avec a4j:form.

    Mon idée sur le sujet : a4j voit qu'il doit remplacer mon formulaire toto. Il le supprime donc du DOM de ma page lorsque la réponse Ajax arrive, puis le rajoute à nouveau (avec le nouveau code HTML).

    A mon avis, lorsque le Javascript rajoute le formulaire toto, le document.forms n'est pas mis à jour par le moteur JS de Firefox. Je le vois avec Firebug, quand je liste le contenu de document.forms à l'initialisation de ma page, j'ai 3 formulaires dedans. Après le rendu Ajax, je me retrouve avec seulement 2.
    Du côté d'IE6, document.forms est bien mis à jour après le traitement de la réponse Ajax, et donc il contient toujours 3 formulaires...

    Ce n'est pas dramatique, étant donné que j'ai modifié le code JSF pour faire de vrais reRender, mais bon, j'aurais aimé trouvé une solution à ce problème quand même...
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    et en utilisant aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a4j:htmlCommandLink />
    il me semble que a4j:form et a4j:htmlcommandButton corrigent le problème de reRender d'un h:commandLink, mais, je pensais que le problème existait pour tous les navigateurs, ou peut être il s'agit d'un autre problème.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    la solution la plus simple serait, je pense, de mettre un a4j:outputPanel comme premier élément de ton form. et tu ferais un rerender sur ce outputPanel. Ainsi ton form ne serait pas modifié.


    Sinon, il y a un test pour ça dans le ACID3 (test 98)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    doc.body.appendChild(doc.createElementNS("http://www.w3.org/1999/xhtml", "form"));
          assertEquals(doc.forms.length, 1, "document.forms not updated after inserting a form");
    Tu peux peut etre le lancer et voir si il passe le test 98. Note que richfaces update peut être mal le DOM (form sans namespace) ?

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/10/2006, 18h05
  2. Réponses: 8
    Dernier message: 11/10/2006, 17h28
  3. [Problème] Avec un javascript pour montrer/cacher un div
    Par draho dans le forum Général JavaScript
    Réponses: 24
    Dernier message: 01/10/2006, 17h02
  4. Problème avec Socket et/ou Telnet sur le manager d'Asterisk
    Par gorby69 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 21/07/2006, 14h47
  5. [AJAX] Ajax en mode synchrone sur Safari
    Par The Blec dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/02/2006, 17h52

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