【问题标题】:iFrame not expanding to full content height, even with jQuery script targeting itiFrame 没有扩展到完整的内容高度,即使 jQuery 脚本针对它
【发布时间】:2016-06-20 08:49:10
【问题描述】:

这里是iFrame in question

在标题中我有以下 jQuery 代码:

<script>

    $(function(){

        var iFrames = $('iframe');

        function iResize() {

            for (var i = 0, j = iFrames.length; i < j; i++) {
              iFrames[i].style.height = iFrames[i].contentWindow.document.body.offsetHeight + 'px';}
            }

            if ($.browser.safari || $.browser.opera) {

               iFrames.load(function(){
                   setTimeout(iResize, 0);
               });

               for (var i = 0, j = iFrames.length; i < j; i++) {
                    var iSource = iFrames[i].src;
                    iFrames[i].src = '';
                    iFrames[i].src = iSource;
               }

            } else {
               iFrames.load(function() {
                   this.style.height = this.contentWindow.document.body.offsetHeight + 'px';
               });
            }

        });

</script>

嵌入看起来像这样:

 <div id="appointy">

<iframe src="//hfxtutoring.appointy.com/?isGadget=1" class="iframe" scrolling="no" frameborder="0" allowtransparency="true" style="text-align: center; -webkit-overflow-scrolling: touch; overflow: auto;">
</iframe>

</div>

CSS 是这样的:

/*  to ensure proper scrolling and overflow handling on mobile devices, put this styling in a div wrapper around the iframe because it's unreliable in css:   -webkit-overflow-scrolling: touch; overflow: auto; */

.iframe 
{
    border: none;
    width: 100%;
    margin-right: 10px;
    padding: 0;
    border: 1px
 }

我想要的是 iFrame 根据内容高度调整大小,而不是设置高度。我不完全明白如何让它像this example 一样工作。

【问题讨论】:

  • 无法在跨域 iframe 内访问
  • 哦。有没有办法使这项工作?
  • 你可以试试iframe resizer
  • 我无法访问托管 iFrame 的页面以插入该代码。它是第 3 方网站。 (预约),我只能访问我的页面。
  • 小心浏览器对 CSS 函数的支持,先生。

标签: javascript jquery iframe size


【解决方案1】:

你可以试试 CSS。 Here is my codepen.

iframe {
  height: calc(100vh - 20px);
  width: calc(100vw - 40px);
}

我添加了 calc 函数,以便让您了解如何进一步动态控制高度/宽度的大小。

【讨论】:

  • 感谢您提供的唯一答案,而不是告诉我为什么某些东西不起作用,而是给了我一些有效的东西,并且对于我真正想要的解决方案来说是可以接受的。
  • 我很高兴,很高兴这个建议很有帮助。
  • 这个解决方案并不完美,CSS 中的 calc() 没有得到广泛支持。如果 OP 只指定了一个特定的浏览器,那么肯定是要走的路,否则会产生轻微的误导性答案。请注意,这在您最新的浏览器上可能看起来不错,但查看该页面的其他人可能会觉得很奇怪。 w3schools.com/cssref/func_calc.asp
【解决方案2】:

你不能这样做,它会破坏互联网。如果您可以更改或编辑 iframe 的内容,您可能会在指定站点上造成巨大的混乱。有充分的理由阻止这种事情。可悲的是,“更改或编辑”还意味着对 iframe 的内容进行任何操作,包括仅针对它进行查询。

如果您可以在指定站点和您的服务器上启用 CORS,这将是小菜一碟。这将让您运行一个脚本来获取可滚动 div 的高度,然后您可以简单地从那里设置 iframe 的高度。

否则你不能这样做。由于针对跨站点/跨域脚本实施的规则,您无法获得 iframe 中内容的高度。

var y = $("iframe")
y.contents()

对 iframe(在 chrome 中)尝试的任何操作都将导致: jquery.min.js:2 Uncaught DOMException: 无法从 'HTMLIFrameElement' 中读取 'contentDocument' 属性: 阻止具有源 "http://atlantictutoring.com" 的框架访问跨域框架。(...)

如果您的应用是指定的子域,那么您也可以这样做,但是设置了一些规则来防止您欺骗其他域。 :/

还使用 Chrome 的开发控制台手动调整指定 url 处的 css 显示滚动条是一个 JS 滚动条,所以那里还有一大堆东西要处理。

【讨论】:

  • 我不知道为什么这被否决了,或者为什么人们在没有尊严地告诉人们原因的情况下投反对票。这确实是避免合法站点中的 js 注入/欺骗的安全措施。
【解决方案3】:

您是否尝试将allowfullscreen 添加到 iframe?

<iframe src="{URL}" {other params}  allowfullscreen></iframe>

您可能还需要调整包装 div 的 CSS。

【讨论】:

  • 在包裹 div 时将高度设置为 100%
  • @NictraSavios 你不应该需要 jQuery 来实现这个效果。如果这仍然不适合您,请告诉我,我将整理一个工作示例。
  • 它仍然不是,这里是实际站点的链接:atlantictutoring.com/booking 我现在将小程序设置为 100vh - 这是一个很好的第二个。如果代码有效,它将覆盖 100vh。
  • 啊,我明白你的意思了。当您单击“关于”选项卡时,应用程序的高度不会重新调整到页面。这是一个棘手的问题......这有帮助吗? stackoverflow.com/questions/525992/…
  • 很遗憾没有,因为我无法访问他们的 iframe。
【解决方案4】:

处理 iFrame 是一个 20 年前的问题,仍然没有一个简单的原生选项。

查看您的代码,未调用 iResize() 函数。它也只会在页面加载时调整 iFrame 的大小,您还需要检测内容是否发生变化,或者窗口是否调整大小等,它们是大约 20 个可能导致内容改变大小的不同事件。

我还要指出,使用 offsetHeight 不会包括 body 标签的高度和边距。

我编写了一个库来处理 iFrame 存在的大多数问题,并且它在保持 iFrame 大小适合您的内容方面做得不错。如果您能够将 JS 添加到 iFrame,它甚至可以与 3rd 方站点跨域工作。

您可能会发现它有助于解决此问题以及 iFrame 会给您带来的其他问题。

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

如果您无权将 JS 添加到 iFrame,则无法在浏览器中执行此操作,因为安全保护功能会阻止您干扰远程站点。如果您想了解我的项目如何解决这个问题,请查看 postMessage API。

【讨论】:

  • 我没有能力将JS添加到框架中,所以你的解决方案是不可能的。还是谢谢你。
猜你喜欢
  • 2019-06-15
  • 2011-09-28
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2012-07-04
相关资源
最近更新 更多