2010-10-14 18 views
7

Tengo la lógica de trabajo para anexar en mi iframe del padre¿cómo puedo cargar <script> en un iframe?

esto funciona:

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

esto no

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

dress.LF

El el problema está relacionado con las etiquetas de script insertadas que no se han escapado correctamente. La mitad del javascript se vuelve visible en el html, al igual que la primera etiqueta de script se ha terminado abruptamente.

Respuesta

9

Quizás el error esté en la cadena, nunca cree una cadena en javascript con un literal </script> en él.

$('#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! ¿Cómo podría extrañar eso? Incluso lo señalé a alguien más en otra pregunta (no en SO) * hoy temprano *. Ojalá pudiera +2 esto. –

+0

* "... nunca crees una cadena con ..." * Bueno, * crear * it (como lo has hecho) está bien. Tener el literal allí es el problema. –

+0

estuve cerca de la pregunta "El problema tiene que ver con que las etiquetas de script insertadas no se hayan escapado correctamente" jaja, gracias chicos – Haroldo

7

Estoy un poco sorprendido de que no está funcionando[Editar:. No sorprende ya en absoluto, ver mtrovo's answer] ... pero aquí es lo que hago, que es sobre todo no jQuery por su comentario a continuación, pero todavía bastante 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); 

fuera de tema: me realmente no daría un iframe (o cualquier otra cosa) el ID "iframe". Parece que está causando problemas (IE tiene problemas con el espacio de nombres, y aunque no me consta que confunda los nombres de las etiquetas y los ID, no me sorprendería por completo). He usado "theframe" arriba en su lugar.

+0

Gracias TJ, esto se ve bien, acabo de venir en todo el problema que tengo que cargar jQuery en el iframe , sin usar jquery para hacerlo. (¡porque jquery aún no está cargado en el iframe para realizar la carga)! - ¿Es fácil hacer esto en js puro? – Haroldo

+0

@Haroldo: Sí. De hecho, la respuesta fue JavaScript puro, excepto por la primera línea. He modificado la primera línea, así que es JavaScript puro. Pero puede usar jQuery para cargar, siempre que jQuery se cargue en la ventana en la que se está ejecutando su código (a diferencia de la ventana del iframe). Pero creo que mtrovo ha señalado por qué su código original no funcionaba, vea [su respuesta] (http://stackoverflow.com/questions/3935398/how-can-i-load-scripts-into-an- iframe/3935797 # 3935797) para más. –

+0

gracias por toda su ayuda TJ – Haroldo

4

Advertencia: La escritura de la carga de esta manera haría que las secuencias de comandos se ejecutan en el contexto ventana principal es decir .: si se utiliza la ventana de somescript.js, sería ventana NO de marco flotante!

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

Para poder utilizar la escritura inyectar contexto iframe con esto:

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

, tener acceso al documento del iframe tiene mucho sentido. ¿Puedes hablar más sobre lo que está haciendo la función '.load'? No veo esa sintaxis en sus documentos – adamdport

+0

.load (function() {} ...) es la devolución de llamada completa para cuando el iframe termine de cargarse: http://api.jquery.com/load/ –

Cuestiones relacionadas