ক্রস ডোমেন iframe পুনরায় আকার


85

অন্য ডোমেন থেকে আমি কীভাবে একটি আইফ্রেম আকার দিতে পারি

- সম্পাদনা

কিছু সমাধানের জন্য নীচে স্ক্রোল করুন .. বা কীভাবে এটি করবেন না তা পড়ুন: ডি

অনেক ঘন্টা কোড হ্যাকিংয়ের পরে - উপসংহারে বলা হয় যে আইফ্রেমের অভ্যন্তরের যে কোনও কিছুই অ্যাক্সেসযোগ্য নয়, এমনকি আমার ডোমেনে রেন্ডার করা স্ক্রোলবারগুলি। আমি অনেক কৌশল চেষ্টা করেও কোন লাভ হয়নি।

আপনার সময় সাশ্রয় করতে এই রুটটিও নেমে যাবেন না কেবল ক্রস ডোমেন যোগাযোগের জন্য সেন্ড ম্যাসেজগুলি ব্যবহার করুন। এইচটিএমএল <5 এর জন্য প্লাগইন রয়েছে যা আমি ব্যবহার করি- একটি দুর্দান্ত উদাহরণের জন্য নীচে যান :)


গত কয়েক দিন আমি একটি সাইটে একটি আইফ্রেম সংহত করার চেষ্টা করছি। এটি একটি স্বল্প মেয়াদী সমাধান, যখন অন্য দিকটি বিকাশ করে এবং এপিআই (কয়েক মাস সময় নিতে পারে ...) এবং এটি হ'ল স্বল্পমেয়াদী সমাধান হিসাবে আমরা ইজি এক্সএমএম ব্যবহার করতে চাই- আমার অন্য ডোমেনটিতে অ্যাক্সেস রয়েছে তবে তাদের কাছে এটি জিজ্ঞাসা করা যথেষ্ট কঠিন p3p শিরোনামটি যেমন যুক্ত করুন .....

3 iframes

আমার সর্বাধিক নিকটতম সমাধানটি ছিল 3 টি আইফ্রেমেস- তবে এটি ক্রোম এবং সাফারি মানসিকভাবে যায় তাই আমি এটি ব্যবহার করতে পারি না।

ক্রোম খোলা

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

স্ক্রোলবারগুলি পরিমাপ করুন

ফর্মটি চেষ্টা ও আকার পরিবর্তন করতে স্ক্রোলহাইটটি কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আমি একটি অন্য পোস্ট পেয়েছি .. তত্ত্বের ক্ষেত্রে এটি ভাল কাজ করে তবে আমি iframes স্ক্রোল উচ্চতা ব্যবহার করে এটি সঠিকভাবে প্রয়োগ করতে পারিনি ..

document.body.scrollHeight

যেগুলি দেহগুলির উচ্চতা অবলম্বন করে (এই বৈশিষ্ট্যগুলিকে 100% অ্যাক্সেস করতে পারে না ক্লায়েন্টদের প্রদর্শন ক্যানভাজের উপর ভিত্তি করে এক্স-ডোমেন নথির উচ্চতার নয়)

আমি iframes উচ্চতা পেতে jquery ব্যবহার করার চেষ্টা করেছি

$('#frameId').Height()

$('#frameId').clientHeight

$('#frameId').scrollHeight

রিটার্নের মানগুলি ক্রোমে আলাদা হয় এবং যেমন - বা এগুলি মোটেই বোঝা যায় না। সমস্যাটি হ'ল ফ্রেমের অভ্যন্তরে সমস্ত কিছুই অস্বীকৃত - এমনকি স্ক্রোলবারও ...

গণিত শৈলী

তবে আমি যদি ইফ্রেমের ক্রোমটিতে পরিদর্শন করি এবং উপাদানটি উত্সাহিত করি তবে ব্লাডি আমাকে আইফ্রেমের অভ্যন্তরে নথির মাত্রাগুলি দেখায় (jquery এক্স-ডোমেন ব্যবহার করে iframe.heigh - অ্যাক্সেস প্রত্যাখ্যান করা হয়) গণিত CSS এ কিছুই নেই এখানে চিত্র বর্ণনা লিখুন

