Respostas:
Com domínios diferentes, não é possível chamar métodos ou acessar o documento de conteúdo do iframe diretamente.
Você precisa usar mensagens entre documentos .
Por exemplo, na janela superior:
myIframe.contentWindow.postMessage('hello', '*');
e no iframe:
window.onmessage = function(e){
if (e.data == 'hello') {
alert('It works!');
}
};
Se você estiver postando uma mensagem do iframe na janela pai
window.top.postMessage('hello', '*')
window.onmesage = function()...
. No iframe:window.top.postMessage('hello', '*')
file://C:/Windows/system32/whatever
em uma página da Web e apontá-lo diretamente para a pasta do sistema do usuário. Atualmente, os navegadores ignoram cliques em links como esse. Execute um servidor da web e acesse seu código por meio disso e você verá os erros aparecerem.
window.frames[index]
para obter um quadro filho ( <iframe>, <object>, <frame>
), equivalente a getElementsByTagName("iframe")[index].contentWindow
. Para obter objeto de janela pai de IFrames, é melhor usar window.parent
, como window.top
representa o mais alto Parent Janela
Deve estar aqui, porque resposta aceita de 2012
Em 2018 e navegadores modernos, você pode enviar um evento personalizado do iframe para a janela pai.
iframe:
var data = { foo: 'bar' }
var event = new CustomEvent('myCustomEvent', { detail: data })
window.parent.document.dispatchEvent(event)
pai:
window.document.addEventListener('myCustomEvent', handleEvent, false)
function handleEvent(e) {
console.log(e.detail) // outputs: {foo: 'bar'}
}
PS: Claro, você pode enviar eventos na direção oposta da mesma maneira.
document.querySelector('#iframe_id').contentDocument.dispatchEvent(event)
dispatchEvent
é suportado em todos os principais navegadores. O IE9 foi a primeira versão em que entrou, então a maioria dos sistemas operacionais agora trabalha com ele. caniuse.com/#search=dispatchEvent
Esta biblioteca suporta navegadores HTML5 postMessage e herdados com redimensionamento + hash https://github.com/ternarylabs/porthole
Edit: Agora em 2014, o uso do IE6 / 7 é bastante baixo, o IE8 e, acima de tudo, o suporte, postMessage
então agora sugiro apenas usá-lo.
https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage
a window.top
propriedade deve poder fornecer o que você precisa.
Por exemplo
alert(top.location.href)
Consulte http://cross-browser.com/talk/inter-frame_comm.html
Você também pode usar
postMessage(message, '*')
;
Use event.source.window.postMessage
para enviar de volta ao remetente.
Do Iframe
window.top.postMessage('I am Iframe', '*')
window.onmessage = (event) => {
if (event.data === 'GOT_YOU_IFRAME') {
console.log('Parent received successfully.')
}
}
Então, dos pais, diga de volta.
window.onmessage = (event) => {
event.source.window.postMessage('GOT_YOU_IFRAME', '*')
}