Resizing an iframe based on content

后端 未结 21 2485
南方客
南方客 2020-11-21 07:40

I am working on an iGoogle-like application. Content from other applications (on other domains) is shown using iframes.

How do I resize the iframes to fit the heigh

相关标签:
21条回答
  • 2020-11-21 08:01

    get iframe content height then give it to this iframe

     var iframes = document.getElementsByTagName("iframe");
     for(var i = 0, len = iframes.length; i<len; i++){
          window.frames[i].onload = function(_i){
               return function(){
                         iframes[_i].style.height = window.frames[_i].document.body.scrollHeight + "px";
                         }
          }(i);
     }
    
    0 讨论(0)
  • 2020-11-21 08:02

    may be a bit late, as all the other answers are older :-) but... here´s my solution. Tested in actual FF, Chrome and Safari 5.0.

    css:

    iframe {border:0; overflow:hidden;}
    

    javascript:

    $(document).ready(function(){
        $("iframe").load( function () {
            var c = (this.contentWindow || this.contentDocument);
            if (c.document) d = c.document;
            var ih = $(d).outerHeight();
            var iw = $(d).outerWidth();
            $(this).css({
                height: ih,
                width: iw
            });
        });
    });
    

    Hope this will help anybody.

    0 讨论(0)
  • 2020-11-21 08:05

    The solution on http://www.phinesolutions.com/use-jquery-to-adjust-the-iframe-height.html works great (uses jQuery):

    <script type=”text/javascript”>
      $(document).ready(function() {
        var theFrame = $(”#iFrameToAdjust”, parent.document.body);
        theFrame.height($(document.body).height() + 30);
      });
    </script>
    

    I don't know that you need to add 30 to the length... 1 worked for me.

    FYI: If you already have a "height" attribute on your iFrame, this just adds style="height: xxx". This might not be what you want.

    0 讨论(0)
  • 2020-11-21 08:08

    When you want to zoom out a web page to fit it into the iframe size:

    1. You should resize the iframe to fit it with the content
    2. Then you should zoom out the whole iframe with the loaded web page content

    Here is an example:

    <div id="wrap">
       <IFRAME ID="frame" name="Main" src ="http://www.google.com" />
    </div>
    

    <style type="text/css">
        #wrap { width: 130px; height: 130px; padding: 0; overflow: hidden; }
        #frame { width: 900px; height: 600px; border: 1px solid black; }
        #frame { zoom:0.15; -moz-transform:scale(0.15);-moz-transform-origin: 0 0; }
    </style>
    
    0 讨论(0)
  • 2020-11-21 08:09

    We had this type of problem, but slightly in reverse to your situation - we were providing the iframed content to sites on other domains, so the same origin policy was also an issue. After many hours spent trawling google, we eventually found a (somewhat..) workable solution, which you may be able to adapt to your needs.

    There is a way around the same origin policy, but it requires changes on both the iframed content and the framing page, so if you haven't the ability to request changes on both sides, this method won't be very useful to you, i'm afraid.

    There's a browser quirk which allows us to skirt the same origin policy - javascript can communicate either with pages on its own domain, or with pages it has iframed, but never pages in which it is framed, e.g. if you have:

     www.foo.com/home.html, which iframes
     |-> www.bar.net/framed.html, which iframes
         |-> www.foo.com/helper.html
    

    then home.html can communicate with framed.html (iframed) and helper.html (same domain).

     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 can send messages to helper.html (iframed) but not home.html (child can't communicate cross-domain with parent).

    The key here is that helper.html can receive messages from framed.html, and can also communicate with home.html.

    So essentially, when framed.html loads, it works out its own height, tells helper.html, which passes the message on to home.html, which can then resize the iframe in which framed.html sits.

    The simplest way we found to pass messages from framed.html to helper.html was through a URL argument. To do this, framed.html has an iframe with src='' specified. When its onload fires, it evaluates its own height, and sets the src of the iframe at this point to helper.html?height=N

    There's an explanation here of how facebook handle it, which may be slightly clearer than mine above!


    Code

    In www.foo.com/home.html, the following javascript code is required (this can be loaded from a .js file on any domain, incidentally..):

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

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

    Contents of 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>
    
    0 讨论(0)
  • 2020-11-21 08:09

    Here's a jQuery approach that adds the info in json via the src attribute of the iframe. Here's a demo, resize and scroll this window.. the resulting url with json looks like this... http://fiddle.jshell.net/zippyskippy/RJN3G/show/#{docHeight:5124,windowHeight:1019,scrollHeight:571}#

    Here's the source code fiddle http://jsfiddle.net/zippyskippy/RJN3G/

    function updateLocation(){
    
        var loc = window.location.href;
        window.location.href = loc.replace(/#{.*}#/,"") 
            + "#{docHeight:"+$(document).height() 
            + ",windowHeight:"+$(window).height()
            + ",scrollHeight:"+$(window).scrollTop()
            +"}#";
    
    };
    
    //setInterval(updateLocation,500);
    
    $(window).resize(updateLocation);
    $(window).scroll(updateLocation);
    
    0 讨论(0)
提交回复
热议问题