क्रॉस-डोमेन iframe आकार


85

मैं किसी अन्य डोमेन से आइफ्रेम का आकार कैसे बदल सकता हूं

-संपादित

कुछ समाधानों के लिए नीचे स्क्रॉल करें .. या यह नहीं पढ़ें कि यह कैसे करें: डी

कोड हैकिंग के कई घंटों के बाद - निष्कर्ष यह है कि iframe के अंदर कुछ भी सुलभ नहीं है, यहां तक ​​कि स्क्रॉलबार्स जो मेरे डोमेन पर प्रस्तुत करते हैं। मैंने बिना किसी लाभ के कई तकनीकों की कोशिश की है।

आपको समय बचाने के लिए इस मार्ग से नीचे जाने की ज़रूरत नहीं है बस क्रॉस डोमेन संचार के लिए sendMessages का उपयोग करें। HTML <5 के लिए प्लग इन हैं जो मैं उपयोग करता हूं- एक अच्छे उदाहरण के लिए नीचे जाएं :)


पिछले कुछ दिनों से मैं एक iframe को एक साइट में एकीकृत करने की कोशिश कर रहा हूं। यह एक अल्पकालिक समाधान है, जबकि दूसरी तरफ विकसित होता है और एपीआई (महीनों लग सकते हैं ...) और क्योंकि यह अल्पावधि समाधान है जैसा कि हमने किया है कि वे आसानी से उपयोग करना चाहते हैं- मेरे पास दूसरे डोमेन तक पहुंच है, लेकिन इसके लिए पर्याप्त कठिन है p3p हेडर जोड़ें जैसा कि यह है .....

3 आइफ्रेम

निकटतम समाधान मैंने पाया 3 iframes- लेकिन यह क्रोम और सफारी के मानसिक जाता है इसलिए मैं इसका उपयोग नहीं कर सकता।

क्रोम में खुला

http://css-tricks.com/examples/iFrameResize/crossdomain.php#frameId=frame-one&height=1179

स्क्रॉलबार को मापें

मुझे एक और पोस्ट मिला कि कैसे स्क्रॉल करने के लिए फार्म का उपयोग करने और आकार बदलने के लिए .. सिद्धांत में यह अच्छी तरह से काम करता है, लेकिन मैं iframes स्क्रॉल ऊंचाई का उपयोग करके इसे ठीक से लागू नहीं कर सका।

document.body.scrollHeight

यह मोटे तौर पर निकायों की ऊंचाई का उपयोग करता है (इन गुणों तक नहीं पहुंच सकता है 100% क्लाइंट प्रदर्शन कैनवेज़ पर आधारित है और एक्स-डोमेन दस्तावेज़ ऊंचाई नहीं है)

मैं iframes ऊंचाई पाने के लिए jquery का उपयोग करने की कोशिश की

$('#frameId').Height()

$('#frameId').clientHeight

$('#frameId').scrollHeight

क्रोम और यानी में अलग-अलग मान लौटाएँ या बिल्कुल भी समझ में न आए। समस्या यह है कि फ्रेम के अंदर सब कुछ से इनकार कर दिया है - यहां तक ​​कि स्क्रॉलबार ...

गणना की गई शैलियाँ

लेकिन अगर मैं iframe के क्रोम में निरीक्षण और तत्व करता हूं तो यह मुझे धुंधला दिखाई देता है, iframe के अंदर दस्तावेज़ आयाम दिखाता है (iframe.heigh - एक्सेस अस्वीकृत होने के लिए jquery x- डोमेन का उपयोग करके) कंपार्टमेंट में कुछ भी नहीं है CSS यहां छवि विवरण दर्ज करें

अब क्रोम कैसे गणना करता है? (संपादन- ब्राउज़र इन सभी सेटिंग्स को शांत करने के लिए रेंडरिंग इंजन में इसके निर्माण का उपयोग करके पृष्ठ को फिर से प्रस्तुत करता है - लेकिन क्रॉस-डोमेन धोखाधड़ी को रोकने के लिए कहीं भी संलग्न नहीं है .. इसलिए ..)

HTML4

मैंने HTML4.x के विनिर्देश पढ़े और यह वहां कहा गया है कि दस्तावेज़ के माध्यम से केवल-पढ़ने के लिए ही मूल्यों को उजागर किया जाना चाहिए, लेकिन यह jquery के माध्यम से अस्वीकृत है।

प्रॉक्सी फ़्रेम