এখন ক্রোম কীভাবে এটি গণনা করে? (সম্পাদনা ব্রাউজার এই সমস্ত সেটিংস ক্যালকুলিয়েট করতে তার বিল্ডটি রেন্ডারিং ইঞ্জিন ব্যবহার করে পৃষ্ঠাটিকে পুনরায় রেন্ডার করে - তবে ক্রস-ডোমেন জালিয়াতি রোধে কোথাও সংযুক্ত থাকে না .. তাই ..)

এইচটিএমএল 4

আমি HTML4.x এর স্পেসিফিকেশন পড়ি এবং এটিতে সেখানে বলা হয়েছে যে ডকুমেন্ট.এলিমেন্টের মাধ্যমে কেবল পঠনযোগ্য মূল্যবোধগুলি প্রকাশ করা উচিত তবে এটি অ্যাক্সেস jquery এর মাধ্যমে অস্বীকার করা হয়েছে

প্রক্সি ফ্রেম

আমি সাইটটি প্রক্সিংয়ের রুটে নেমে গিয়েছিলাম এবং যা ঠিক আছে তা গণনা করতে চলেছি .. যতক্ষণ না কোনও ব্যবহারকারী যদি আইফ্রেমে প্রবেশ করে এবং প্রক্সি প্রকৃত সামগ্রীর পরিবর্তে লগইন পৃষ্ঠা না পায়। কিছু পৃষ্ঠায় দু'বার কল করাও গ্রহণযোগ্য নয় not

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

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

পৃষ্ঠাটি পুনরায় রেন্ডার করুন

আমি এদিকে যাইনি তবে সেখানে জেএসক্রিপ্ট ইঞ্জিন রয়েছে যা উত্সটি দেখবে এবং উত্স ফাইলের ভিত্তিতে পৃষ্ঠাটি পুনরায় রেন্ডার করবে। তবে এটির জন্য এই জস্ক্রিপ্টগুলি হ্যাক করা দরকার .. এবং এটি বাণিজ্যিক সংস্থাগুলির জন্য আদর্শ পরিস্থিতি নয় ... এবং কিছু খাঁটি জাভা অ্যাপলেট বা সার্ভার সাইড রেন্ডারিং

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

http://htmlunit.sourceforge.net/ <জাভা স্ক্রিপ্ট নয়

http://maxq.tigris.org/


সম্পাদনা 09-2013 আপডেট

এই সমস্ত HTML5 সকেট দিয়ে করতে পারে। তবে ইজিজএক্সডিএম এইচটিএমএল 5 অভিযোগ পৃষ্ঠাগুলির জন্য দুর্দান্ত ফ্যালব্যাক।

সমাধান 1 খুব দুর্দান্ত সমাধান!

ইজিএক্সডিএম ব্যবহার করে

আপনার সার্ভারে আপনি আকারে একটি পৃষ্ঠা সেট আপ করেছেন

<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 এইচটিএমএল এবং ইজিএক্সডিএম.জেগুলি যুক্ত করতে হবে। পিতামাতার ফোল্ডারের মতো - তারপরে আপনি কেবলমাত্র আপনার জন্য আপেক্ষিক ডিরেক্টরি বা একটি অন্তর্ভুক্ত ফোল্ডার অ্যাক্সেস করতে পারেন।

বিকল্প 1

আপনি যদি সমস্ত পৃষ্ঠায় স্ক্রিপ্ট যোগ করতে না চান তবে বিকল্প 2 দেখুন!

তারপরে তারা পুনরায় আকার পরিবর্তন করতে হবে এমন প্রতিটি পৃষ্ঠাগুলির শেষে কেবল একটি সাধারণ jscript যুক্ত করতে পারে। এই পৃষ্ঠাগুলির প্রত্যেকটিতে ইজেক্সডিএম অন্তর্ভুক্ত করার দরকার নেই।

 <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>

