Saya perlu melakukan panggilan balik ketika IFRAME telah selesai memuat. Saya tidak punya kendali atas konten di IFRAME, jadi saya tidak bisa memecat panggilan balik dari sana.
IFRAME ini dibuat secara terprogram, dan saya perlu meneruskan datanya sebagai variabel dalam panggilan balik, serta memusnahkan iframe.
Ada ide?
EDIT:
Inilah yang saya miliki sekarang:
function xssRequest(url, callback)
{
var iFrameObj = document.createElement('IFRAME');
iFrameObj.src = url;
document.body.appendChild(iFrameObj);
$(iFrameObj).load(function()
{
document.body.removeChild(iFrameObj);
callback(iFrameObj.innerHTML);
});
}
Panggilan balik ini sebelum iFrame dimuat, sehingga panggilan balik tidak memiliki data yang dikembalikan.
javascript
events
dom
iframe
FlySwat
sumber
sumber
Jawaban:
Pertama, menggunakan nama fungsi xssRequest , sepertinya Anda mencoba permintaan lintas situs - yang jika benar, Anda tidak akan dapat membaca konten iframe.
Di sisi lain, jika URL iframe ada di domain Anda, Anda dapat mengakses isi, tetapi saya menemukan bahwa jika saya menggunakan batas waktu untuk menghapus iframe, callback berfungsi dengan baik:
sumber
$('body', this.contentWindow.document).html()
denganthis.contentDocument.body.outerHTML
load
hilang. Silakan gunakan.on('load', function() { ... })
sebagai gantinya.Saya menggunakan jQuery dan anehnya ini tampaknya memuat karena saya baru saja menguji dan memuat halaman yang berat dan saya tidak mendapatkan peringatan selama beberapa detik sampai saya melihat beban iframe:
Jadi, jika Anda tidak ingin menggunakan jQuery, lihat kode sumbernya dan lihat apakah fungsi ini berbeda dengan elemen iframe DOM, saya akan melihatnya sendiri nanti karena saya tertarik dan memposting di sini. Juga saya hanya menguji di chrome terbaru.
sumber
load
hilang. Silakan gunakan.on('load', function() { ... })
sebagai gantinya.InnerHTML iframe Anda kosong karena tag iframe Anda tidak mengelilingi konten apa pun di dokumen induk. Untuk mendapatkan konten dari halaman yang dirujuk oleh atribut src iframe, Anda perlu mengakses properti contentDocument iframe. Pengecualian akan dilemparkan jika src berasal dari domain yang berbeda. Ini adalah fitur keamanan yang mencegah Anda mengeksekusi JavaScript sewenang-wenang pada halaman orang lain, yang akan membuat kerentanan skrip lintas situs. Berikut adalah beberapa contoh kode yang menggambarkan apa yang saya bicarakan:
Untuk melanjutkan contoh, coba gunakan ini sebagai konten iframe:
sumber
Saya harus melakukan ini dalam kasus di mana dokumen seperti word docs dan pdf sedang di-stream ke iframe dan menemukan solusi yang berfungsi cukup baik. Kuncinya adalah menangani
onreadystatechanged
acara di iframe.Katakanlah nama frame Anda adalah "myIframe". Pertama di suatu tempat di startup kode Anda (saya melakukannya sebaris di mana saja setelah iframe) tambahkan sesuatu seperti ini untuk mendaftarkan event handler:
Saya tidak dapat menggunakan atribut onreadystatechage pada iframe, saya tidak ingat mengapa, tetapi aplikasi harus bekerja di IE 7 dan Safari 3, sehingga mungkin menjadi faktor.
Berikut adalah contoh cara mendapatkan status lengkap:
sumber
Saya ingin menyembunyikan div spinner yang menunggu ketika konten frame saya dimuat penuh pada IE, saya mencoba setiap solusi yang disebutkan dalam Stackoverflow.Com, tetapi dengan tidak ada yang berfungsi seperti yang saya inginkan.
Lalu saya punya ide, bahwa ketika konten bingkai saya dimuat penuh, peristiwa memuat $ (Jendela) mungkin dipecat. Dan itulah yang terjadi. Jadi, saya menulis skrip kecil ini, dan bekerja seperti sulap:
Semoga ini membantu.
sumber
Saya memiliki masalah yang sama seperti Anda. Apa yang saya lakukan adalah saya menggunakan sesuatu yang disebut jQuery. Apa yang kemudian Anda lakukan dalam kode javascript adalah ini:
Tampaknya saat Anda menghapus iFrame sebelum Anda mengambil html darinya. Sekarang, saya melihat masalah dengan itu: p
Semoga ini membantu :).
sumber
Saya memiliki kode serupa di proyek saya yang berfungsi dengan baik. Mengadaptasi kode saya ke fungsi Anda, solusinya bisa sebagai berikut:
Mungkin Anda memiliki innerHTML kosong karena (satu atau kedua penyebab): 1. Anda harus menggunakannya terhadap elemen tubuh 2. Anda telah menghapus iframe dari halaman DOM
sumber
Saya pikir acara muat benar. Apa yang tidak benar adalah cara yang Anda gunakan untuk mengambil kembali konten dari konten iframe dom.
Yang Anda butuhkan adalah html dari halaman yang dimuat di iframe bukan html dari objek iframe.
Yang harus Anda lakukan adalah mengakses dokumen konten
iFrameObj.contentDocument
. Ini mengembalikan dom halaman yang dimuat di dalam iframe, jika berada pada domain yang sama dengan halaman saat ini.Saya akan mengambil kembali konten sebelum menghapus iframe.
Saya sudah menguji di firefox dan opera.
Maka saya pikir Anda dapat mengambil kembali data Anda dengan
$(childDom).html()
atau$(childDom).find('some selector') ...
sumber
Saya memiliki masalah yang sama persis di masa lalu dan satu-satunya cara saya menemukannya untuk memperbaikinya adalah dengan menambahkan callback ke halaman iframe. Tentu saja itu hanya berfungsi ketika Anda memiliki kendali atas konten iframe.
sumber
Menggunakan
onload
attrbute akan menyelesaikan masalah Anda.Berikut ini sebuah contoh.
Apa ini yang kau inginkan?
Klik di sini untuk informasi lebih lanjut.
sumber