El sitio web en el iframe no está ubicado en el mismo dominio , pero ambos son míos, y me gustaría comunicarme entre el iframe
y el sitio principal. ¿Es posible?
Respuestas:
Con diferentes dominios, no es posible llamar a métodos o acceder directamente al documento de contenido del iframe.
Tienes que utilizar la mensajería entre documentos .
Por ejemplo en la ventana superior:
myIframe.contentWindow.postMessage('hello', '*');
y en el iframe:
window.onmessage = function(e){
if (e.data == 'hello') {
alert('It works!');
}
};
Si está publicando un mensaje desde iframe a la ventana principal
window.top.postMessage('hello', '*')
window.onmesage = function()...
. En el iframe:window.top.postMessage('hello', '*')
file://C:/Windows/system32/whatever
una página web y hacer que apuntara directamente a la carpeta del sistema del usuario. En la actualidad, los navegadores ignoran en su mayoría los clics en enlaces como ese. Ejecute un servidor web y acceda a su código a través de él y verá que los errores desaparecen.
window.frames[index]
para obtener child frame ( <iframe>, <object>, <frame>
), equivalente a getElementsByTagName("iframe")[index].contentWindow
. Para obtener el objeto de la ventana principal de IFrames, es mejor usarlo window.parent
, ya que window.top
representa la ventana principal más importante
Debe estar aquí, porque respuesta aceptada de 2012
En 2018 y en los navegadores modernos, puede enviar un evento personalizado desde iframe a la ventana principal.
iframe:
var data = { foo: 'bar' }
var event = new CustomEvent('myCustomEvent', { detail: data })
window.parent.document.dispatchEvent(event)
padre:
window.document.addEventListener('myCustomEvent', handleEvent, false)
function handleEvent(e) {
console.log(e.detail) // outputs: {foo: 'bar'}
}
PD: Por supuesto, puede enviar eventos en la misma dirección opuesta.
document.querySelector('#iframe_id').contentDocument.dispatchEvent(event)
dispatchEvent
es compatible con todos los principales navegadores. IE9 fue la primera versión en la que vino, por lo que la mayoría de los sistemas operativos ahora funcionan con él. caniuse.com/#search=dispatchEvent
Esta biblioteca es compatible con HTML5 postMessage y navegadores heredados con cambio de tamaño + hash https://github.com/ternarylabs/porthole
Editar: Ahora, en 2014, el uso de IE6 / 7 es bastante bajo, IE8 y, sobre todo, el soporte, postMessage
por lo que ahora sugiero usarlo.
https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage
La window.top
propiedad debe poder darte lo que necesitas.
P.ej
alert(top.location.href)
Úselo event.source.window.postMessage
para enviar de vuelta al remitente.
Desde Iframe
window.top.postMessage('I am Iframe', '*')
window.onmessage = (event) => {
if (event.data === 'GOT_YOU_IFRAME') {
console.log('Parent received successfully.')
}
}
Luego, de los padres, responda.
window.onmessage = (event) => {
event.source.window.postMessage('GOT_YOU_IFRAME', '*')
}
También puedes usar
postMessage(message, '*')
;