Odpowiedzi:
W przypadku różnych domen nie można wywoływać metod ani uzyskiwać bezpośredniego dostępu do dokumentu treści iframe.
Musisz używać przesyłania wiadomości między dokumentami .
Na przykład w górnym oknie:
myIframe.contentWindow.postMessage('hello', '*');
oraz w ramce iframe:
window.onmessage = function(e){
if (e.data == 'hello') {
alert('It works!');
}
};
Jeśli publikujesz wiadomość z elementu iframe w oknie nadrzędnym
window.top.postMessage('hello', '*')
window.onmesage = function()...
. W window.top.postMessage('hello', '*')
file://C:/Windows/system32/whatever
na stronie internetowej i skierować go bezpośrednio do folderu systemowego użytkownika. Obecnie przeglądarki najczęściej ignorują kliknięcia takich linków. Uruchom serwer WWW i uzyskaj dostęp do swojego kodu, a zobaczysz, że błędy znikają.
window.frames[index]
aby uzyskać child frame ( <iframe>, <object>, <frame>
), równoważne z getElementsByTagName("iframe")[index].contentWindow
. Aby uzyskać obiekt okna nadrzędnego z ramek IFrame, lepiej jest użyć window.parent
, ponieważ window.top
reprezentuje najwyższe okno nadrzędne
Musi tu być, ponieważ zaakceptowano odpowiedź z 2012 roku
W 2018 roku i we współczesnych przeglądarkach możesz wysłać niestandardowe zdarzenie z iframe do okna nadrzędnego.
iframe:
var data = { foo: 'bar' }
var event = new CustomEvent('myCustomEvent', { detail: data })
window.parent.document.dispatchEvent(event)
rodzic:
window.document.addEventListener('myCustomEvent', handleEvent, false)
function handleEvent(e) {
console.log(e.detail) // outputs: {foo: 'bar'}
}
PS: Oczywiście możesz wysyłać zdarzenia w przeciwnym kierunku w ten sam sposób.
document.querySelector('#iframe_id').contentDocument.dispatchEvent(event)
dispatchEvent
jest obsługiwany we wszystkich głównych przeglądarkach. IE9 była pierwszą wersją, w której się pojawiła, więc większość systemów operacyjnych teraz z nią współpracuje. caniuse.com/#search=dispatchEvent
Ta biblioteka obsługuje HTML5 postMessage i starsze przeglądarki z funkcją resize + hash https://github.com/ternarylabs/porthole
Edycja: Teraz w 2014 r. Zużycie IE6 / 7 jest dość niskie, IE8 i przede wszystkim obsługa, postMessage
więc teraz sugeruję, aby po prostu z niego korzystać.
https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage
window.top
nieruchomość powinna być w stanie dać to, czego potrzebujesz.
Na przykład
alert(top.location.href)
Możesz także użyć
postMessage(message, '*')
;
Użyj, event.source.window.postMessage
aby odesłać z powrotem do nadawcy.
Z iframe
window.top.postMessage('I am Iframe', '*')
window.onmessage = (event) => {
if (event.data === 'GOT_YOU_IFRAME') {
console.log('Parent received successfully.')
}
}
Następnie od rodzica odpowiedz.
window.onmessage = (event) => {
event.source.window.postMessage('GOT_YOU_IFRAME', '*')
}