मैं साइट को वापस लाने और गणना करने के मार्ग से नीचे चला गया जो ठीक है .. जब तक कि उपयोगकर्ता iframe से लॉग इन नहीं करता है और प्रॉक्सी को वास्तविक सामग्री के बजाय एक लॉगिन पृष्ठ मिलता है। पेज को दो बार कॉल करने के लिए भी स्वीकार्य नहीं है

http://www.codeproject.com/KB/aspnet/asproxy.aspx

http://www.johnchapman.name/aspnet-proxy-page-cross-domain-requests-from-ajax-and-javascript/

पृष्ठ को पुनः प्रस्तुत करें

मैं इस तक नहीं गया था, लेकिन वहाँ jscript इंजन हैं जो स्रोत को देखेंगे और स्रोत फ़ाइल के आधार पर पृष्ठ को फिर से प्रस्तुत करेंगे। लेकिन यह उन jscripts हैकिंग की आवश्यकता होगी .. और यह वाणिज्यिक संस्थाओं के लिए एक आदर्श स्थिति नहीं है ... और कुछ invole शुद्ध जावा एप्लेट या सर्वर साइड रेंडरिंग

http://en.wikipedia.org/wiki/Server-side_JavaScript

http://htmlunit.sourceforge.net/ <-java jscript नहीं

http://maxq.tigris.org/


EDIT 09-2013 अद्यतन

यह सब HTML5 सॉकेट के साथ किया जा सकता है। लेकिन easyXDM गैर HTML5 शिकायत पृष्ठों के लिए बहुत बड़ी गिरावट है।

समाधान 1 बहुत बढ़िया समाधान!

EasyXDM का उपयोग करना

अपने सर्वर पर आप के रूप में एक पृष्ठ की स्थापना की

<html>
<head>
<script src="scripts/easyXDM.js" type="text/javascript"></script>
<script type="text/javascript" language="javascript">

    var transport = new easyXDM.Socket(/** The configuration */{
    remote: "http://www.OTHERDOMAIN.com/resize_intermediate.html?url=testpages/resized_iframe_1.html",

    //ID of the element to attach the inline frame to
    container: "embedded",
    onMessage: function (message, origin) {
        var settings = message.split(",");
        //Use jquery on a masterpage.
        //$('iframe').height(settings[0]);
        //$('iframe').width(settings[1]);

        //The normal solution without jquery if not using any complex pages (default)
        this.container.getElementsByTagName("iframe")[0].style.height = settings[0];
        this.container.getElementsByTagName("iframe")[0].style.width = settings[1];
    }
});

</script>

</head>

<body>
    <div id="embedded"></div>
</body>

और कॉलर्स डोमेन पर उन्हें केवल उसी स्थान पर intermiedate_frame html और easyXDM.js जोड़ना होगा। माता-पिता फ़ोल्डर की तरह - तब आप केवल आपके लिए रिश्तेदार निर्देशिकाओं या एक निहित फ़ोल्डर का उपयोग कर सकते हैं।

विकल्प 1

यदि आप सभी पृष्ठों पर स्क्रिप्ट जोड़ना नहीं चाहते हैं तो विकल्प 2 देखें!

तब वे केवल उन पृष्ठों के अंत में एक साधारण jscript जोड़ सकते हैं जो आपको होने वाले आकार की आवश्यकता होती है। इनमें से प्रत्येक पृष्ठ में easyxdm को शामिल करने की आवश्यकता नहीं है।

 <script type="text/javascript">
            window.onload = function(){ parent.socket.postMessage( (parseInt(document.body.clientHeight)) + "," + ( document.body.clientWidth ) );  };
        </script>

मैंने भेजे गए मापदंडों को संशोधित किया है। यदि आप चौड़ाई को ठीक से काम करना चाहते हैं, तो दूसरी तरफ के पृष्ठों को पृष्ठ की चौड़ाई को किसी शैली में शामिल करने की आवश्यकता है, जो कुछ इस तरह दिखाई दे:

<style type="text/css">
            html, body {
                overflow: hidden;
                margin: 0px;
                padding: 0px;
                background-color: rgb(75,0,85);
                color:white;
                width:660px
            }
            a {
            color:white;
            visited:white;
            }
        </style>

यह मेरे लिए बहुत अच्छा काम करता है। यदि चौड़ाई शामिल नहीं है, तो फ्रेम थोड़ा अजीब व्यवहार करता है और दयालु यह अनुमान लगाने की कोशिश करता है कि यह क्या होना चाहिए .. और ज़रूरत पड़ने पर नीचे नहीं हटेगा।

