2009-07-01 19 views
10

Je suis en train de faire ce qui suit (j'utilise la bibliothèque prototype):Pourquoi ne puis-je ajouter une chaîne contenant une balise de script à innerHTML dans IE

var div = document.createElement('div'); 
div.innerHTML = '<script src="somescript.js"></script>'; 
$('banner').insert(div); 

Dans IE, div.innerHTML La propriété est toujours égale à "" après avoir défini la propriété sur la deuxième ligne.

Cet extrait fait partie d'une fonction qui remplace document.write() dans un script fournisseur externe, c'est pourquoi je le fais de cette façon plutôt que de créer un élément de script et de l'ajouter directement à l'élément div.

Toute aide serait vraiment appréciée, cela me donne des cheveux gris!

+0

(+1) bonne question. –

Répondre

6

Vous pouvez essayer de faire quelque chose comme ceci:

function loadScript(src) { 
     var script = document.createElement("script"); 
     script.type = "text/javascript"; 
     document.getElementsByTagName("head")[0].appendChild(script); 
     script.src = src; 
} 

ou faire

.. 
div.innerHTML = "<script src=\"somescript.js\"></script>"; 
.. 
+4

+1 pour la première option. –

+0

Je préfère aussi le 1er. C'est beaucoup plus propre et réutilisable. Ils 2e était juste une suggestion "essayer" s'il ne veut pas utiliser la 1ère approche :) – Juri

+0

J'ai un vague sentiment que le problème de l'OP est en fait une caractéristique de sécurité au travail et votre première réponse ici est le classique (et solution non bloquante!). – annakata

1

Avez-vous essayé d'ajouter JS en ligne au lieu de charger un fichier .js? Je l'ai fait dans le passé et ça a bien fonctionné pour moi. Je ne sais pas si cela fonctionnerait toujours avec les derniers navigateurs/sécurité.

HTH.

7

Votre balise de script gère probablement être interprétée de manière autonome. Essayez:

div.innerHTML = '<scr' + 'ipt src="somescript.js"></scr' + 'ipt>'; 
+0

Ceci est un problème commun avec l'utilisation de balises de script dans le code et très probablement le problème ici – jcoder

+0

Ceci est intéressant. Peux-tu élaborer? – bitsprint

+0

+1 Cela me semble être le problème. – RedFilter

11

Celui-ci m'avait bloqué pour un peu aussi. Il s'avère que IE n'autorise pas l'insertion de JS directement via innerHTML sauf si vous incluez la propriété 'defer' (voir le deuxième lien ci-dessous). Cette propriété est unique à IE et permet apparemment à IE de différer l'exécution de tout JS jusqu'à ce que l'autre balisage ait été chargé. Un avertissement, cependant ... si vous incluez deux balises de script (comme je l'ai fait), il n'y a aucune garantie que l'on va s'exécuter en premier, car les scripts semblent être chargés de manière asynchrone. Cela ne devrait poser problème que si vos scripts sont dépendants les uns des autres (comme les miens). Il existe également une mise en garde supplémentaire ... vous devez insérer un balisage non-script en même temps que vous insérez le script. J'ai été incapable d'insérer les balises de script par eux-mêmes, avec ou sans la propriété 'defer'. Enfin, les balises de script doivent être placées après l'insertion de toutes les balises non-script. Sinon, les balises de script sont supprimées du code HTML inséré.

Voici quelques références:

MS innerHTML Référence:

http://msdn.microsoft.com/en-us/library/ms533897%28v=vs.85%29.aspx

MS Différer Propriété Référence:

http://msdn.microsoft.com/en-us/library/ms533719%28v=vs.85%29.aspx

Exemple de script d'insertion par code (oui, cela fonctionne réellement):

http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/insertScript_2.htm

Mon Code d'essai:

// I downloaded the MS example file above and tweaked their script a bit, 
// resulting in this. Using the proper approach to the defer property 
// (namely: defer="defer") did not provide me with consistent results, so 
// sticking with 'DEFER' may be necessary. 
// Note: Try moving the 'sHTML' variable to the end of the script string. 
function insertScript2() 
{ 
    var sHTML="<input type=button onclick=" + "go2()" + " value='Click Me'><BR>"; 
    var sScript = sHTML + "<SCRIPT DEFER type='text/javascript'> function go2(){ alert('Hello from inserted script.') } </SCRIPT" + ">"; 
    ScriptDiv.innerHTML = sScript; 
} 
Questions connexes