যদি আকার পরিবর্তন হয় এবং কেবল 500 মিমি বার্তা বার্তা প্রেরণের মাত্রাগুলি পরিবর্তন না হয় তবে কেবলমাত্র প্রেরণ করতে হলে ব্যবধানটি আরও বেশি দক্ষ করে তোলা যেতে পারে। আপনি যদি এই চেকটি বাস্তবায়ন করেন তবে আপনি 50 মিমি হিসাবেও কম ভোট দিতে পারবেন! আনন্দ কর


ব্রাউজার জুড়ে কাজ করুন এবং দ্রুত। দুর্দান্ত ডিবাগিং বৈশিষ্ট্যগুলি !!

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>

ক্লাব.জেএসগুলিতে কিছু কাস্টম কল আমি পুনরায় আকারের কলগুলির জন্য করেছি এবং এতে রয়েছে ..

 $(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

ক্রস-ডোমেন আইফ্রেমগুলি পুনরায় আকার দেওয়ার জন্য তাদের এখন একটি ছোট জেএস লাইব্রেরি, এটির জন্য এখনও আইফ্রেমে কিছুটা জাভাস্ক্রিপ্ট থাকা দরকার, তবে এটি নেটিভ জেএসের কেবল ২.৮ কে (656565 বাইট গাজিপ) যার কোনও নির্ভরতা নেই is এবং প্যারেন্ট পৃষ্ঠা দ্বারা কল না করা পর্যন্ত এটি কিছুই করে না। এর অর্থ এটি অন্য ব্যক্তিদের সিস্টেমে একটি দুর্দান্ত অতিথি।

এই কোডটি ডিওএম পরিবর্তনগুলি সনাক্ত করতে মিউটেশনঅবার্সার ব্যবহার করে এবং পুনরায় আকারের ইভেন্টগুলি সন্ধান করে, যাতে আইফ্রেমটি সামগ্রীতে আকার ধারণ করে। আইই 8 + এ কাজ করে।

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


4
ইজিএক্সডিএম উদাহরণটিতে আসলে অনেক কম কোড রয়েছে, বাহ্যিক লিবসের উপর নির্ভর করে না এবং পুরানো ব্রাউজারগুলিতেও কাজ করে না :) এবং হ্যাঁ, আমি লেখক যেহেতু পক্ষপাতিত্বশীল, কিন্তু এখনও ..
শান কিনসে

আমি ইজি এক্সডিএম চেষ্টা করেছিলাম তবে আমি অন্যান্য লিঙ্কগুলিতে অভ্যন্তরীণ ফ্রেম ব্রাউজিং করতে পারিনি .. আমি উদাহরণগুলির সন্ধান করলাম .. এমন লিঙ্কগুলি রয়েছে যা ভেঙে গেছে এবং উদাহরণ পৃষ্ঠাটি পরিষ্কার করা হয়নি .. এটি কাজ করেছিল! এবং আমার আসল উত্তর ছিল .. তবে আমি এটি ব্যবহার করেছি। আপনি কি অভ্যন্তরীণ ব্রাউজিংয়ের জন্য কোনও উপায় পোস্ট করতে পারেন দয়া করে .. আমি দেখেছি এবং দেখেছি ..
পাইওটার কুলা

ডাউনলোডের সাহায্যে জাহাজগুলি অভ্যন্তরীণ ব্রাউজিংকে পুরোপুরি সমর্থন করে এমন উদাহরণটি @ পিপ্পকিন করুন । ভাঙা লিঙ্কটি সম্ভবত আমি একটি পরীক্ষার জন্য করেছি, তবে সার্ভারটি এক পর্যায়ে ফ্লাশ হয়ে গেছে ..
শান কিনসে

4
হ্যাঁ এটির দিকে নজর রেখেছিলেন: এবং তাকিয়ে দেখেছেন: ডি কোনও কারণে আমি এটি আমার সাইটের সাথে কাজ করতে পারি না। আমি আবার চেষ্টা করব.
পাইটর কুলা

