【问题标题】:Embedding an iframe when iframe height is variable当 iframe 高度可变时嵌入 iframe
【发布时间】:2019-11-06 09:44:57
【问题描述】:

我有一个高度可变的 iframe,这是事先不知道的。

目前,如果 iframe 加载的部分太小,则 iframe 会使用内部滚动条加载。如果 iframe 恰好是较短的 iframe,则在页脚开始之前 iframe 下方有空白区域。

这类问题有解决方案吗?

【问题讨论】:

  • 我在 Chrome 中检查过,但没有发现问题
  • 可能有一种使用javascript的方法。但我注意到的第一件事是内容来自另一个域。您可以更改它还是可以在 iframe 源的响应中包含跨源允许标头?
  • 不幸的是,我无法得到这些答案。 @claytronicon 的答案可能允许您在不访问 iframe 源服务器的情况下调整 iframe 的大小,但我只是不知道自己在做什么。

标签: html iframe


【解决方案1】:

好吧,按照 @relief.melone 的建议,添加简单的 JS 代码来获取 iframe 内容高度并设置容器高度即可。

其他可以提供帮助的简单解决方案,作为替代方案: https://github.com/davidjbradshaw/iframe-resizer

【讨论】:

  • 我已经尝试了 iframe 调整大小的代码,但仍然遇到跨源访问错误。你有没有机会看看这个网站,看看我做错了什么?
  • github.com/davidjbradshaw/iframe-resizer/blob/master/docs/…您是否可以控制要获取的 iframe 文档?
  • 不,我没有控制权
  • @zgall1 看来,如果您无法控制传入的 iframe 内容,您将无法使用上述脚本操作高度。
【解决方案2】:

参考我的评论。您必须解决的第一件事是您的跨源问题。如果响应在其跨源允许标头中不包含当前主机,大多数浏览器将阻止对其他网站的请求。因此,在您的情况下,从您的请求到 iframe 内容的标头需要包含标头

Access-Control-Allow-Origin: http://159.89.229.184

Access-Control-Allow-Mehtods: GET

有关更多信息,另请参阅https://de.wikipedia.org/wiki/Cross-Origin_Resource_Sharing


现在来看看实际的解决方案。

您需要确定 iframe 内容的高度,然后相应地设置高度。您可以通过添加 javascript 函数来做到这一点。在你的头部添加

 <script>
     const setHeight = (frame) => {
       frame.style.height = `${frame.contentWindow.document.body.scrollHeight}px`
     }
 </script>

并且您的 iframe 需要包含 onload 事件

<iframe ... scrolling="no" onload="setHeight(this)" />

这应该可以解决您的问题。但正如我提到的,如果您允许跨源访问。否则,您访问 frame.contentWindowdocument 将被拒绝,并出现类似

的错误

VM747:1 Uncaught DOMException: Blocked a frame with origin "http://159.89.229.184" from access cross-origin frame.

我还做了一个关于故障的例子来演示它是如何工作的(点击显示查看它的实际效果)

https://glitch.com/edit/#!/iframe-varialbe-height

【讨论】:

  • 我已经尝试过这段代码,但仍然遇到跨源访问错误。你有没有机会看看这个网站,看看我做错了什么?
  • 您可以访问这两个站点吗?只有在您控制网络服务器的情况下才能更改跨域标头。根据您使用的网络服务器,必须设置标头以更改其配置。你用的是什么网络服务器?或者更容易。是否可以在同一台服务器上托管两个 html?我也许可以在这方面为您提供帮助,但您应该为此提出另一个问题,因为它与该主题并不真正相关
  • 如果您能在赏金到期之前接受这个问题的答案,那就太好了:D 只需发布有关您的 cors 问题的问题的链接,我会尽力帮助您
  • 我只控制一台网络服务器。我能否让另一台服务器的所有者更改他们的代码是非常值得怀疑的。
  • 你控制哪一个?
【解决方案3】:

我遇到过 iFrame 内容的高度动态变化的情况,我告诉父框架(包含 iFrame)使用 postMessage 相应地改变它的高度:像这样

父窗口:

 <section class="module">
                <div class="row">
                    <!-- Content column start -->
                    <div class="col-sm-12" id="web-version-container">
                         <iframe id="web-version-frame" src="index.html" allowfullscreen=false frameborder="0" style="width:100%; height:100%;min-height:800px;">
                        </iframe>
                    </div>
                </div> <!-- .row -->    
        </section>

        <script>            
        window.addEventListener('message', function(event) { 
            // IMPORTANT: Check the origin of the data! 
            if (~event.origin.indexOf('https://yourdomain.com')) { 
                // The data has been sent from your site 

                if (event.data.messageName) {
                        switch (event.data.messageName) {
                            case "documentHeight":
                            if (event.data.messageValue && parseInt(event.data.messageValue) > 500);
                            var newHeight = parseInt(event.data.messageValue) + 50;
                            $("#web-version-frame").css("height",newHeight.toString() + "px"); 
                            break;
                    }
                }
                // The data sent with postMessage is stored in event.data 
            } else { 
                // The data hasn't been sent from your site! 
                // Be careful! Do not use it. 
              return; 
            } 
            }); 

        </script>

子窗口:

if (window.parent) {
          window.parent.postMessage(
            {
              messageName: "documentHeight",
              messageValue: $(".content-active").height()
            },
            "*"
          );
        }

https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

【讨论】:

    【解决方案4】:

    在您在第二个示例中添加的 iframe 中,css 属性 min-height 为 1600px。使用最小高度或高度的百分比来解决问题。添加了最小高度:275vh;它解决了这个问题。

    .job-detail-iframe iframe{
        width: 100%;
        min-height: 275vh;
    }
    

    检查this 也可以作为参考。

    【讨论】:

    • 这不是解决此问题的通用方法。
    猜你喜欢
    • 2013-04-09
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2017-04-14
    • 2018-07-09
    • 2017-10-20
    相关资源
    最近更新 更多