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 iframey 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/whateveruna 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.toprepresenta 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)
dispatchEventes 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, postMessagepor lo que ahora sugiero usarlo.
https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage
La window.toppropiedad debe poder darte lo que necesitas.
P.ej
alert(top.location.href)
Úselo event.source.window.postMessagepara 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, '*');