Saya mencoba membuat iframe dari JavaScript dan mengisinya dengan HTML sewenang-wenang, seperti:
var html = '<body>Foo</body>';
var iframe = document.createElement('iframe');
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
Saya berharap iframe
untuk kemudian berisi jendela dan dokumen yang valid. Namun, ini bukan masalahnya:
> console.log (iframe.contentWindow);
batal
Cobalah sendiri: http://jsfiddle.net/TrevorBurnham/9k9Pe/
Apa yang saya abaikan?
javascript
iframe
Trevor Burnham
sumber
sumber
Jawaban:
Pengaturan yang
src
baru dibuatiframe
dalam javascript tidak memicu pengurai HTML sampai elemen dimasukkan ke dalam dokumen. HTML kemudian diperbarui dan parser HTML akan dipanggil dan memproses atribut seperti yang diharapkan.http://jsfiddle.net/9k9Pe/2/
Juga ini menjawab pertanyaan Anda, penting untuk dicatat bahwa pendekatan ini memiliki masalah kompatibilitas dengan beberapa browser, silakan lihat jawaban @mschr untuk solusi lintas-browser.
sumber
encodeURI(...)
tidak menyandikan semua karakter, jadi jika HTML Anda memiliki karakter khusus seperti#
, ini akan rusak.encodeURIComponent(...)
mengkodekan karakter ini. Lihat jawaban iniMeskipun demikian
src = encodeURI
harus bekerja, saya akan pergi dengan cara yang berbeda:Karena ini tidak memiliki pembatasan x-domain dan sepenuhnya dilakukan melalui
iframe
pegangan, Anda dapat mengakses dan memanipulasi konten frame nanti. Yang perlu Anda pastikan adalah, bahwa konten telah dirender, yang akan (tergantung pada jenis browser) mulai selama / setelah perintah .write dikeluarkan - tetapi tidak dilakukan saatclose()
dipanggil.Cara yang kompatibel 100% dalam melakukan panggilan balik bisa menjadi pendekatan ini:
Namun, iframes memiliki acara onload. Berikut adalah pendekatan untuk mengakses html dalam sebagai DOM (js):
sumber
srcdoc
properti . Apakah ada kelemahan daridocument.write
pendekatan ini?document.body.appendChild(iframe)
diperlukan untuk ini berfungsi.Terima kasih atas pertanyaan Anda yang hebat, ini telah membuat saya keluar beberapa kali. Saat menggunakan sumber dataURUR HTML, saya menemukan bahwa saya harus mendefinisikan dokumen HTML lengkap.
Lihat di bawah ini contoh yang dimodifikasi.
perhatikan konten html yang dibungkus dengan
<html>
tag daniframe.src
string.Elemen iframe perlu ditambahkan ke pohon DOM untuk diuraikan.
Anda tidak akan dapat memeriksa
iframe.contentDocument
kecuali Anda beradadisable-web-security
di browser Anda. Anda akan mendapat pesansumber
Ada alternatif untuk membuat iframe yang isinya adalah string HTML: atribut srcdoc . Ini tidak didukung di browser lama (kepala di antaranya: Internet Explorer, dan mungkin Safari ?), Tetapi ada polyfill untuk perilaku ini, yang dapat Anda masukkan dalam komentar bersyarat untuk IE, atau gunakan sesuatu seperti has.js untuk bersyarat malas muat
sumber
Saya tahu ini adalah pertanyaan lama tapi saya pikir saya akan memberikan contoh menggunakan
srcdoc
atribut karena sekarang ini banyak didukung dan pertanyaan ini sering dilihat.Menggunakan
srcdoc
atribut, Anda dapat memberikan HTML inline untuk disematkan. Itu menimpasrc
atribut jika didukung. Browser akan kembali kesrc
atribut jika tidak didukung.Saya juga akan merekomendasikan menggunakan
sandbox
atribut untuk menerapkan batasan ekstra pada konten dalam bingkai. Ini sangat penting jika HTML itu bukan milik Anda.Jika Anda perlu mendukung browser lama, Anda dapat memeriksa
srcdoc
dukungan dan mundur ke salah satu metode lain dari jawaban lain.sumber
Pendekatan URL hanya akan berfungsi untuk fragmen HTML kecil. Pendekatan yang lebih solid adalah menghasilkan URL objek dari gumpalan dan menggunakannya sebagai sumber iframe dinamis.
sumber
Melakukan hal ini
getIframeWindow didefinisikan di sini
sumber