हमें इस प्रकार की समस्या थी, लेकिन आपकी स्थिति से थोड़ा उलट - हम अन्य डोमेन पर साइटों को iframed सामग्री प्रदान कर रहे थे, इसलिए समान मूल नीति भी एक मुद्दा थी। कई घंटों तक गूगल को फँसाने के बाद, हमें अंततः एक (कुछ ..) काम करने योग्य समाधान मिला, जिसे आप अपनी आवश्यकताओं के अनुसार ढाल सकते हैं।
एक ही मूल नीति के चारों ओर एक रास्ता है, लेकिन इसमें iframed सामग्री और फ़्रेमिंग पेज दोनों पर बदलाव की आवश्यकता होती है, इसलिए यदि आप दोनों पक्षों में परिवर्तन का अनुरोध करने की क्षमता नहीं रखते हैं, तो यह विधि आपके लिए बहुत उपयोगी नहीं होगी मुझे डर लग रहा है।
एक ब्राउज़र क्विकर है जो हमें एक ही मूल नीति को स्कर्ट करने की अनुमति देता है - जावास्क्रिप्ट या तो अपने स्वयं के डोमेन पर पृष्ठों के साथ संवाद कर सकता है, या उन पृष्ठों के साथ, जो iframed है, लेकिन कभी भी उन पृष्ठों को शामिल नहीं किया जाता है, जैसे यदि आपके पास है:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
फिर (iframed) और (समान डोमेन) के home.html
साथ संवाद कर सकते हैं ।framed.html
helper.html
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
helper.html
(iframed) को संदेश भेज सकते हैं लेकिन नहीं home.html
(बच्चा माता-पिता के साथ क्रॉस-डोमेन संवाद नहीं कर सकता है)।
यहां कुंजी यह है कि इससे helper.html
संदेश प्राप्त किए जा सकते हैं framed.html
, और साथ संवाद भी कर सकते हैंhome.html
।
इसलिए अनिवार्य रूप से, जब framed.html
लोड होता है, तो यह अपनी खुद की ऊंचाई पर काम करता है, बताता है helper.html
, जो संदेश को पास करता है home.html
, जो तब आइफ्रेम को आकार देता है जिसमें framed.html
बैठता है।
सबसे आसान तरीका है कि हम से संदेश पारित करने के लिए मिल गया framed.html
के लिए helper.html
एक यूआरएल तर्क के माध्यम से किया गया था। ऐसा करने के लिए, निर्दिष्ट के framed.html
साथ एक iframe है src=''
। जब इसकी onload
आग, यह अपनी खुद की ऊंचाई का मूल्यांकन करता है, और इस बिंदु पर iframe का src सेट करता हैhelper.html?height=N
यहाँ एक स्पष्टीकरण है कि फेसबुक कैसे इसे संभालता है, जो ऊपर की खान से थोड़ा साफ हो सकता है!
कोड
में www.foo.com/home.html
, निम्नलिखित जावास्क्रिप्ट कोड की आवश्यकता होती है (इसे किसी भी डोमेन पर .js फ़ाइल से लोड किया जा सकता है, संयोग से ..):
<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>
इन 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>
की सामग्री 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>