2010-10-14 6 views
7

J'ai la logique de travail à ajouter dans mon iframe du parentcomment puis-je charger <script> dans un iframe?

cela fonctionne:

$('#iframe').load(function() { 
    $(this).contents().find('#target').append('this text has been inserted into the iframe by jquery');  
}); 

cela ne

$('#iframe').load(function() { 
    $(this).contents().find('body').append('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>');  
}); 

.lf

Le Le problème est lié aux balises de script insérées qui ne sont pas correctement échappées. La moitié du javascript est visible dans le code HTML, comme la première balise de script a été brusquement terminée.

Répondre

9

Peut-être l'erreur est avec votre chaîne, ne jamais créer une chaîne en javascript avec un littéral </script> dedans.

$('#iframe').load(function() { 
    $(this).contents().find('body').append('<scr' + 'ipt type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></scr' + 'ipt>');  
}); 
+0

Gah! Comment pourrais-je manquer ça ?! J'ai même signalé à quelqu'un d'autre dans une autre question (pas sur SO) * plus tôt aujourd'hui *. J'aimerais pouvoir +2 ça. –

+0

* "... ne jamais créer une chaîne avec ..." * Bien, * la créer * (comme vous l'avez fait) est bien. C'est avoir le littéral là est le problème. –

+0

j'étais presque là dans la question "Le problème est quelque chose à faire avec les tags de script insérés ne pas être échappé correctement" haha, merci les gars – Haroldo

7

Je suis un peu surpris qui ne fonctionne pas[Edit:. Pas plus surpris du tout, voir mtrovo's answer] ... mais voici ce que je fais, qui est la plupart du temps non jQuery par votre commentaire ci-dessous, mais encore assez bref:

var rawframe = document.getElementById('theframe'); 
var framedoc = rawframe.contentDocument; 
if (!framedoc && rawframe.contentWindow) { 
    framedoc = rawframe.contentWindow.document; 
} 
var script = doc.createElement('script'); 
script.type = "text/javascript"; 
script.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"; 
framedoc.body.appendChild(script); 

hors-sujet: Je vraiment ne donnerais pas un iframe (ou quoi que ce soit d'autre) l'ID « iframe ». Cela a l'air de demander des ennuis (IE a des problèmes d'espace de noms, et même si je ne suis pas au courant des noms de balises et des ID confus, je ne serais pas complètement choqué). J'ai utilisé "theframe" ci-dessus à la place.

+0

Merci TJ, c'est à la recherche bonne, Je viens sur le problème que je dois charger jquery dans le iframe , sans utiliser jquery pour le faire. (parce que jquery n'est pas encore chargé dans l'iframe pour faire le chargement)! - Est-ce facile de le faire en pur js? – Haroldo

+0

@Haroldo: Oui. En fait, la réponse était pure JavaScript sauf pour la première ligne. J'ai modifié la première ligne donc c'est du pur JavaScript. Mais vous pouvez utiliser jQuery pour faire le chargement, à condition que jQuery soit chargé dans la fenêtre dans laquelle votre code s'exécute (par opposition à la fenêtre de l'iframe). Mais je pense que mtrovo a montré pourquoi votre code original ne fonctionnait pas, voir [sa réponse] (http://stackoverflow.com/questions/3935398/how-can-i-load-scripts-into- iframe/3935797 # 3935797) pour plus d'informations. –

+0

merci pour toute votre aide TJ – Haroldo

4

Attention: script de chargement de cette manière serait d'exécuter des scripts dans le principal contexte de la fenêtre i.e. .: si vous utilisez la fenêtre de somescript.js, il serait pas la fenêtre iframe!

$('#iframe').load(function() { 
    $(this).contents().find('body').append('<scr' + 'ipt type="text/javascript" src="somescript.js"></scr' + 'ipt>');  
}); 

Pour pouvoir utiliser script inject contexte iframe avec ceci:

function insertScript(doc, target, src, callback) { 
    var s = doc.createElement("script"); 
    s.type = "text/javascript"; 
    if(callback) { 
     if (s.readyState){ //IE 
      s.onreadystatechange = function(){ 
       if (s.readyState == "loaded" || 
        s.readyState == "complete"){ 
        s.onreadystatechange = null; 
        callback(); 
       } 
      }; 
     } else { //Others 
      s.onload = function(){ 
       callback(); 
      }; 
     } 
    } 
    s.src = src; 
    target.appendChild(s);   
} 

var elFrame = document.getElementById('#iframe'); 
$(elFrame).load(function(){ 
    var context = this.contentDocument; 
    var frameHead = context.getElementsByTagName('head').item(0); 
    insertScript(context, frameHead, '/js/somescript.js'); 
} 
+0

l'accès au document de l'iframe a beaucoup de sens. Pouvez-vous parler davantage de ce que fait la fonction '.load'? Je ne vois pas cette syntaxe dans leurs documents – adamdport

+0

. Load (function() {} ...) est le rappel complet pour quand l'iframe est fait de chargement: http://api.jquery.com/load/ –

Questions connexes