4
এটি কার্যকর - তবে আমি যদি সেই ডোমেনের কোনও লিঙ্কে ক্লিক করি তবে পৃষ্ঠাটি আপনার লাইব্রেরির সাথে পুনরায় লোড হয়ে যায়- তবে আমি কোনও বার্তা পেতে পারি না। তারা যেখানেই আসুক নির্বিশেষে আমি কীভাবে এটির আবেদনগুলি গ্রহণ করতে পারি। এবং এই ইজিএক্সডিএম.এসডাব্লু কিসের জন্য? :)
পাইটর কুলা

উত্তর:


10

জিনিসটি হ'ল - এর জন্য ক্রস-ডোমেন মেসেজিং ব্যবহার করা ছাড়া আর কোনও উপায় নেই যেহেতু আপনাকে একটি ডোমেনের একটি ডকুমেন্ট থেকে আলাদা ডোমেনের একটি নথিতে গণনা করা উচ্চতা প্রয়োজন get

সুতরাং, হয় আপনি এটি ব্যবহার করে করেন postMessage(সমস্ত আধুনিক ব্রাউজারগুলিতে কাজ করে), অথবা আপনি ইজিএক্সডিএম থেকে পুনরায় আকার ইফ্র্যাম উদাহরণটি মানিয়ে নিতে 5 মিনিট ব্যয় করেছেন।

অন্য পক্ষকে সত্যই কেবল তাদের ডোমেনে কয়েকটি ফাইল অনুলিপি করতে হবে এবং তাদের নথিতে কোডের একটি একক লাইন যুক্ত করতে হবে ..


বিপরীতে আমার বন্ধু। আমি একটি ক্রস ডাইমাইন পৃষ্ঠা থেকে iframes ডকুমেন্ট আকার এবং কোনও স্ক্রোলবারগুলিতে আইফ্রেমে পুনরায় আকার দেওয়ার একটি উপায় খুঁজে পেয়েছি। এর কান্ডা হ্যাকি তবে পরে পোস্ট করবে .. এটি এতটাই সহজ এটি অবিশ্বাস্য।
পাইওটার কুলা

হ্যাঁ ... আমি সেন্ডমেজেজ jquwery প্লাগইন ব্যবহার করেছি- যদিও আমি অন্য হ্যাক পেয়েছি- মিথ্যা পজিটিভ ..;) ভাল টিপটির জন্য ধন্যবাদ!
পাইটর কুলা

ঠিক আছে, কখনও কখনও সর্বোত্তম জিনিসটি আপনার সহকর্মীদের শুনতে হয় - আপনার পক্ষে এমন কিছু ম্যাজিক হ্যাক আবিষ্কার করার পক্ষে যে প্রতিক্রিয়া রয়েছে তা অন্য কারও
কাছেই

কল্পনা করুন আমি যদি খাঁটি হিট এবং মিস করে - চমত্কার হবে। তবে ইয়ে স্লিম: ডি থ্যাঙ্কস
কুলা

সত্য - অন্য কিছু না হলে আপনি কমপক্ষে চেষ্টা করেছেন, পরীক্ষা করেছেন এবং সম্ভবত নতুন কিছু শিখেছেন :)
সান কিনসে

26

শন যা উল্লেখ করেছে তার অনুরূপ, আপনি পোস্টম্যাসেজ ব্যবহার করতে পারেন। আমি ক্রস-ডোমেনের সাথে ইফরামের আকার পরিবর্তন করতে বিভিন্নভাবে চেষ্টা করে অনেক সময় ব্যয় করেছি তবে ডেভিড ওয়ালশের এই দুর্দান্ত ব্লগ পোস্টটিতে হোঁচট না পড়লে ভাগ্য নেই: http://davidwalsh.name/window-iframe

এটি আমার কোড এবং ডেভিডের সমাধানের সংমিশ্রণ। আমার দ্রবণটি বিশেষত আকারে ইফ্রেমেস আকারের দিকে এগিয়ে যায়।

