2010-04-19 1 views
1

J'ai une variable javascript contenant du HTML échappé. Il peut y avoir des balises de script à l'intérieur du HTML, comme ceci:Problème d'injection de code HTML et de script Javascript dans IE

var valueToInsert = "%3Cscript%20type%3D%22text/javascript%22%3Ealert%28%27test%27%29%3B%3C/script%3E%0A%3Cscript%20type%3D%22text/javascript%22%20src%3D%22http%3A//devserver/testinclude.js%22%3E%3C/script%3E%0A%3Cimg%20src%3D%22http%3A//www.footballpictures.net/data/media/131/manchester_united_logo.jpg%22%20/%3E" 

Je veux ajouter ceci au DOM, et obtenir toutes les javascript tir comme prévu. En ce moment je suis en utilisant cette approche:

var div = document.createElement("div"); 
div.innerHTML = unescape(valueToInsert); 
document.body.appendChild(div); 

Dans IE, au moment où je mis div.innerHTML - sont supprimés tous les balises de script.

Si j'utilise jQuery pour et faire ceci:

$(document.body).append(valueToInsert) 

Tout fonctionne très bien. La mauvaise chose est, que je ne peux pas utiliser jQuery car ce code sera ajouté aux sites que je ne suis pas en contrôle de l'utilisation de certains scripts "déjà mis en œuvre".

Est-ce que quelqu'un a un truc? Si jQuery peut le faire, cela doit-il être possible?

J'ai eu un autre problème dans Opera. J'ai changé le script d'injection pour être ceci: (ne fonctionne toujours pas dans IE)

var div = document.createElement("div"); 
    div.innerHTML = unescape(valueToInsert); 
    var a = new Array(); 

    for (var i = 0; i < div.childNodes.length; i++) 
     a.push(div.childNodes[i]); 

    for (var i = 0; i < a.length; i++) 
    { 
     if (a[i].nodeName == "SCRIPT" && a[i].getAttribute("src") != null && a[i].getAttribute("src") != "" && typeof (a[i].getAttribute("src")) != "undefined") 
     { 
      var scriptTag = document.createElement("script"); 
      scriptTag.src = a[i].getAttribute("src"); 
      scriptTag.type = "text/javascript"; 
      document.body.appendChild(scriptTag); 
     } 
     else if (a[i].nodeName == "SCRIPT") 
     { 
      eval(a[i].innerHTML); 
     } 
     else 
     { 
      document.body.appendChild(a[i]); 
     } 
    } 

Répondre

0

Je pense que vous devez utiliser document.write à la place.

+1

Impossible de faire cela, car il efface la page lorsqu'il est exécuté après le rendu de la page. – MartinHN

3

Après avoir analysé ce qui fait jQuery, j'ai vu qu'ils PREPEND un petit texte factice et éradique encore:

var div = document.createElement("div"); 
div.innerHTML = "removeMe" + unescape(valueToInsert); 
div.removeChild(div.childNodes[0]); 
document.body.appendChild(div); 

et qui fonctionne parfaitement dans FF, IE, Chrome, Opera et Safari.

Questions connexes