Kami memiliki masalah seperti ini, tetapi sedikit berlawanan dengan situasi Anda - kami menyediakan konten yang dibingkai untuk situs di domain lain, sehingga kebijakan asal yang sama juga menjadi masalah. Setelah menghabiskan berjam-jam trawl google, kami akhirnya menemukan (agak ..) solusi yang bisa diterapkan, yang Anda mungkin dapat beradaptasi dengan kebutuhan Anda.
Ada cara di sekitar kebijakan asal yang sama, tetapi membutuhkan perubahan pada konten berbingkai dan halaman pembingkaian, jadi jika Anda tidak memiliki kemampuan untuk meminta perubahan di kedua sisi, metode ini tidak akan sangat berguna bagi Anda, saya takut.
Ada kekhasan browser yang memungkinkan kita untuk merangkai kebijakan asal yang sama - javascript dapat berkomunikasi baik dengan halaman di domainnya sendiri, atau dengan halaman yang telah dibingkai, tetapi tidak pernah halaman di mana ia dibingkai, misalnya jika Anda memiliki:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
kemudian home.html
dapat berkomunikasi dengan framed.html
(iframed) dan helper.html
(domain yang sama).
Communication options for each page:
+-------------------------+-----------+-------------+-------------+
| | home.html | framed.html | helper.html |
+-------------------------+-----------+-------------+-------------+
| www.foo.com/home.html | N/A | YES | YES |
| www.bar.net/framed.html | NO | N/A | YES |
| www.foo.com/helper.html | YES | YES | N/A |
+-------------------------+-----------+-------------+-------------+
framed.html
dapat mengirim pesan ke helper.html
(iframed) tetapi tidak home.html
(anak tidak dapat berkomunikasi lintas domain dengan orang tua).
Kuncinya di sini adalah helper.html
dapat menerima pesan dari framed.html
, dan juga dapat berkomunikasi dengan home.html
.
Jadi pada dasarnya, ketika framed.html
memuat, ia berhasil ketinggiannya sendiri, memberitahu helper.html
, yang meneruskan pesan ke home.html
, yang kemudian dapat mengubah ukuran iframe di mana framed.html
duduk.
Cara paling sederhana yang kami temukan untuk meneruskan pesan dari framed.html
ke helper.html
adalah melalui argumen URL. Untuk melakukan ini, framed.html
memiliki iframe dengan yang src=''
ditentukan. Ketika onload
menyala, ia mengevaluasi ketinggiannya sendiri, dan mengatur src iframe pada saat ini menjadihelper.html?height=N
Ada penjelasan di sini tentang bagaimana facebook menanganinya, yang mungkin sedikit lebih jelas daripada saya di atas!
Kode
Di www.foo.com/home.html
, kode javascript berikut diperlukan (ini dapat diambil dari file .js di domain apa pun, secara tidak sengaja ..):
<script>
// Resize iframe to full height
function resizeIframe(height)
{
// "+60" is a general rule of thumb to allow for differences in
// IE & and FF height reporting, can be adjusted as required..
document.getElementById('frame_name_here').height = parseInt(height)+60;
}
</script>
<iframe id='frame_name_here' src='http://www.bar.net/framed.html'></iframe>
Dalam www.bar.net/framed.html
:
<body onload="iframeResizePipe()">
<iframe id="helpframe" src='' height='0' width='0' frameborder='0'></iframe>
<script type="text/javascript">
function iframeResizePipe()
{
// What's the page height?
var height = document.body.scrollHeight;
// Going to 'pipe' the data to the parent through the helpframe..
var pipe = document.getElementById('helpframe');
// Cachebuster a precaution here to stop browser caching interfering
pipe.src = 'http://www.foo.com/helper.html?height='+height+'&cacheb='+Math.random();
}
</script>
Isi dari www.foo.com/helper.html
:
<html>
<!--
This page is on the same domain as the parent, so can
communicate with it to order the iframe window resizing
to fit the content
-->
<body onload="parentIframeResize()">
<script>
// Tell the parent iframe what height the iframe needs to be
function parentIframeResize()
{
var height = getParam('height');
// This works as our parent's parent is on our domain..
parent.parent.resizeIframe(height);
}
// Helper function, parse param from request string
function getParam( name )
{
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp( regexS );
var results = regex.exec( window.location.href );
if( results == null )
return "";
else
return results[1];
}
</script>
</body>
</html>
parentIframeResize()
, saya menggunakan JQuery untuk menangkap pemuatan laman dan peristiwa pengubahan ukuran:$(document).ready(iframeResizePipe); $(window).resize(iframeResizePipe);
Ini memungkinkan saya untuk mengatur iframewidth="100%"
dan jika lebar jendela berubah untuk membuat pembungkus teks atau sesuatu, yang bingkai batin akan menyadari bahwa itu perlu diubah ukurannya.Jika Anda tidak perlu menangani konten iframe dari domain lain, coba kode ini, itu akan menyelesaikan masalah sepenuhnya dan sederhana:
sumber
document.getElementById(id)
Anda miliki dan menyederhanakan kode.https://developer.mozilla.org/en/DOM/window.postMessage
The iFrame-Resizer perpustakaan menggunakan postMessage untuk menjaga iFrame berukuran konten itu, bersama dengan MutationObserver untuk mendeteksi perubahan konten dan tidak tergantung pada jQuery.
https://github.com/davidjbradshaw/iframe-resizer
jQuery: Kebaikan skrip lintas domain
http://benalman.com/projects/jquery-postmessage-plugin/
Telah demo mengubah ukuran jendela iframe ...
http://benalman.com/code/projects/jquery-postmessage/examples/iframe/
Artikel ini menunjukkan cara menghapus ketergantungan pada jQuery ... Plus memiliki banyak info berguna dan tautan ke solusi lain.
http://www.onlineaspect.com/2010/01/15/backwards-compatible-postmessage/
Contoh barebones ...
http://onlineaspect.com/uploads/postmessage/parent.html
HTML 5 berfungsi draft pada window.postMessage
http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
John Resig di Pesan Lintas Jendela
http://ejohn.org/blog/cross-window-messaging/
sumber
Cara paling sederhana menggunakan jQuery:
sumber
Solusi di http://www.phinesolutions.com/use-jquery-to-adjust-the-iframe-height.html bekerja sangat baik (menggunakan jQuery):
Saya tidak tahu bahwa Anda perlu menambahkan 30 panjangnya ... Saya bekerja untuk saya.
FYI : Jika Anda sudah memiliki atribut "height" di iFrame Anda, ini hanya menambah style = "height: xxx". Ini mungkin bukan yang Anda inginkan.
sumber
mungkin agak terlambat, karena semua jawaban lain lebih tua :-) tapi ... inilah solusi saya. Diuji dalam FF, Chrome, dan Safari 5.0 yang sebenarnya.
css:
javascript:
Semoga ini bisa membantu siapa saja.
sumber
Akhirnya saya menemukan beberapa solusi lain untuk mengirim data ke situs web induk dari menggunakan iframe
window.postMessage(message, targetOrigin);
. Di sini saya menjelaskan Bagaimana saya melakukannya.Situs A = http://foo.com Situs B = http://bar.com
SiteB memuat di dalam situs web siteA
Situs web SiteB memiliki garis ini
atau
Kemudian siteA memiliki kode berikut ini
Jika Anda ingin menambahkan koneksi keamanan, Anda dapat menggunakan ini jika kondisinya dalam
eventer(messageEvent, function (e) {})
Untuk IE
Di dalam IFrame:
Di luar:
sumber
Berikut adalah solusi sederhana menggunakan style sheet yang dihasilkan secara dinamis yang dilayani oleh server yang sama dengan konten iframe. Sederhananya style sheet "tahu" apa yang ada di iframe, dan tahu dimensi yang digunakan untuk mendesain iframe. Ini mengatasi batasan kebijakan asal yang sama.
http://www.8degrees.co.nz/2010/06/09/dynamically-resize-an-iframe-depending-on-its-content/
Jadi kode iframe yang disediakan akan memiliki style sheet yang menyertainya seperti ...
<link href="http://your.site/path/to/css?contents_id=1234&dom_id=iframe_widget" rel="stylesheet" type="text/css" /> <iframe id="iframe_widget" src="http://your.site/path/to/content?content_id=1234" frameborder="0" width="100%" scrolling="no"></iframe>
Ini tidak memerlukan logika sisi server untuk dapat menghitung dimensi konten yang diberikan iframe.
sumber
Jawaban ini hanya berlaku untuk situs web yang menggunakan Bootstrap. Fitur sematan responsif dari Bootstrap melakukan pekerjaan. Ini didasarkan pada lebar (bukan tinggi) konten.
jsfiddle: http://jsfiddle.net/00qggsjj/2/
http://getbootstrap.com/components/#responsive-embed
sumber
Saya menerapkan solusi frame-in-frame ConroyP untuk menggantikan solusi berdasarkan pengaturan document.domain, tetapi ternyata cukup sulit menentukan tinggi konten iframe dengan benar di browser yang berbeda (pengujian dengan FF11, Ch17 dan IE9 sekarang juga) ).
ConroyP menggunakan:
Tapi itu hanya berfungsi pada pemuatan halaman awal. Iframe saya memiliki konten dinamis dan saya perlu mengubah ukuran iframe pada acara tertentu.
Apa yang akhirnya saya lakukan adalah menggunakan properti JS yang berbeda untuk browser yang berbeda.
getBrowserData () adalah fungsi pendeteksi browser "terinspirasi" oleh Ext Core http://docs.sencha.com/core/source/Ext.html#method-Ext-apply
Itu bekerja dengan baik untuk FF dan IE tetapi kemudian ada masalah dengan Chrome. Salah satunya adalah masalah waktu, tampaknya Chrome butuh beberapa saat untuk mengatur / mendeteksi tingginya iframe. Dan kemudian Chrome juga tidak pernah mengembalikan tinggi konten di iframe dengan benar jika iframe lebih tinggi dari konten. Ini tidak akan berfungsi dengan konten dinamis ketika ketinggiannya dikurangi.
Untuk mengatasi ini, saya selalu mengatur iframe ke ketinggian rendah sebelum mendeteksi ketinggian konten dan kemudian mengatur tinggi iframe ke nilai yang benar.
Kode tidak dioptimalkan, ini dari pengujian devel saya :)
Semoga seseorang menemukan ini bermanfaat!
sumber
sumber
Gadget iGoogle harus secara aktif menerapkan pengubahan ukuran, jadi dugaan saya adalah dalam model lintas-domain Anda tidak dapat melakukan ini tanpa konten jarak jauh yang ikut serta dalam beberapa cara. Jika konten Anda dapat mengirim pesan dengan ukuran baru ke halaman kontainer menggunakan teknik komunikasi lintas domain yang khas, maka sisanya mudah.
sumber
Saat Anda ingin memperkecil halaman web agar masuk ke dalam ukuran iframe:
Berikut ini sebuah contoh:
sumber
Inilah pendekatan jQuery yang menambahkan info di json melalui atribut src iframe. Ini demo, ubah ukuran dan gulir jendela ini .. url yang dihasilkan dengan json terlihat seperti ini ... http://fiddle.jshell.net/zippyskippy/RJN3G/show/#{docHeight#124,windowHeight:1019,scrollHeight: 571} #
Berikut kode sumber biola http://jsfiddle.net/zippyskippy/RJN3G/
sumber
dapatkan tinggi konten iframe lalu berikan ke iframe ini
sumber
Bekerja dengan jquery saat dimuat (cross browser):
pada ukuran di halaman responsif:
sumber
Menggunakan jQuery:
parent.html
child.html
sumber
Ini sedikit rumit karena Anda harus tahu kapan halaman iframe telah dimuat, yang mana sulit ketika Anda tidak bisa mengendalikan kontennya. Mungkin untuk menambahkan handler onload ke iframe, tapi saya sudah mencoba ini di masa lalu dan memiliki perilaku yang sangat berbeda di seluruh browser (tidak menebak siapa yang paling menyebalkan ...). Anda mungkin harus menambahkan fungsi ke halaman iframe yang melakukan pengubahan ukuran dan menyuntikkan beberapa skrip ke dalam konten yang mendengarkan memuat acara atau mengubah ukuran acara, yang kemudian memanggil fungsi sebelumnya. Saya sedang berpikir untuk menambahkan fungsi ke halaman karena Anda ingin memastikan keamanannya, tetapi saya tidak tahu betapa mudahnya melakukannya.
sumber
Sesuatu di baris ini saya belive harus bekerja.
Muat ini dengan muatan tubuh Anda pada konten iframe.
sumber
Saya punya solusi mudah dan mengharuskan Anda menentukan lebar dan tinggi tautan, silakan coba (Ini berfungsi dengan sebagian besar peramban):
sumber