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 :

JSF et JavaSript


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 30
    Par défaut JSF et JavaSript
    bonjour tout le monde,
    je me suis cassé la tête durant toute la nuit pour pouvoir faire un truc vital pour mon projet:
    j'ai un datatable qui affiche des entrées d'un réponse SQL, pour chaque ligne je veux pouvoir appeler une méthode d'un bean(via un commandLink), tout en fermant la fenaître courante avec le code JS "window.opener.close()", le problème c'est que lorsque je j'appelle mon code JS à partir d'un événement "onclick", ce "onclick" est déja utilisé par JSF pour lancer la méthode, ce qui fait qu'on ne peut pas faire les deux tâches à la foi. j'ai essayé "onmouseup" mé il s'éxecute avant "onclick", et du coup ma fenaître se ferme sans appeler ma méthode.
    J'éspère que j'ai pu vous expliqué le problème et merci d'avance.
    cordialement.

  2. #2
    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
    Bonjour à toi,

    Peux-tu nous montrer ton code JSF, en particulier celui de ton commandLink ?

    Concernant la définition du onclick, je ne suis pas d'accord.
    En effet, lorsque le composant commandLink va être "rendu" en HTML, le onclick va être défini, pour faire en sorte d'appeler la méthode du bean définie dans l'attribut action (ou actionListener). Cependant, si tu définis toi même quelque chose dans le onclick, celui-ci sera placé avant le code ajouté par JSF.

    Par exemple, le code JSF suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h:form id="myForm">
        <h:commandLink id="btn1" value="Test un" action="#{monBean.maMethode}"/>
        <h:commandLink id="btn2" value="Test deux" action="#{monBean.maMethode}" onclick="alert('coucou');"/>
    </h:form>
    créera le code HTML suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form id="myForm" ...>
        ...
        <a id="myForm:btn1" href="#" onclick="if(typeof jsfcljs == 'function'){jsfcljs(document.forms['myForm'],'myForm:btn1,myForm:btn1','');}return false">Test un</a>
        <a id="myForm:btn2" href="#" onclick="var a=function(){alert('coucou');};var b=function(){if(typeof jsfcljs == 'function'){jsfcljs(document.forms['myForm'],'myForm:btn2,myForm:btn2','');}return false};return (a()==false) ? false : b();">Test deux</a>
    </form>
    Bon, le code est un peu barbare, mais on voit que myForm:btn1 a un code Javascript bien précis sur le onclick. Je l'ai surligné en bleu.
    Ce code est également présent sur le deuxième bouton, mais le code que j'ai moi même défini dans le onclick (à savoir le code en rouge), est présent aussi, et exécuté avant !

    Il n'y a donc aucun problème à utiliser onclick et action...

    Cela permet par exemple de se servir d'un commandButton ou commandLink pour faire exécuter un code JS sans soumettre le formulaire, en retournant false à la fin de son code JS, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:commandLink ... onclick="alert('j execute un truc en JS ici'); return false;"/>
    Donc le problème vient d'ailleurs pour ton code !
    A ce propos, pourquoi tu fais window.opener.close() alors que tu dis vouloir fermer la fenêtre courante ?
    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

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 30
    Par défaut
    ok je vais vous expliquer:
    dans une page "ajouterCompte.jsp" j'ai un formulaire qui prend les valeur qu'on veut ajouter au bean "Compte" et qui a un champ "codeClient" qui est une clé étrangère. l'utilisateur lui ne peut pas retenir les codes des clients mais leurs noms, alors j'ai proposer un petit lien a coté du champ "codeClient" qui ouvre une nouvelle fenaître graçe à une fonction javascript appelée "popup()", cette fenaître, propose un autre formulaire de recherche sur les clients et affiche le résultat sur la popup sous format datatable et propose un lien "insérer" qui doit insérer le numéro du client dans le premier formulaire dans la fenaître principale tout en fermant la popup et actualisant la fenaître principale.
    codes:
    pour le champ "codeClient" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <h:inputText value="#{Compte.codeClient}" />
    <h:outputLink value=javascript:popup('isererClient.jsp',hauteur,largeur)">chercher</h:outputLink>
    pour la page insererClient.jsp:
    pour la colone du lien insérer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h:column >
                        <f:facet name="header"><h:outputText value="Insertion" /></f:facet>
                        <h:commandLink value="insérer" action="#{Compte.inserer}" onclick="window.opener.fermer();"/>
                    </h:column>
    pour la méthode inserer du bean Compte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void inserer(){
           Compte.setCodeClient(((Client)Client.getTable().getRowData()).getCodeClient());
       }
    pour le code javascript:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    function popup(url,largeur,hauteur){
     
            if (hauteur == ""){
                    var hauteur = 400;
            }else{
                    var hauteur = hauteur;
            }
            if (largeur == ""){
                    var largeur = 400;
            }else{
                    var largeur = largeur;
            }
     
    var top = (screen.height - hauteur)/2;
    var left = (screen.width-largeur)/2;
     
    features = "top=" + top + ", left=" + left + ",width=" + largeur + ",height="  +hauteur  +",noresize";
        zoom = window.open(url, 'liens', features); 
    	if (navigator.userAgent.indexOf('MSIE')==-1) 
    	if( self.focus ) openw.focus(); 
    }
    function fermer(){
         zoom.close();
         self.location.reload();
    }
    le code javascript est inclut sur la page "ajouterCompte.jsp" c'est pourquoi je fais window.opener.fermer().
    avec ce code ça marche parfoi mé parfoi ça marche pas, je pense que c'est à cause du code rendu par jsf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <a id="myForm:btn2" href="#" onclick="var a=function(){window.opener.fermer();};var b=function(){if(typeof jsfcljs == 'function'){jsfcljs(document.forms['myForm'],'myForm:btn2,myForm:btn2','');}return false};return (a()==false) ? false : b();">insérer</a>
    </form>
    ce code il propose deux fonctions: a et b et verifie si a()==false il retourne false sinon il retourne b.
    je ne sais pas où est le problème exactement, pour le moment je me suis contenter de faire deux liens l'un pour l'insersion l'autre pour le fermeture, en attendant la solution

Discussions similaires

  1. JSF vs Struts
    Par peuh dans le forum JSF
    Réponses: 22
    Dernier message: 06/04/2013, 22h49
  2. [JSF] Implémentation d'un formulaire dynamique
    Par Fleep dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/03/2005, 19h00
  3. Réponses: 1
    Dernier message: 26/08/2004, 16h23
  4. [ JSF ][ Struts ] Intégration JSF et Struts
    Par tiSioux dans le forum JSF
    Réponses: 10
    Dernier message: 26/07/2004, 11h10
  5. [Plugin]Plugin JSF pour eclipe
    Par yanis97 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 07/07/2004, 14h50

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