विकल्प 2

परिवर्तनों के लिए मतदान के लिए मध्यवर्ती फ्रेम को संशोधित करें

अपने मध्यवर्ती फ्रेम कुछ इस तरह दिखना चाहिए ..

    <!doctype html>
<html>
    <head>

        <title>Frame</title>
        <script type="text/javascript" src="easyXDM.js">
        </script>
        <script type="text/javascript">
            var iframe;
            var socket = new easyXDM.Socket({
                //This is a fallback- not needed in many cases
                swf: "easyxdm.swf",
                onReady: function(){
                    iframe = document.createElement("iframe");
                    iframe.frameBorder = 0;
                    document.body.appendChild(iframe);
                    iframe.src = "THE HOST FRAME";
            iframe.onchange = messageBack();

                },
                onMessage: function(url, origin){
                    iframe.src = url;
                }
            });

            //Probe child.frame for dimensions.
            function messageBack(){
                socket.postMessage ( iframe.contentDocument.body.clientHeight + "," + iframe.contentDocument.body.clientWidth); 
            };

            //Poll for changes on children every 500ms.
            setInterval("messageBack()",500); 

        </script>
        <style type="text/css">
            html, body {
                overflow: hidden;
                margin: 0px;
                padding: 0px;
                width: 100%;
                height: 100%;
            }

            iframe {
                width: 100%;
                height: 100%;
                border: 0px;
            }
        </style>
    </head>
    <body>

    </body>
</html>

यदि आकार में परिवर्तन हुआ है तो अंतराल को अधिक कुशल बनाया जा सकता है और केवल तभी भेजा जा सकता है जब आयाम हर 500ms पर संदेश पोस्ट करने के बाद नहीं बदलता है। यदि आप इस चेक को लागू करते हैं तो आप मतदान को 50ms तक कम कर सकते हैं! मज़े करो


ब्राउज़रों पर काम करें और तेजी से हो। महान डिबगिंग सुविधाएँ !!

Excellent Work to  Sean Kinsey  who made the script!!!

समाधान 2 (काम करता है लेकिन महान नहीं)

इसलिए मूल रूप से यदि आपके पास अन्य डोमेन के साथ एक आपसी समझौता है तो आप भेजने के काम को संभालने के लिए एक पुस्तकालय जोड़ सकते हैं। यदि आपके पास अन्य डोमेन तक कोई पहुंच नहीं है .. तो अधिक हैक की तलाश में रहें- क्योंकि मुझे नहीं मिला या मैं इन सभी को पूरी तरह से सही नहीं ठहरा सकता।

तो अन्य डोमेन इन को वहां हेड टैग में शामिल करेंगे

<script src="scripts/jquery-1.5.2.min.js" type="text/javascript"></script>
<script src="scripts/jquery.postmessage.min.js" type="text/javascript"></script>
<script src="scripts/club.js" type="text/javascript"></script>

Club.js में केवल कुछ कस्टम कॉल्स हैं, जिन्हें मैंने resize कॉल्स के लिए किया है और इसमें शामिल हैं।

 $(document).ready(function () {   
    var parent_url = decodeURIComponent( document.location.hash.replace( /^#/, '' ) ),link;
//Add source url hash to each url to authorise callback when navigating inside the frame.Without this clicking any links will break the communication and no messages will be received
$('a[href]').each(function(){ 
     this.href = this.href + document.location.hash ;
});
//Get the dimensions and send back to calling page.
var h1 = document.body.scrollHeight;
var w1 = document.body.scrollWidth;
$.postMessage({ if_height: h1, if_width: w1 }, parent_url, parent );
  });

और आपका पेज पूरी मेहनत करेगा और एक अच्छी स्क्रिप्ट देगा ...

  //This is almost like request.querystring used to get the iframe data
  function querySt(param, e) {
         gy = e.split("&");
         for (i = 0; i < gy.length; i++) {
             ft = gy[i].split("=");
             if (ft[0] == param) {
                 return ft[1];
             }
         }
     }


     $(function () {
         // Keep track of the iframe dimensions.
         var if_height;
         var if_width;
         // Pass the parent page URL into the Iframe in a meaningful way (this URL could be
         // passed via query string or hard coded into the child page, it depends on your needs).
         src = 'http://www.OTHERDOAMIN.co.uk/OTHERSTARTPAGE.htm' + '#' + encodeURIComponent(document.location.href),
         // Append the Iframe into the DOM.
         iframe = $('<iframe " src="' + src + '" width="100%" height="100%" scrolling="no" frameborder="0"><\/iframe>').appendTo('#iframe');

         // Setup a callback to handle the dispatched MessageEvent event. In cases where
         // window.postMessage is supported, the passed event will have .data, .origin and
         // .source properties. Otherwise, this will only have the .data property.
         $.receiveMessage(function (e) {
             // Get the height from the passsed data.
             //var h = Number(e.data.replace(/.*if_height=(\d+)(?:&|$)/, '$1'));
             var h = querySt("if_height", e.data);
             var w = querySt("if_width", e.data);


             if (!isNaN(h) && h > 0 && h !== if_height) {
                 // Height has changed, update the iframe.
                 iframe.height(if_height = h);
             }
             if (!isNaN(w) && w > 0 && w !== if_width) {
                 // Height has changed, update the iframe.
                 iframe.width(if_width = w);
             }
             //For debugging only really- can remove the next line if you want
             $('body').prepend("Recieved" + h + "hX" + w + "w .. ");
             // An optional origin URL (Ignored where window.postMessage is unsupported).
           //Here you must put the other domain.com name only! This is like an authentication to prevent spoofing and xss attacks! 
         }, 'http://www.OTHERDOMAIN.co.uk');
     });

विकल्प 3

क्रॉस-डोमेन iFrames के आकार बदलने के प्रबंधन के लिए उनकी अब एक छोटी सी जेएस लाइब्रेरी है, इसके लिए अभी भी iFrame की आवश्यकता है कि इसमें जावास्क्रिप्ट का एक सा हिस्सा है, हालांकि, यह सिर्फ देशी JS के 2.8k (765 बाइट्स गिज़पेड) है जिसमें कोई निर्भरता नहीं है और यह तब तक कुछ भी नहीं करता है जब तक कि माता-पिता पृष्ठ द्वारा कॉल न करें। इसका मतलब है कि यह अन्य लोगों के सिस्टम पर एक अच्छा मेहमान है।

यह कोड DOM परिवर्तनों का पता लगाने के लिए MutationObserver का उपयोग करता है और साथ ही आकार बदलने वाली घटनाओं के लिए भी दिखता है, ताकि आईफ्रेम सामग्री के आकार में रहे। IE8 + में काम करता है।

https://github.com/davidjbradshaw/iframe-resizer


4
easyXDM उदाहरण में वास्तव में बहुत कम कोड है, बाहरी कामों पर भरोसा नहीं करता है, और पुराने ब्राउज़रों में भी काम करता है :) और हां, मैं लेखक के बाद से पक्षपाती हूं, लेकिन फिर भी ..
शॉन किन्से

मैंने easyXDM की कोशिश की, लेकिन मुझे काम करने के लिए अन्य लिंक के लिए आंतरिक फ्रेम ब्राउज़िंग नहीं मिल सका .. मैंने उदाहरणों के लिए देखा .. ऐसे लिंक थे जो टूट गए हैं और उदाहरण पृष्ठ स्पष्ट नहीं था .. यह काम नहीं किया! और मेरा मूल उत्तर था .. लेकिन मैंने इसका उपयोग किया। क्या आप आंतरिक ब्राउज़िंग के लिए एक रास्ता पोस्ट कर सकते हैं कृपया .. मैंने देखा और देखा ..
पिय्रूट कुला

@ppumkin उदाहरण है कि डाउनलोड के साथ जहाज पूरी तरह से आंतरिक ब्राउज़िंग का समर्थन करता है। टूटी हुई कड़ी शायद मेरे द्वारा किए गए प्रयोग की है, लेकिन सर्वर एक बिंदु पर
बह

1
Yea ने देखा- और देखा और देखा: किसी कारण से मैं अपनी साइट के साथ काम नहीं कर पाया। मैं दुबारा कोशिश करूँगा।
पायोतर कुला

1
यह काम करता है- लेकिन अगर मैं उस डोमेन पर एक लिंक पर क्लिक करता हूँ तो यह पृष्ठ को पुनः लोड करता है- आपके साथ पुस्तकालय- लेकिन मुझे कोई संदेश नहीं मिल सकता है। मैं यह अनुरोध कैसे स्वीकार कर सकता हूं, भले ही वे कहां से आए हों। और यह easyxdm.swf किस लिए है? :)
पायोत्र कुला

जवाबों:


10

बात यह है - इसके लिए क्रॉस-डोमेन मैसेजिंग का उपयोग करने के अलावा कोई अन्य तरीका नहीं है क्योंकि आपको एक डोमेन में एक दस्तावेज़ से एक अलग डोमेन में एक दस्तावेज़ में गणना की गई ऊंचाई प्राप्त करने की आवश्यकता है।

तो, या तो आप इसका उपयोग कर रहे हैं postMessage(सभी मध्यम ब्राउज़रों में काम करता है), या आप 5 मिनट खर्च करते हैं ताकि ईएक्सईआरडीएम से आसान आइफ्रेम उदाहरण का उपयोग करें।

दूसरे पक्ष को वास्तव में अपने डोमेन पर कुछ फ़ाइलों की प्रतिलिपि बनाने की आवश्यकता है, और उनके दस्तावेज़ में कोड की एक पंक्ति जोड़नी चाहिए ..


इसके विपरीत मेरे मित्र। मैं एक क्रॉस doimain पेज से iframes के लिए iframe का आकार बदलने के लिए एक रास्ता खोजा और कोई scrolars नहीं। इसके थोड़े hacky लेकिन बाद में पोस्ट करेंगे .. यह इतना आसान है कि यह अविश्वसनीय है।
पायोत्र कुला

हाँ ... मैं sendmessage jquwery प्लगइन का उपयोग किया है- हालांकि मैं एक और हैक-झूठी सकारात्मक पाया;) अच्छी टिप के लिए धन्यवाद!
पिओटर कुला

खैर, कभी-कभी सबसे अच्छी बात अपने साथियों को सुनना है - आपके लिए कुछ जादू की हैक की खोज की संभावना है जो किसी और के पास नहीं है बहुत पतली है :)
शॉन किन्से

सोचिए अगर मैंने किया- तो शुद्ध हिट और मिस करके - शानदार होगा। लेकिन हाँ- स्लिम: डी थैंक्स
कुला

सच - अगर और कुछ नहीं, तो आपने कम से कम कोशिश की, प्रयोग किया, और शायद कुछ नया भी सीखा :) :)
शॉन किन्से

25

शॉन ने जो उल्लेख किया है, उसके समान आप पोस्टमासेज का उपयोग कर सकते हैं। मैंने बहुत समय बिताया है कि क्रॉस-डोमेन के साथ iframe का आकार बदलने की कोशिश कर रहा हूं, लेकिन जब तक मैं डेविड वॉल्श के इस महान ब्लॉग पोस्ट पर ठोकर नहीं खाता, http://davidwalsh.name/window-iframe

यह मेरे कोड और डेविड के समाधान का एक संयोजन है। मेरा समाधान विशेष रूप से iframes का आकार बदलने की ओर है।

बाल पृष्ठ में, पृष्ठ की ऊँचाई ज्ञात करें और इसे मूल पृष्ठ (जिसमें iframe शामिल है) से गुज़ारें। अपने एलिमेंट आईडी (html, बॉडी, जो भी हो) के साथ element_id को बदलें।

<script>
function adjust_iframe_height(){
    var actual_height = document.getElementById('element_id).scrollHeight;
    parent.postMessage(actual_height,"*"); 
    //* allows this to post to any parent iframe regardless of domain
}
</script>

<body onload="adjust_iframe_height();"> 
//call the function above after the content of the child loads

मूल विंडो पर, यह कोड जोड़ें। Iframe_id को अपनी iframe ID से बदलें:

<script>
// Create IE + others compatible event handler
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

// Listen to message from child window
eventer(messageEvent,function(e) {
  console.log('parent received message!:  ',e.data);
  document.getElementById('iframe_id').height = e.data + 'px';
},false);
</script>

यदि आप कंसोल खोलते हैं, तो आप कंसोल लॉग में मुद्रित होने वाली ऊँचाई देखेंगे। यह आपको डिबगिंग में मदद करेगा जिसके कारण मैंने इसे वहां छोड़ दिया।

बेस्ट, बेकर


यह महान काम करता है, लेकिन IE में काफी नहीं है। मुझे 2 चर भेजने थे, लेकिन IE "डेटा" को स्वीकार नहीं करेगा यदि इसकी एक सरणी या वस्तु। हालाँकि, मैंने केवल डेटा को डेटा = var1 + "के रूप में बनाया है।" var2। अभिभावक पर, आप स्ट्रिंग को विभाजित करें | और अपने 2 संस्करण वापस लाएं।
डेबोनेविले

5

इस के कई अलग-अलग समाधानों को देखने के बाद, मैंने कई अलग-अलग उपयोग के मामलों का लेखा-जोखा लेने के लिए एक साधारण छोटी लाइब्रेरी लिखना समाप्त कर दिया। जैसा कि मुझे एक समाधान की आवश्यकता थी जो एक पोर्टल पेज पर एकाधिक उपयोगकर्ता उत्पन्न iFrames का समर्थन करता था, समर्थित ब्राउज़र आकार बदलता है और iFrame के बाद होस्ट पृष्ठ जावास्क्रिप्ट लोडिंग के साथ सामना कर सकता है। मैं चौड़ाई और एक कॉलबैक फ़ंक्शन के आकार के लिए समर्थन भी जोड़ता हूं और शरीर के ओवरराइड को अनुमति देता हूं। उमरिन, जैसा कि आप संभवतः इस सेट को शून्य पर रखना चाहेंगे।

https://github.com/davidjbradshaw/iframe-resizer

Iframe कोड सिर्फ थोड़ा स्व-निहित जावास्क्रिप्ट है, ताकि यह अन्य लोगों के पृष्ठों पर एक अच्छा अतिथि हो।

लिपि को निम्नलिखित उपलब्ध विकल्पों के साथ होस्ट पेज पर आरंभीकृत किया गया है।

iFrameResize({
    log                    : true,  // For development
    autoResize             : true,  // Trigering resize on events in iFrame
    contentWindowBodyMargin: 8,     // Set the default browser body margin style (in px)
    doHeight               : true,  // Calculates dynamic height
    doWidth                : false, // Calculates dynamic width
    enablePublicMethods    : true,  // Enable methods within iframe hosted page 
    interval               : 32,    // interval in ms to recalculate body height, 0 to disable refreshing
    scrolling              : false, // Enable the scrollbars in the iFrame
    callback               : function(messageData){ // Callback fn when message is received
        $('p#callback').html(
            '<b>Frame ID:</b> '    + messageData.iframe.id +
            ' <b>Height:</b> '     + messageData.height +
            ' <b>Width:</b> '      + messageData.width + 
            ' <b>Event type:</b> ' + messageData.type
        );
    }
});

अच्छा एक दोस्त। निश्चित रूप से कुछ है जो लोगों के आवंटन द्वारा उपयोग किया जाएगा! +1
पायोटर कुला

1
यदि मुझे दूरस्थ डोमेन तक पहुँच नहीं है तो मैं क्या करूँ? साभार
बाला पीटरसन

@ बालापर्सन, यदि आप दूरस्थ डोमेन का उपयोग नहीं कर सकते हैं, तो आप ब्राउज़र में सुरक्षा प्रतिबंधों के कारण ऐसा नहीं कर सकते।
डेविड ब्रैडशॉ

0

इसके बजाय स्क्रॉल का उपयोग करें = iframe पर नहीं, मैं इसे "ऑटो" में बदल देता हूं। फिर, मुझे वास्तविक विंडो का आकार मिलता है

$(window).height();

और iframe ऊंचाई विशेषता के रूप में उपयोग करें।

खैर, परिणाम है ...

हमारे पास "पेज" स्क्रॉल कभी नहीं होगा, केवल "iframe" स्क्रॉल। जब आप नेविगेट करते हैं, तो कोई फर्क नहीं पड़ता कि स्क्रॉल कौन है, लेकिन महत्वपूर्ण यह है कि केवल 1 है।

खैर, उपयोगकर्ता की समस्या बस नेविगेट करते समय विंडो का आकार बदलने की है। इसे हल करने के लिए, मैं उपयोग करता हूं:

setInterval(getDocHeight, 1);

क्या आपको लगता है कि समाधान किसी भी कीड़े का कारण होगा? यह मेरे लिए काम कर रहा है, और iFrame पर मेरे पास php द्वारा उत्पन्न डायनेमिक कंटेस्ट था। मैं उस के साथ भविष्य के कीड़े से डर रहा हूँ ...


2
बेशक, "iframe" स्क्रॉल पेज के एक ही आकार का होगा। इसलिए, नेविगेट करते समय, आप इसे केवल "पृष्ठ" स्क्रॉल के रूप में देखते हैं।
एल्टन मोरिस

0

आजकल केवल 4 समाधान हैं जो मैं जानता हूं:

केवल तीसरा ही कई समस्याओं का समाधान कर सकता है। उदाहरण के लिए आप उत्तरदायी iFrame बना सकते हैं ; इसे अंदर से बंद करें या आप इसके साथ संवाद कर सकते हैं । लेकिन ऐसा करने के लिए आपको आईफ्रेम में आईफ्रेम और "थर्ड पार्टी कुकीज" वर्कअराउंड (वैकल्पिक) की जरूरत है।

मैंने इसके बारे में उदाहरण के साथ एक लेख बनाया है: इवेंट-संचालित क्रॉस-डोमेन iFrame


0

क्या आपने 'ऑब्जेक्ट-फिट' एचटीएमएल 5 विशेषताओं पर ध्यान दिया है? तराजू को स्केल करने के बजाए वीडियो / चित्र को आइफ्रेम (अच्छा है अगर आप मध्यम आकार की छवि को पकड़ते हैं जो चौड़ाई में 5,000px तक समाप्त होता है)। "फिट" विकल्प (अन्य "कवर" और "फिल" हैं) पहलू अनुपात को संरक्षित करते हुए स्रोत को फिट करने के लिए सॉर्ट-ऑफ-लेटरबॉक्स दृष्टिकोण का उपयोग करता है। एचटीएमएल 5-कम आउट द्वारा देखने के लिए, ऐसा लगता है कि वहां पॉलीफिल बहुत उपलब्ध है। यह एक महान है, लेकिन एज के छोर पर एक बग ने इसे माइक्रोसॉफ्ट के न्यू नाइटमेयर के साथ असंगत रखा है, अब एक साल के लिए: https://github.com/anselmh/object-fit

संपादित करें: क्रॉस डोमेन समस्याओं को हल करने के लिए, आप हमेशा क्रोम एक्सटेंशन कंटेंट स्क्रिप्ट में काम कर सकते हैं, क्योंकि यह सोचता है कि यह उस पृष्ठ का हिस्सा है जिस पर आप अपना आइफ्रेम चिपका रहे हैं।


0

HTTPS एक और लिंक iframe autoheight को ऊंचाई मिलता है

https://-a.com सामग्री:

 <!DOCTYPE html>
    <html>
    <head>
        <title>Test Page</title>
    </head>
    <body>
        Test Page:
        <hr/>
        <iframe id="iframe" src="https://-b.com" style="width:100%;min-height:600px;border:none;" scrolling="no" ></iframe>
        <script>
        // browser compatibility: get method for event 
        // addEventListener(FF, Webkit, Opera, IE9+) and attachEvent(IE5-8)
        var myEventMethod = 
            window.addEventListener ? "addEventListener" : "attachEvent";
        // create event listener
        var myEventListener = window[myEventMethod];
        // browser compatibility: attach event uses onmessage
        var myEventMessage = 
            myEventMethod == "attachEvent" ? "onmessage" : "message";
        // register callback function on incoming message
        myEventListener(myEventMessage, function (e) {
            // we will get a string (better browser support) and validate
            // if it is an int - set the height of the iframe #my-iframe-id
            if (e.data === parseInt(e.data)) 
                document.getElementById('iframe').height = e.data + "px";
        }, false);
        </script>
    </body>
    </html>

https://-b.com iframe सामग्री:

<!DOCTYPE html>
<html>
<head>
    <title>Test Iframe Content</title>
    <script type="text/javascript">
    // all content including images has been loaded
    window.onload = function() {
        // post our message to the parent
        window.parent.postMessage(
            // get height of the content
            document.body.scrollHeight
            // set target domain
            ,"*"
        )
    };
</script>
</head>
<body>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>1
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>2
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>3
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>4
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>5
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>6
</body>
</html>

कार्य तालिका:

xcom http> ycom https WORK

xcom https> ycom https WORK

xcom http> ycom http WORK

xcom https> ycom http WORK

टेस्ट वर्क स्क्रीनशॉट


-2

क्या आप iframe के भीतर निहित पृष्ठ की ऊँचाई का पता लगाना चाहते हैं? मुझे कुछ जावास्क्रिप्ट काम कर रही थी जो iframe कंटेंट की ऊँचाई की जाँच करती है और फिर iframe की ऊँचाई को कंटेंट की ऊँचाई तक सेट करती है।

var Height = document.getElementById('iFrameId').contentWindow.document.body.scrollHeight;

document.getElementById('iFrameId').height = Height;

हालाँकि, यह केवल तभी काम करता है जब आप जिस पेज को iframe में दिखा रहे हैं, वह उसी डोमेन पर हो। यदि यह नहीं है तो आप आवश्यक जानकारी तक नहीं पहुँच सकते। इसलिए, पहुँच ने त्रुटि को अस्वीकार कर दिया।


हाँ मैंने कोशिश की है कि पहले से ही यह बहुत अच्छा काम करता है .. उसी डोमेन पर, जैसा आपने कहा था .. मुझे बताएं- एक ब्राउज़र को कैसे पता चलता है कि 100% कितना है जब वह शुरू में ऊंचाई की गणना करता है? क्यों हम उन मूल्यों तक भी नहीं पहुँच सकते? क्रोम आइफ्रेम यहां तक ​​कि एक्स-डोमेन में हर एक पृष्ठ के लिए गणना की गई शैलियों में इसे संग्रहीत करता है ...
पिओटर कुल

सामग्री और विशेषताओं के आधार पर ऊँचाई की गणना की जाती है। एक तत्व की ऊँचाई अनिश्चित है जब तक कि बच्चों को प्रदान नहीं किया जाता है।
मारियोरिकल

मैं तब प्रदान किए गए मूल्यों को कैसे प्राप्त कर सकता हूं? जैसे क्रोम में निरीक्षण करता है?
पायोत्र कुला

-1 चूंकि यह क्रॉस-डोमेन के लिए काम नहीं करता है, जो कि उसने पूछा है।
सीन किन्से

आप मान प्राप्त नहीं कर सकते। निरीक्षक इसलिए कर सकता है क्योंकि इसमें "ब्राउज़र एक्सटेंशन" स्तर अनुमतियाँ हैं और "वेब पेज एक अलग मूल" स्तर अनुमतियाँ नहीं हैं।
क्वेंटिन

-2

एक आइफ्रेम का आकार बदलने के लिए, यहाँ एक सरल स्क्रिप्ट है:

यह सिर में जाता है: (यह php स्क्रिप्ट के लिए लिखा गया था, html के लिए, "to" और \ "to 'को बदलें ...

<script type='text/javascript'>
<!--
function resizeIframe(id){
/*
this.obj=obj
//this.obj.width=null
//this.obj.width=window.frames[\"sizeframe1\"].document.body.scrollWidth
this.obj.style.height=\"\" // for Firefox and Opera
setTimeout(\"this.obj.style.height=this.obj.contentWindow.document.body.scrollHeight+(notIE?heightOffset:0)\",10) // setTimeout required for Opera
*/

el=document.getElementById(id)
el.style.height='200px' // for Firefox and Opera
setTimeout('el.style.height=el.contentWindow.document.body.scrollHeight+\"px\"',1) // setTimeout required for Opera
}

// -->
</script>"

सिर का अंत

यह शरीर में जाता है (याद रखें, यह एक php स्क्रिप्ट के लिए लिखा गया था, html के लिए सभी 'to' और \ "to '...) बदलें

<iframe onload='resizeIframe(this.id)' allowTransparency=\"true\" name='ccpaymentwindow' id='sizeframe1' marginwidth='1' marginheight='1' height='700' width='690' border='0' frameborder='1' scrolling='no' src='ccmslink.php?variable1=" . $variable1 . "'></iframe>

बोनस: ऊपर कुछ संकेत हैं। जैसा कि यह php स्क्रिप्टिंग के लिए सेट है, आप इसके साथ बहुत कुछ कर सकते हैं ... अधिक जानने के लिए, अधिक करें ...

इसके लिए कुंजी है "sizeframe1" .... एक ही पृष्ठ पर कई "पुनर्विक्रेताओं" के लिए, एक ही स्क्रिप्ट की प्रतिलिपि बनाएँ, लेकिन iframe में आईडी बदलें और सिर में स्क्रिप्ट में नाम, और viola! आपके पास एक ही पृष्ठ पर कई पुनर्विक्रेता हैं ... यह बहुत अच्छी तरह से काम करता है!

फुन है


मुझे नहीं लगता कि आप पूछे गए वास्तविक प्रश्न को संबोधित कर रहे हैं।
एंड्रयू बार्बर

Yea- यह एक ही डोमेन पर एक iframe का आकार बदलने के लिए शुद्ध जावास्क्रिप्ट है। किसी भी तरह से jQuery का उपयोग करना बहुत आसान है। यह अभ्‍यास क्रास साइट नहीं है और यहां कुछ भी फैंसी नहीं है जो इसे अनुमति देगा। और php स्क्रिप्टिंग जैसी कोई चीज नहीं है ?!
पिओटर कुल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.