2010-10-14 18 views
7

Ho la logica di funzionamento per aggiungere nel mio iframe dal genitorecome posso caricare <script> in un iframe?

questo funziona:

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

questo non lo fa

$('#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

Il il problema è qualcosa a che fare con i tag script inseriti che non vengono sottoposti correttamente a escape. La metà del javascript è visibile in html, come il primo tag script è stato interrotto bruscamente.

risposta

9

Forse l'errore è con la stringa, non creare mai una stringa in javascript con un valore letterale </script> in esso.

$('#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! Come potrei mancarlo ?! L'ho persino fatto notare a qualcun altro in un'altra domanda (non su SO) * prima di oggi *. Vorrei poter +2 questo. –

+0

* "... non creare mai una stringa con ..." * Bene, * la creazione * di essa (come hai fatto) va bene. Sta avendo quello letterale lì che è il problema. –

+0

ero quasi lì nella domanda "Il problema è qualcosa a che fare con i tag script inseriti che non vengono scappati correttamente" haha, grazie ragazzi – Haroldo

7

Sono un po 'sorpreso che non funziona[Edit:. Non è più affatto sorpreso, vedere mtrovo's answer] ... ma ecco quello che faccio, che è in gran parte non jQuery secondo il vostro commento qui sotto, ma ancora piuttosto breve:

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); 

Off-topic: ho davvero non darei un iframe (o qualsiasi altra cosa) l'ID "iframe". Sembra proprio che stia chiedendo dei guai (IE ha dei problemi nello spazio dei nomi, e anche se non ne sono a conoscenza confondendo nomi di tag e ID, non ne sarei completamente scioccato). Ho usato "theframe" sopra invece.

+0

Grazie TJ, questo è un bell'aspetto, Sono appena tutto il problema che ho bisogno di caricare jQuery in iframe , senza usare jquery per farlo. (perché jquery non è ancora stato caricato nell'iframe per eseguire il caricamento)! - è facile farlo in puro js? – Haroldo

+0

@ Haroldo: Sì. In realtà, la risposta era pura JavaScript tranne che per la prima riga. Ho modificato la prima riga in modo che sia puro JavaScript. Ma puoi usare jQuery per eseguire il caricamento, a condizione che jQuery venga caricato nella finestra in cui viene eseguito il codice (al contrario della finestra dell'iframe). Ma penso che mtrovo abbia indicato perché il tuo codice originale non funzionava, vedi [la sua risposta] (http://stackoverflow.com/questions/3935398/how-can-i-load-scripts-into-an- iframe/3935797 # 3935797) per altro. –

+0

grazie per tutto il tuo aiuto TJ – Haroldo

4

Attenzione: lo script di carico in questo modo renderebbe gli script in esecuzione nel contesto finestra principale cioè .: se si utilizza la finestra da somescript.js, sarebbe finestra non di iframe!

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

Per poter utilizzare lo script iniettare contesto iframe con questo:

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

accedere al documento dell'iframe ha molto senso. Puoi parlare di più su cosa sta facendo la funzione '.load'? Non vedo la sintassi nei loro documenti – adamdport

+0

.load (function() {} ...) è il callback completo per quando l'iframe ha finito di caricare: http://api.jquery.com/load/ –

Problemi correlati