Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exécuter du Javascript

après un .innerHTML

    14 novembre 2010 à 0:53:12

    Bonjour à tous!

    J'essaie de faire ceci:

    -J'ai un div dont le contenu change dynamiquement avec un .innerHTML
    -Dans ce div au contenu dynamique, il peut y avoir du javascript.

    Comment exécuter ce Javascript dynamiquement inséré dans mon div? Car si j'appelle une fonction maFonction() qui a été dynamiquement ajoutée, j'obtiens une erreur "maFonction() is not defined.

    Merci d'avance,

    SQ;p
    • Partager sur Facebook
    • Partager sur Twitter
      14 novembre 2010 à 3:49:11

      Tu peux utiliser eval("ta chaîne"); Cette fonction va analyser la chaîne et exécuter le JS s'il en trouve.
      Mais tu peux peut-être t'arranger pour ajouter tes fonctions autrement : eval() est un peu coûteux en temps d'exécution.
      • Partager sur Facebook
      • Partager sur Twitter
        14 novembre 2010 à 11:42:56

        eval c'est mal. Et ça analyse la chaîne comme étant du code javascript, donc si elle tombe sur des balises html, elle va pas aimé.

        De toutes façon c'est une drôle d'idée que de vouloir insérer du script avec innerHTML
        • Partager sur Facebook
        • Partager sur Twitter
          14 novembre 2010 à 12:04:57

          Citation : LCaba

          De toutes façon c'est une drôle d'idée que de vouloir insérer du script avec innerHTML


          Comment tu crois que j'ai fais pour OnHack ? ;)

          En fait, mettre du script dans le innerHTML est tout à fait possible, sauf que tu ne peux pas définir de fonctions (alors pourquoi, je ne saurais le dire)
          Donc tu dois créer tes fonctions en "dur" dans la page, mais tu peux les appeler via script dans le innerHTML

          Et oui, "eval say le mal". Quand on utilise eval, c'est qu'on a mal analysé la manière de s'y prendre. ;)
          • Partager sur Facebook
          • Partager sur Twitter
          Directeur technique, créateur de jeux HTML5 et fan de JavaScript | La suite de OnHack est sur les rails !
            14 novembre 2010 à 12:10:33

            J'ai essayer de coder "en dur" mais meme un petit "console.log()" n'a pas d'effet...
            • Partager sur Facebook
            • Partager sur Twitter
              14 novembre 2010 à 12:15:38

              tu mets bien les balises script autour de ton js ?
              • Partager sur Facebook
              • Partager sur Twitter
              Directeur technique, créateur de jeux HTML5 et fan de JavaScript | La suite de OnHack est sur les rails !
                14 novembre 2010 à 12:16:36

                (LCaba) Non ce n'est pas une drôle d'idée ! Par exemple avec du Ajax, comment tu fait un ?

                Voila un petit script que j'ai trouver sur le web et que j'ai modifier un peut pour ton cas :
                <html>
                <head>
                
                <script>
                function executer_script(monscript) {
                	var head = document.getElementsByTagName("head")[0];
                	var scr;
                
                	var d = document.getElementById('resultat');
                	d.innerHTML = monscript;
                	var scrajx = d.getElementsByTagName('script');
                
                	for(var i in scrajx) {
                		scr = document.createElement("script");
                		scr.type = "text/javascript";
                		scr.text = scrajx[i].text;
                		head.appendChild(scr);			
                	}
                }
                </script>
                
                </head>
                <body>
                
                <input type="button" value="test" onclick="executer_script('Mon html + du javascript <script>alert(\'test\');</script>');">
                
                <div id="resultat"></div>
                
                </body>
                </html>
                
                • Partager sur Facebook
                • Partager sur Twitter
                  14 novembre 2010 à 12:23:22

                  J'ai essayé ça :

                  div.innerHTML = '<script>alert("ok")</script>';
                  

                  ...et ça :

                  div.innerHTML = '\74script\76alert("ok")\74/script\76';
                  


                  ...marche pas.

                  Et je vois pas l'intérêt de récupérer des fonctions en AJAX. Des données d'accord, mais dans ce cas il y a JSON
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 novembre 2010 à 12:24:50

                    Merci, mais comment j'appelle executer_script()?

                    En fait mon appli doit afficher de nouveaux marqueurs dans une googlemap. Le code Js pour les afficher est chargé par le innerHTML. mais dans ce innerHTML, il y a aussi un tableau html listant ces marqueurs avant le script
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 novembre 2010 à 12:29:04

                      Mon code en ci-dessus ne te met pas sur la voix, voir même résout ton problème ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 novembre 2010 à 12:29:31

                        Je le ferais en JSON :

                        {
                            "html": "html à charger",
                            "script": "code à exécuter"
                        }
                        


                        Code à exécuter à la réception :

                        var json = JSON.parse(xhr.responseText);
                        
                        div.innerHTML = json.html;
                        (new Function(json.script())();
                        


                        EDIT: J'ai rectifié, l'ancien code ne fonctionnant pas. new Function() revient à utiliser eval je crois, mais de toutes façons on est obligé d'évaluer le code reçu.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Exécuter du Javascript

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown