当前位置: 首页 > 面试题库 >

根据内容调整iframe的大小

薛修能
2023-03-14
问题内容

我正在开发类似iGoogle的应用程序。使用iframe显示其他应用程序(在其他域上)的内容。

如何调整iframe的大小以适合iframe内容的高度?

我试图破译Google使用的javascript,但它被混淆了,到目前为止,在网络上搜索毫无结果。

更新: 请注意,内容是从其他域加载的,因此适用同源策略。


问题答案:

我们遇到了这类问题,但与您的情况略有不同我们向其他域上的网站提供了iframed内容,因此相同的来源政策也是一个问题。经过数小时的拖曳Google搜寻,我们最终找到了(某种程度上..)可行的解决方案,您也许可以适应您的需求。

有一种方法可以绕过相同的原始策略,但是它需要在iframed内容和框架页面上都进行更改,因此,如果您无法在两面都请求更改,则此方法对您将不会很有用,我耽心。

有一个浏览器怪癖,它使我们可以略过相同的原始策略-
javascript可以与其自身域上的页面通信,也可以与其已被iframed的页面通信,但是不能与包含该页面的页面通信,例如,如果您具有:

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

然后home.html可以与framed.html(iframed)和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(iframe)发送邮件,但不能home.html(子级无法与父级进行跨域通信)发送消息。

这里的关键是,helper.html能够接收来自消息framed.html,并且 还可以沟通home.html

因此,从本质上讲,在framed.html加载时,它会计算出自己的高度,tellshelper.html会将消息传递到home.html,然后可以调整其所在iframe的大小framed.html

我们发现,从传递消息最简单的方法framed.htmlhelper.html是通过URL参数。为此,请指定framed.html一个iframesrc=''。当它的onload火灾,它评估了自己的高度,并设置了iframe的src在这一点上helper.html?height=N

在中www.foo.com/home.html,需要以下javascript代码(顺便说一下,可以从任何域上的.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>


 类似资料:
  • 问题内容: 在以Swift编写的iOS应用程序中使用自动布局时,如何根据内容调整textField的大小? 加载视图时以及用户键入时,文本字段将根据需要调整大小以适合其内容。 理想情况下,文本字段将在某个点(例如6行)处停止调整大小,并变为可滚动。 问题答案: 您必须使用而不是。 然后,您可以使用该方法。 但是首先,您必须知道一条线的高度。您可以使用以下方法获取该信息: 之后,只需在方法内部调用方

  • 我想调整SVG元素的尺寸以适应其内容。 JSfiddle:http://jsfiddle.net/4pD9N/ 这里我有一个例子。SVG应该“收缩”以适应每边10像素的元素边距。换句话说:我想为未使用的空间裁剪svg... 我知道我必须使用getBBox。但是我如何计算总宽度和总高度呢?

  • 问题内容: 我需要一个textarea,在框中输入文字,它会根据需要增加长度,以避免必须处理滚动条,并且在删除文本后需要缩小!我不想沿着mootools或jquery路线走,因为我有一个轻量级的表单。 问题答案: 您可以通过设置为,然后读取属性来检查内容的高度: 它可以在Firefox 3,IE 7,Safari,Opera和Chrome下运行。

  • 问题内容: 我有数据库内容,其中包含不同类型的数据,例如Youtube视频,Vimeo视频,文本,Imgur图片等。它们的高度和宽度都不同。我在搜索互联网时发现的所有内容都将大小更改为仅一个参数。它必须与弹出窗口中的内容相同。 这是我的HTML代码。我也使用Ajax来调用内容。 问题答案: 由于您的内容必须是动态的,因此可以在模态事件发生时动态设置模态的css属性,这将调整模态的大小,从而覆盖其默

  • 我正在使用ITextRenderer从HTML生成PDF,我需要做的是一张收银机收据。这张收据有动态宽度,当然还有动态内容。这就是说,内容的高度总是不同的,现在我正在努力寻找一种方法来根据内容调整PDF页面的高度。如果收据太大,最后会有一个长长的白色部分,如果是为了缩短PDF的页码,我只需要在一页中。 我正在使用设置页面大小,但根据宽度和数据计算内容高度几乎是不可能的(非常痛苦)。 这是生成 PD

  • 问题内容: 我有一个包含2个iFrame的网页。它们都具有固定的宽度和高度。我正在其中加载外部网站。如何调整这些外部网站的宽度以适合iFrame(就像移动浏览器一样通过更改视口来调整宽度)? 问题答案: 您可以做的是为iframe设置特定的宽度和高度(例如,这些宽度和高度可以等于您的窗口尺寸),然后对其应用比例转换。比例值将是您的窗口宽度和要设置为iframe的尺寸之间的比率。 例如