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

JavaScript Discussion :

Fonction en parametre d'une fonction


Sujet :

JavaScript

  1. #1
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut Fonction en parametre d'une fonction
    Bonjour,

    Le sujet a peut-être déjà été traité mais je n'ai rien trouvé dans la FAQ ou dans le forum :

    J'ai une fonction createTable de création de <table> en DOM, qui me sert soit à créer une table, soit un pseudo-formulaire selon les paramètres passés à la fonction createTable (c'est à dire des champs <input> et un bouton "Valider").

    Quand j'ajoute le bouton "VALIDER" séparément de la fonction createTable et que je lui attribue l'event listener qui va bien, et bien .. tout va bien.



    SAUF QUE:
    je voudrais intégrer la création du listener directement DANS la fonction createTable. Et évidemment, je souhaite que ce listener sur le bouton "VALIDER" soit différent selon le point d'appel ou de création de la table en question. Ce qui requiert le passage d'une fonction en paramètre.

    Dans le code ci-dessous, je souhaite par exemple appeler la fonction CreateTable avec en paramètre la fonction "RecordNewSpecs". Mais je souhaite aussi pouvoir l'appeler avec d'autres fonctions.

    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
     
     
    // Appel de createTable
    createNewTable(
    			/* noeud d'insertion */ 		"spec",
    			/* titre tbl */					"SPECIFICATIONS DETAILLEES (données non contractuelles)",
    			/* titre colonne de datas */	ref_produit,
    			/* Data */				data_array,
    			/* With picture*/			true,
    			/* with Tfoot*/			true,
    			/* with input fields*/	        true,
    			/* call back on submit */	RecordNewSpecs);
     
    // La fonction
    function createTable(id_insert_point, table_title, data_title, data_array, with_pic, with_tfoot , input_on_off, callback_on_submit){
     
      ...
     
    // Ajouter l'event 'on click' (bouton VALIDER)
    	if(document.all) tfoot.attachEvent("onclick", callback_on_submit);
    	else tfoot.addEventListener("click", callback_on_submit, true);
      ...
    }
    Et là ça pêche :
    Erreur*: uncaught exception: [Exception... "Could not convert JavaScript argument" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: https://www.domain.fr/lib/javascript/table.js :: createTable :: line 158" data: no]
    => LA question:
    Comment peut-on passer un nom de fonction en paramètre d'une fonction ?


    Merci d'avance

  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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ffunction launcher(func,params){
    window[func](params)
    }
     
    function bonjour(){alert('bonjour')}
    function hello(){alert('hello')}
    function myalert(texte){alert(texte)}
     
     
    launcher('hello')
    launcher('bonjour')
    launcher ('myalert', 'message')

  3. #3
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    ceci étant ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function foo(bar){
    bar()
    }
     
    function bonjour(){alert('bonjour')}
    function hello(){alert('hello')}
     
     
    foo(bonjour)
    fonctionne aussi

  4. #4
    Membre régulier Avatar de yacine.dev
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Points : 88
    Points
    88
    Par défaut eval
    eval poura faire la meme chose que window?

  5. #5
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Oui d'accord avec tt ça, mais ça ne répond pas à ma question, car ce dont j'ai besoin, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function foo(p1, p2, ..., bar){
     
    tfoot.addEventListener("click", bar, true);
     
    }
     
     
    function bar(event) {
    truc
    bidule
    }

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Février 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 119
    Points : 777
    Points
    777
    Par défaut
    Puisque tu as l'air d'avoir des ids partout, je te conseille plutôt de poser un seul listener sur tout ton tableau (même généré dynamiquement). C'est ensuite lui qui va récupérer l'élément qui a été cliqué et à partir de l'id exécuter ce que tu avais prévu de faire avec cette ligne.

    c'est + performant

    un exemple (pas facile à lire mais bon ...) par une librairie :
    http://developer.yahoo.com/yui/examp...elegation.html

  7. #7
    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
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Pas testé, mais ça devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function foo(p1, p2, ..., bar){
     
    tfoot.addEventListener("click", function(){bar()}, true);
     
    }
     
     
    function bar(event) {
    truc
    bidule
    }

  8. #8
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    et attachEvent ?

  9. #9
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    ça ne marche pas en l'état.

    J'ai aussi essayé d'employer cette notation dans l'appel à foo, pas mieux..

  10. #10
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Ce n'est pas le probleme de la méthode AttachEvent,

    le vrai code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(document.all) tfoot.attachEvent("onclick", callback_on_submit);
    else tfoot.addEventListener("click", callback_on_submit , true);

  11. #11
    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
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Tu es sûr que le callback existe bien dans le contexte de l'appel ? Parce qu'il n'y a aucune raison que ça ne fonctionne pas
    A moins qu'il y ai un truc flagrant que j'aurais pas vu

  12. #12
    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
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par Bovino Voir le message
    A moins qu'il y ai un truc flagrant que j'aurais pas vu
    Par exemple ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    createNewTable(
    			/* noeud d'insertion */ 		"spec",
    			/* titre tbl */					"SPECIFICATIONS DETAILLEES (données non contractuelles)",
    			/* titre colonne de datas */	ref_produit,
    			/* Data */				data_array,
    			/* With picture*/			true,
    			/* with Tfoot*/			true,
    			/* with input fields*/	        true,
    			/* call back on submit */	RecordNewSpecs);
     
    // La fonction
    function createTable(id_insert_point, table_title, data_title, data_array, with_pic, with_tfoot , input_on_off, callback_on_submit)

  13. #13
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Non, c'est exactement ce que j'ai fait au départ. ET c'est ça qui me retourne l'erreur.

  14. #14
    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
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Ben oui, c'est bien ça le problème...
    Tu appelles une fonction, mais celle à laquelle tu sembles faire référence porte un autre nom !
    Essaye comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    createTable(
    			/* noeud d'insertion */ 		"spec",
    			/* titre tbl */					"SPECIFICATIONS DETAILLEES (données non contractuelles)",
    			/* titre colonne de datas */	ref_produit,
    			/* Data */				data_array,
    			/* With picture*/			true,
    			/* with Tfoot*/			true,
    			/* with input fields*/	        true,
    			/* call back on submit */	RecordNewSpecs);

  15. #15
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    la methode fonctionne lorsqu'elle est utilisée correctement
    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
    <script type="text/javascript">
    function init(){
    if(document.all) {document.getElementById('tfoot').attachEvent("onclick", callback_on_submit);}
    else{document.getElementById('tfoot').addEventListener("click", callback_on_submit , true)};
    }
     
    function callback_on_submit(){
    alert('triggered')
    }
    </script>
    <title>Nouvelle page 1</title>
     
    </head>
     
    <body onload="init()">
    <input type="button" value="test" id="tfoot" />
    </body>

  16. #16
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Merci !

    Yeaaahh ! Résolu,

    Effectivement, j'avais oublié un léger détail ... dans un des appels à la fonction createtable(...callback) car j'ai un mic-mac de fonctions enchainées :

    Voilà le schéma qui fonctionne avec ce mic-mac.

    1) Corps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    helloworld(...callback);
    2) HelloWorld
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fonction hello_world)() {
     
    // Appel de bar
    foo(..., callback); // C'est CELUI  là que j'avais légèrement omis ...
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fonction foo(p1, P2, ..., callback) {
    ...
    if(document.all) tfoot.attachEvent("onclick", callback);
    else tfoot.addEventListener("click", callback , true);
    ...
    }

    3) Une des fonctions de callback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fonction bar(event) {
     
    }

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

Discussions similaires

  1. [Langage] une fonction comme argument d'une fonction?
    Par Krishna dans le forum Langage
    Réponses: 9
    Dernier message: 15/10/2008, 20h31
  2. passage d'une fonction en parametre d'une fonction
    Par psylox dans le forum Langage
    Réponses: 5
    Dernier message: 06/10/2008, 16h40
  3. Réponses: 1
    Dernier message: 15/09/2008, 14h38
  4. Réponses: 9
    Dernier message: 22/08/2007, 12h25
  5. Réponses: 9
    Dernier message: 22/08/2007, 12h25

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