Jawaban:
Dengan domain yang berbeda, tidak mungkin untuk memanggil metode atau mengakses dokumen konten iframe secara langsung.
Anda harus menggunakan pesan lintas dokumen .
Misalnya di jendela atas:
myIframe.contentWindow.postMessage('hello', '*');
dan di iframe:
window.onmessage = function(e){
if (e.data == 'hello') {
alert('It works!');
}
};
Jika Anda memposting pesan dari iframe ke jendela induk
window.top.postMessage('hello', '*')
window.onmesage = function()...
. Di iframe:window.top.postMessage('hello', '*')
file://C:/Windows/system32/whatever
di halaman web dan membuatnya langsung ke folder sistem pengguna. Saat ini sebagian besar browser mengabaikan klik pada tautan seperti itu. Jalankan server web dan akses kode Anda melalui itu dan Anda akan melihat kesalahan muncul.
window.frames[index]
untuk mendapatkan bingkai anak ( <iframe>, <object>, <frame>
), setara dengan getElementsByTagName("iframe")[index].contentWindow
. Untuk mendapatkan Objek Jendela Induk dari IFrames, lebih baik menggunakan window.parent
, karena window.top
mewakili Jendela Paling Banyak Induk
Itu harus di sini, karena jawaban yang diterima dari 2012
Pada 2018 dan browser modern, Anda dapat mengirim acara khusus dari iframe ke jendela induk.
iframe:
var data = { foo: 'bar' }
var event = new CustomEvent('myCustomEvent', { detail: data })
window.parent.document.dispatchEvent(event)
induk:
window.document.addEventListener('myCustomEvent', handleEvent, false)
function handleEvent(e) {
console.log(e.detail) // outputs: {foo: 'bar'}
}
PS: Tentu saja, Anda bisa mengirim acara dengan arah yang berlawanan dengan cara yang sama.
document.querySelector('#iframe_id').contentDocument.dispatchEvent(event)
dispatchEvent
didukung di semua browser utama. IE9 adalah versi pertama yang masuk, jadi sebagian besar OS sekarang bekerja dengannya. caniuse.com/#search=dispatchEvent
Perpustakaan ini mendukung HTML5 postMessage dan browser lama dengan mengubah ukuran + hash https://github.com/ternarylabs/porthole
Sunting: Sekarang pada tahun 2014, penggunaan IE6 / 7 cukup rendah, IE8 dan di atas semua dukungan postMessage
jadi saya sekarang menyarankan untuk hanya menggunakan itu.
https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage
yang window.top
properti harus dapat memberikan apa yang Anda butuhkan.
Misalnya
alert(top.location.href)
Anda juga bisa menggunakan
postMessage(message, '*')
;
Gunakan event.source.window.postMessage
untuk mengirim kembali ke pengirim.
Dari Iframe
window.top.postMessage('I am Iframe', '*')
window.onmessage = (event) => {
if (event.data === 'GOT_YOU_IFRAME') {
console.log('Parent received successfully.')
}
}
Kemudian dari orangtua katakan kembali.
window.onmessage = (event) => {
event.source.window.postMessage('GOT_YOU_IFRAME', '*')
}