Partage
  • Partager sur Facebook
  • Partager sur Twitter

Evaluer du Javascript à la volée

problème avec IE 7

Sujet résolu
    22 août 2011 à 0:59:37

    Bonsoir à tous !

    Je ne comprends pas pourquoi le script suivant fonctionne bien sous Firefox, Chrome et Opera, mais pas sous Internet Explorer 7.
    Peut être que quelqu'un saura m'éclairer ?

    Le but de ce script est d'évaluer à la volée une chaine contenant des scripts Javascript ainsi que du HTML.
    Il peut y avoir plusieurs scripts dans la chaine, mélangés avec du HTML.
    Pour l'exemple, la chaine contient uniquement un script affichant "Test" dans une box alert.

    Test.html:
    <body>
    	<script type="text/javascript">
    			var element = document.createElement('div');
    			document.body.appendChild(element);
    			element.innerHTML = "<script type=\"text/javascript\">alert('Test');<\/script>";
    			var scripts = element.getElementsByTagName("script");
    			for(var i=0; i<scripts.length; i++)
    			{
    				if (window.execScript)
    					window.execScript(scripts[i].text.replace('<!--',''));
    				else
    					window.eval(scripts[i].text);
    			}
    	</script>
    </body>
    


    Au chargement de Test.html, on devrait voir une box alert affichant "Test". Ce n'est pas le cas sous IE.
    Ne cherchez pas la logique de ce code, c'est juste un exemple :p j'ai pris que la partie utile de mon code pour décrire le bug que je rencontre.

    Le problème est visiblement lié à element.getElementsByTagName("script"), qui ne trouve aucun script avec IE, puisque scripts.length vaut 0.

    Quelqu'un sait-il pourquoi ça ne fonctionne pas sous IE ?

    Je vous remercie et... bonne nuit !
    • Partager sur Facebook
    • Partager sur Twitter
      22 août 2011 à 1:29:19

      IE a quelques soucis niveaux compatibilité, donc utilise un navigateur différent ou au pire, change de version voir si ça marche
      • Partager sur Facebook
      • Partager sur Twitter
        22 août 2011 à 9:39:53

        Si ça ne tennait qu'à moi je ne supporterai pas IE pour mes développements WEB.
        Cependant je dois supporter IE, et les visiteurs, qui utiliseront un script dérivé de celui ci-dessus, utiliseront pour la plupart IE (malheureusement).

        Je pense que ce que je veux faire doit être possible avec IE, mais je n'ai pas encore trouvé comment.
        • Partager sur Facebook
        • Partager sur Twitter
          22 août 2011 à 10:00:15

          Je ne suis pas du tout sur, mais peut être qu'il faudrait utiliser la fonction eval().
          • Partager sur Facebook
          • Partager sur Twitter
            22 août 2011 à 10:20:05

            En fait le problème se produit avant, puisque c'est scripts.length qui vaut 0 : aucun tag script n'est trouvé par element.getElementsByTagName("script").
            J'avais oublié de préciser dans le sujet => je l'update.
            • Partager sur Facebook
            • Partager sur Twitter
              22 août 2011 à 10:57:07

              Salut, j'ai regardé un peu ton problème, et je l'ai résolu (pour la version 8 d'ie tout au moins), au lieu de :
              var element = document.createElement('div');
              			document.body.appendChild(element);
              			element.innerHTML = "<script type=\"text/javascript\">alert('Test');<\/script>";
              


              Ecrit :
              var element = document.createElement('script');
              element.text = "alert('Test');";
              document.body.appendChild(element);
              


              Et après tu peut garder ta boucle le tag script est tout a fait reconnu par IE.
              • Partager sur Facebook
              • Partager sur Twitter
                22 août 2011 à 11:03:55

                Merci, ta solution devrait en effet aussi marcher sur IE 7 (il faudra que je vérifie).
                ... mais ça ne corrige malheureusement pas mon problème ;)

                En entrée du script, j'ai une chaine de caractères, qui contient du HTML et qui peut (ou pas) contenir un ou plusieurs scripts Javascript.
                Le but est donc d'être en mesure d'identifier et d'évaluer chacun des scripts Javascript présents dans la chaine de caractères.

                Ce que je ne comprends pas c'est pourquoi le element.getElementsByTagName("script") ne fonctionne pas sur IE mais fonctionne sur les autres browsers.
                • Partager sur Facebook
                • Partager sur Twitter
                  22 août 2011 à 11:17:14

                  le getElementsByTagName("script"), fonctionne correctement sous ie. Le innerHTML, lui ne fonctionne par sur ie, normalement il fonctionne juste pour un div, mais là j 'ai rajouté un id et en effet,le block div ne contient pas le script.
                  Donc, essaye plûtot d'inséré des script comme je t'ai montré précédemment.
                  Sinon, ce n'est peut être pas utile d'ajouter les script au DOM si ils sont exécutés qu'au démarrage de la page. Donc l'autre solution est de faire du parssing afin de récupéré le contenu de tes balises script dans ta chaîne de caractère et les exécuter juste après.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 août 2011 à 11:34:55

                    Le mieux que tu ai a faire c'est de bien séparer HTML et Javascript puis d'utiliser le code de ninlock, parce que IE gère très mal l'ajout d’éléments après que la page ne soit chargée.

                    Sinon, tu peux aussi passer par les iframes si ton code à rajouté provient directement d'une page web existante (et non généré par JS).
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 août 2011 à 12:00:42

                      OK.
                      Sinon j'ai trouvé un exemple qui fonctionne, il ne me reste plus qu'à comprendre pourquoi ;) je verrai ça ce soir.
                      Il charge en AJAX un fichier HTML contenant également du Javascript, et je vois bien l'effet sous IE 7.

                      Voir ICI

                      Le code HTML (contenant du Javascript) téléchargé à la volée en AJAX
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Evaluer du Javascript à la volée

                      × 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