Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/08/2011, 10h26   #1
Invité de passage
 
Inscription : septembre 2007
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 12
Points : 3
Points : 3
Par défaut Evaluer du Javascript à la volée

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:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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 !
bluelambda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 10h30   #2
Membre régulier
 
Étudiant
Inscription : octobre 2010
Messages : 92
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 92
Points : 78
Points : 78
Pourquoi tu échappes le slash de ta balise script ?

EDIT : Exact je suis bête :p
zeclad01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 10h49   #3
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 021
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 021
Points : 45 117
Points : 45 117
ben sinon cette balise sera comprise comme la balise de fermeture du script courant, et pas comme du string html ...

Il y a un post ou une contribution sur l'ajout d'une balise script dynamiquement en passant par le DOM
Code :
document.createElement('script')
une petite recherche et tu trouveras ton bonheur ...
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 11h16   #4
Invité de passage
 
Inscription : septembre 2007
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 12
Points : 3
Points : 3
Citation:
Envoyé par SpaceFrog Voir le message
Il y a un post ou une contribution sur l'ajout d'une balise script dynamiquement en passant par le DOM
Code :
document.createElement('script')
une petite recherche et tu trouveras ton bonheur ...
J'ai pensé à cette méthode qui devrait certainement marcher en effet.
Mais l'objectif est ici de pouvoir évaluer du code provenant d'un serveur via AJAX par exemple, ou saisi par un utilisateur.

Exemple, lors d'un appel AJAX, le serveur m'envoie du HTML contenant également quelques scripts Javascripts, le but est d'exécuter tous ces scripts.

getElementsByTagName fonctionne pour ça sur tous les browsers, mais pas sur IE, il y a peut être quelque chose de différent à faire pour ce browser...
bluelambda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 12h18   #5
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 074
Points : 4 074
Citation:
Envoyé par bluelambda Voir le message
getElementsByTagName fonctionne pour ça sur tous les browsers, mais pas sur IE, il y a peut être quelque chose de différent à faire pour ce browser...
Je n'en ai pas retrouvé la mention expresse dans leur doc, mais IE ou pas IE, il me semble que getElementsByTagName et createElement attendent en principe un nom de balise en forme "canonique" (en maj)

J'ai cherché dans la ref DOM du w3c mais pour le moment je n'ai que ça
Citation:
Envoyé par w3c
From the DOM point of view, The biggest difference between HTML 4.01 (and earlier) and XHTML 1.0 is that XHTML is case sensitive, whereas HTML 4.01 is case insensitive. The HTML case insensitivity is also reflected in the DOM HTML API. For instance, element and attribute names are exposed as all uppercase (for consistency) when used on an HTML document, regardless of the character case used in the markup. Since XHTML is based on XML, in XHTML everything is case sensitive, and element and attribute names must be lowercase in the markup.
Si quelqu'un a plus d'infos, vous gênez pas, ça fait longtemps que ce sujet m'intrigue sans que j'aie eu le temps de m'y pencher plus en détail pour l'instant ^^
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 13h58   #6
Invité de passage
 
Inscription : septembre 2007
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 12
Points : 3
Points : 3
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
bluelambda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 13h59   #7
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 867
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 867
Points : 1 374
Points : 1 374
Citation:
Envoyé par bluelambda Voir le message
J'ai pensé à cette méthode qui devrait certainement marcher en effet.
Mais l'objectif est ici de pouvoir évaluer du code provenant d'un serveur via AJAX par exemple, ou saisi par un utilisateur.

Exemple, lors d'un appel AJAX, le serveur m'envoie du HTML contenant également quelques scripts Javascripts, le but est d'exécuter tous ces scripts.

getElementsByTagName fonctionne pour ça sur tous les browsers, mais pas sur IE, il y a peut être quelque chose de différent à faire pour ce browser...
Raison de plus, si tu comptes éxécuté du code provenant d'un script, il suffit d'ajouter le script à la page dynamiquement et tu ne devras plus t'ennuyer avec ni AJAX ni EVAL.

Code :
1
2
3
var script = document.createElement('script');
script.src = "http://www.tonsite.com/";
document.getElementsByTagName('head')[0].apprendChild(script);
pour du code reçu brut (par exemple par un input utilisateur) tu peux soit utiliser eval directement sans passer par un script ( = 1 ligne de code) sinon reprendre les 3 lignes plus haut en remplacant "script.src = ... " par "script.text = 'mon_code_a_exec';".
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 14h20   #8
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 867
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 867
Points : 1 374
Points : 1 374
après avoir testé ton code (car ça me semblait étrange que IE refuse)

effectivement sans doctype ça fonctionne partout sauf sous IE qui refuse les balises html (donc <script>) dans innerHTML et avec doctype ça fonctionne, oh magie !


Code :
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
26
27
28
29
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> <head>
	<script type="text/javascript" >
	window.onload = function(){
			var element = document.createElement('div');
			element.innerHTML = "<script type='text/javascript'>alert('Test');</s"+"cript>";
 
			document.body.appendChild(element);
 
			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>
	</head>
	<body>zd</body>
 
 
 
 
</html>
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/08/2011, 18h38   #9
Invité de passage
 
Inscription : septembre 2007
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 12
Points : 3
Points : 3
Citation:
Envoyé par Willpower Voir le message
après avoir testé ton code (car ça me semblait étrange que IE refuse)

effectivement sans doctype ça fonctionne partout sauf sous IE qui refuse les balises html (donc <script>) dans innerHTML et avec doctype ça fonctionne, oh magie !
Je n'ai pas pu tester sur IE7 mais sur IE8 ton exemple ne fonctionne pas... je n'ai pas la popup qui apparait.
Sous quel IE l'as-tu testé?
bluelambda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 18h51   #10
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 867
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 867
Points : 1 374
Points : 1 374
Citation:
Envoyé par bluelambda Voir le message
Je n'ai pas pu tester sur IE7 mais sur IE8 ton exemple ne fonctionne pas... je n'ai pas la popup qui apparait.
Sous quel IE l'as-tu testé?
9
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 11h26   #11
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 021
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 021
Points : 45 117
Points : 45 117
Je ne vois pas en qui la méthode dom ne te permettrait pas de coller le texte du script dans la balise créée ?
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 14h03   #12
Invité de passage
 
Inscription : septembre 2007
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 12
Points : 3
Points : 3
Citation:
Envoyé par SpaceFrog Voir le message
Je ne vois pas en qui la méthode dom ne te permettrait pas de coller le texte du script dans la balise créée ?
La méthode DOM est très bien mais ne s'applique pas à ce que je veux faire.
Le texte que je reçoit provient d'un serveur, et est issu d'un appel AJAX, il peut contenir n'importe quel code HTML entrecoupé de scripts Javascripts.
Je dois inclure ce texte dans ma page et exécuter tous les scripts qu'il contient.
Pour récupérer le texte des scripts, j'utilise getElementsByTagName (qui ne fonctionnait pas dans mon exemple).

J'ai résolu mon problème hier soir, j'updaterai ce topic rapidement pour dire ce que j'ai fait.
bluelambda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 18h25   #13
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 021
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 021
Points : 45 117
Points : 45 117
Je n'y vois toujours aucune contrindication ...
Il te suffit de parser le code html js reçu pour en recupérer le "texte" du script et l'insérer à la volé dans une balise script créée par le DOM ...
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 17h53   #14
Invité de passage
 
Inscription : septembre 2007
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 12
Points : 3
Points : 3
OK.
Mais j'ai réussi à corriger mon erreur avec les liens vers l'exemple que j'ai postés plus haut.
Merci
bluelambda est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h35.


 
 
 
 
Partenaires

Hébergement Web