শিশু পৃষ্ঠায়, পৃষ্ঠার উচ্চতাটি সন্ধান করুন এবং এটি প্যারেন্ট পৃষ্ঠায় (যা iframe ধারণ করে) পাস করুন। আপনার উপাদান আইডি (এইচটিএমএল, বডি, যাই হোক না কেন) দিয়ে এলিমেন্ট_আইড প্রতিস্থাপন করুন।

<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 প্রতিস্থাপন করুন:

<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 "ডেটা" গ্রহণ করবে না যদি এটির অ্যারে বা অবজেক্ট থাকে। যাইহোক, আমি কেবল ডেটা = var1 + "" "হিসাবে ডেটা তৈরি করেছি var2। পিতামাত্রে, আপনি কেবল স্ট্রিংটি বিভক্ত করুন | এবং আপনার 2 বার ফিরে পেতে।
dbonneville

5

এর প্রচুর ভিন্ন সমাধান সন্ধান করার পরে আমি বেশ কয়েকটি বিভিন্ন ব্যবহারের ক্ষেত্রে অ্যাকাউন্ট নিতে একটি সাধারণ ছোট গ্রন্থাগার লিখেছি writing যেহেতু আমার এমন একটি সমাধানের দরকার ছিল যা একাধিক ব্যবহারকারীর পোর্টাল পৃষ্ঠায় উত্পন্ন আইফ্রেমে সমর্থন করেছিল, সমর্থিত ব্রাউজারটি আকার পরিবর্তন করতে পারে এবং আইফ্রেমের পরে হোস্ট পৃষ্ঠা জাভাস্ক্রিপ্ট লোডের সাথে মানিয়ে নিতে পারে। আমি আকার এবং একটি কলব্যাক ফাংশন আকারের জন্য সমর্থন যোগ করি এবং বডি.মারগিনকে ওভাররাইডের অনুমতি দেয় কারণ আপনি সম্ভবত এই সেটটি শূন্যে রাখতে চান।

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

আইফ্রেমে কোডটি সামান্য স্ব-অন্তর্ভুক্ত জাভাস্ক্রিপ্ট, যাতে এটি অন্য লোকের পৃষ্ঠাগুলিতে একটি ভাল অতিথি।

এরপরে স্ক্রিপ্টটি নিম্নলিখিত উপলভ্য বিকল্পগুলির সাথে হোস্ট পৃষ্ঠায় শুরু করা হবে।

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
পাইটর কুলা

4
আমার যদি দূরবর্তী ডোমেইনে অ্যাক্সেস না থাকে তবে আমি কী করব? ধন্যবাদ
বালা পিটারসন

@ বালাপিটারসন, যদি আপনি দূরবর্তী ডোমেন অ্যাক্সেস করতে না পারেন তবে ব্রাউজারে সুরক্ষা সীমাবদ্ধতার কারণে আপনি এটি করতে পারবেন না।
ডেভিড ব্র্যাডশো

0

আইফ্রেমে স্ক্রোল = না ব্যবহারের পরিবর্তে, আমি এটিকে "অটো" তে পরিবর্তন করি। তারপরে, আমি আসল উইন্ডোর আকার পাই

$(window).height();

এবং এটি iframe উচ্চতার বৈশিষ্ট্য হিসাবে ব্যবহার করুন।

ঠিক আছে, ফলাফল ...

আমাদের কাছে কখনই "পৃষ্ঠা" স্ক্রোল থাকবে না, কেবল "iframe" স্ক্রোল থাকবে। আপনি যখন নেভিগেট করেন, কে স্ক্রোলটি তা বিবেচনা করে না, তবে গুরুত্বপূর্ণটি হল যে এখানে কেবল 1 রয়েছে।

ঠিক আছে, ব্যবহারকারীর সমস্যা আছে যখন সে নেভিগেট করার সময় উইন্ডোটির আকার পরিবর্তন করল। এটি সমাধান করার জন্য, আমি ব্যবহার করি:

setInterval(getDocHeight, 1);

আপনি কি ভেবেছিলেন যে সমাধানটি কোনও ত্রুটি সৃষ্টি করবে? এটি আমার পক্ষে কাজ করছে এবং আইফ্রেমে আমার পিএইচপি দ্বারা গতিশীল প্রসঙ্গ তৈরি হয়েছিল। আমি এর সাথে ভবিষ্যতের বাগগুলি সম্পর্কে ভয় পাই ...


4
অবশ্যই, "iframe" স্ক্রোলটি পৃষ্ঠার একই আকারের, সর্বদাই থাকবে। সুতরাং, নেভিগেট করার সময়, আপনি কেবল এটি দেখতে পাচ্ছেন যে এটি "পৃষ্ঠা" স্ক্রোল ছিল।
এলটন মোরেইস

0

আজকাল আমি জানি মাত্র 4 টি সমাধান রয়েছে:

কেবল তৃতীয়টিই অনেক সমস্যার সমাধান করতে পারে। উদাহরণস্বরূপ আপনি প্রতিক্রিয়াশীল আইফ্রেম তৈরি করতে পারেন ; এটি ভিতরে থেকে বন্ধ করুন বা আপনি এটির সাথে যোগাযোগ করতে পারেন । তবে এটি করার জন্য আপনার ইফ্রেমে আইফ্রেম এবং "তৃতীয় পক্ষের কুকিজ" ওয়ার্কআউন্ড (alচ্ছিক) প্রয়োজন।

আমি উদাহরণ সহ এটি সম্পর্কে একটি নিবন্ধ তৈরি করেছি: ইভেন্ট-চালিত ক্রস-ডোমেন আইফ্রেম


0

আপনি কি 'অবজেক্ট-ফিট' এইচটিএমএল 5 বৈশিষ্ট্যগুলি দেখেছেন? আইফ্রেমে স্কেলিং না করে ভিডিও / চিত্রগুলি আইফ্রেমে স্কেল করে (আপনি যদি মাঝারি আকারের চিত্রটি ধরে রাখেন যা প্রস্থে 5000px হয়ে যায়) nice "ফিট" বিকল্পটি (অন্যরা "কভার" এবং "ফিল") দিক অনুপাত সংরক্ষণের সময় উত্সটি ফিট করার জন্য একটি লেটারবক্স পদ্ধতির ব্যবহার করে। এইচটিএমএল 5-এর বাইরে দেখার জন্য, দেখে মনে হচ্ছে সেখানে বেশ কয়েকটি পলিফিল পাওয়া যায়। এটি দুর্দান্ত, তবে এজ এর শেষের একটি বাগ এটিকে প্রায় এক বছর ধরে মাইক্রোসফ্টের নতুন দুঃস্বপ্নের সাথে বেমানান রেখেছে: https://github.com/anselmh/object-fit

সম্পাদনা: ক্রস ডোমেন সংক্রান্ত সমস্যাগুলি পেতে, আপনি সর্বদা একটি ক্রোম এক্সটেনশন সামগ্রী স্ক্রিপ্টে কাজটি করতে পারেন, কারণ এটি মনে করে যে এটি আপনার পৃষ্ঠায় অংশীদারি করছে যদি আপনি নিজের আইফ্রেমে স্টিক করে থাকেন।


0

এইচটিটিপিএসের অন্য লিঙ্কটি iframe অটোহাইটের উচ্চতা অর্জন করে

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 ওয়ার্ক

xcom https> ycom https ওয়ার্ক

xcom http> ycom http ওয়ার্ক

xcom https> ycom http ওয়ার্ক

পরীক্ষার কাজের স্ক্রিনশট


-2

আপনি কি পৃষ্ঠার উচ্চতা ইফ্রেমের মধ্যে রয়েছে তা সন্ধান করছেন? আমি কিছু জাভাস্ক্রিপ্ট কাজ করে যা iframe সামগ্রীর উচ্চতা চেক করে তারপর আইফ্রেমের উচ্চতা সামগ্রীর উচ্চতায় সেট করে।

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

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

তবে এটি কেবল তখনই কাজ করে যদি আপনি ইফ্রেমে প্রদর্শিত পৃষ্ঠাটি একই ডোমেনে থাকে। যদি তা না হয় তবে প্রয়োজনীয় তথ্য অ্যাক্সেস করতে পারবেন না। সুতরাং, অ্যাক্সেস ত্রুটি অস্বীকার করেছে।


হ্যাঁ আমি ইতিমধ্যে চেষ্টা করেছিলাম। এটি দুর্দান্ত কাজ করে .. আপনার মত একই ডোমেনে .. আমাকে বলুন- যখন ব্রাউজার প্রাথমিকভাবে উচ্চতা গণনা করে তখন 100% কত হয় তা কীভাবে জানবে? কেন আমরা এই মানগুলি অ্যাক্সেস করতে পারি না? ক্রোম এটি ইফ্রেমে এমনকি এক্স-ডোমেনের প্রতিটি একক পৃষ্ঠার জন্য গণিত শৈলীতে সঞ্চয় করে ...
পাইওটার কুলা

তারা যে বিষয়বস্তু এবং বৈশিষ্ট্য রয়েছে তার উপর নির্ভর করে উচ্চতা গণনা করা হয়। বাচ্চাদের রেন্ডার না করা পর্যন্ত একটি উপাদানের উচ্চতা অনিশ্চিত।
মারিওরিক্যালড

আমি কীভাবে রেন্ডার করা মানগুলি পেতে পারি? ক্রোম পরিদর্শন মত কি?
পাইওটর কুলা

-1 যেহেতু এটি ক্রস-ডোমেন কাজ করে না, যা তিনি চেয়েছিলেন।
শান কিনসে

আপনি মান পেতে পারেন না। পরিদর্শকটির "ব্রাউজার এক্সটেনশান" স্তরের অনুমতি রয়েছে এবং "আলাদা উত্সের সাথে ওয়েব পৃষ্ঠা" নয়, তবে এটি করতে পারে।
কোয়ান্টিন

-2

আইফ্রেমের আকার পরিবর্তন করতে, এখানে একটি সাধারণ স্ক্রিপ্ট রয়েছে:

এটি মাথায় যায়: (এটি পিএইচপি স্ক্রিপ্টের জন্য লেখা হয়েছিল, এইচটিএমএল এর জন্য '' এবং '\ "' তে পরিবর্তন করুন ...

<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>"

মাথার শেষ

এটি শরীরে যায় (মনে রাখবেন, এটি একটি পিএইচপি স্ক্রিপ্টের জন্য লেখা হয়েছিল, এইচটিএমএল জন্য সমস্ত 'তে "এবং" \ "থেকে" পরিবর্তন করুন ...)

<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>

বোনাস: উপরে কিছু ইঙ্গিত রয়েছে। এটি পিএইচপি স্ক্রিপ্টিংয়ের জন্য যেমন সেট করা আছে, আপনি এটি দিয়ে অনেক কিছু করতে পারেন ... আরও শিখতে, আরও কিছু করতে ...

এটির মূলটি হ'ল "সাইজফ্রেম 1" .... একই পৃষ্ঠায় একাধিক "রাইজার" জন্য, একই স্ক্রিপ্টটি অনুলিপি করুন তবে আইফ্রেমে আইডি পরিবর্তন করুন এবং স্ক্রিপ্টের নামটি মাথায় রাখুন, এবং ভায়োলা! একই পৃষ্ঠায় আপনার একাধিক রাইজার রয়েছে ... এটি খুব ভালভাবে কাজ করে!

ফান আছে


আমি মনে করি না যে আপনি জিজ্ঞাসা করা আসল প্রশ্নটির সমাধান করছেন।
অ্যান্ড্রু বার্বার

হ্যাঁ - একই ডোমেনের আইফ্রেমের আকার পরিবর্তন করতে এটি খাঁটি জাভাস্ক্রিপ্ট। যে কোনও উপায়ে jQuery ব্যবহার করা অনেক সহজ। এই ক্রস সাইটটি কাজ করবে না এবং এখানে অভিনব কোনও কিছুই নেই যা এটির অনুমতি দেবে। এবং পিএইচপি স্ক্রিপ্টিং এর মতো কোনও জিনিস নেই ?!
পাইটর কুলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.