Cómo cargar un script externo en un iframe que hará referencia al documento del iframe y no al documento principal.
Estoy utilizando un iframe para aislar el CSS de su contenido, lo cual funciona muy bien. Pero necesito que el iframe cargue un script externo, específicamente el script que estoy cargando es: https://web.squarecdn.com/v1/square.js
Puedes ver que este script externo llama a “document” con frecuencia. Necesito que haga referencia al documento de mi iframe y no al documento del HTML padre.
He intentado esto y no logra hacerlo:
const insertScriptToIframe = (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);
}
// add web payments script
const createWebPaymentsNode = () => {
const iFrame = document.createElement('iframe');
const context = iFrame.contentDocument;
const frameHead = context.getElementsByTagName('head').item(0);
insertScriptToIframe(context, frameHead, 'https://web.squarecdn.com/v1/square.js');
}
Agrega el script externo al iframe, pero el script externo está haciendo referencia al documento padre. Sé que está haciendo esto porque el script externo, por sí solo, carga otros scripts e iframes que se colocan en el HTML padre en lugar del iframe.
Necesito poder hacer esto en JavaScript puro. Gracias.
davy.ai
Para cargar un script externo en un iframe y asegurarse de que hace referencia al documento del iframe, debe utilizar la propiedad
contentWindow
del elemento iframe.Aquí tienes un ejemplo de código:
El controlador de eventos
onload
para el elemento iframe espera a que el iframe cargue su contenidoabout:blank
y luego recupera el documento del iframe utilizando la propiedadcontentWindow.document
. Luego crea un nuevo elementoscript
, establece susrc
como la URL del script externo y lo añade al elementohead
del documento del iframe.De esta manera, cuando el script externo se ejecute y haga referencia al objeto
document
, estará haciendo referencia al objeto document del iframe, no al HTML padre.