调整 iframe 的宽度和高度以适应其中的内容

IT技术 javascript html iframe adjustment
2021-01-22 13:52:01

我需要一个解决方案自动调节widthheight一个iframe勉强适合其内容。重点是宽度和高度可以iframe在加载后更改我想我需要一个事件动作来处理 iframe 中包含的主体尺寸的变化。

6个回答
<script type="application/javascript">

function resizeIFrameToFitContent( iFrame ) {

    iFrame.width  = iFrame.contentWindow.document.body.scrollWidth;
    iFrame.height = iFrame.contentWindow.document.body.scrollHeight;
}

window.addEventListener('DOMContentLoaded', function(e) {

    var iFrame = document.getElementById( 'iFrame1' );
    resizeIFrameToFitContent( iFrame );

    // or, to resize all iframes:
    var iframes = document.querySelectorAll("iframe");
    for( var i = 0; i < iframes.length; i++) {
        resizeIFrameToFitContent( iframes[i] );
    }
} );

</script>

<iframe src="usagelogs/default.aspx" id="iFrame1"></iframe>
条件不仅无用,而且在极少数情况下,它的目的是保证会引起问题。为什么要检查某个方法是否存在,然后在检查之外使用该方法?
2021-03-16 13:52:01
也不要忘记它不是跨域的。其原因是出现一种错误:如果域不同,则访问属性“文档”的权限被拒绝可以在此处找到解决方案
2021-03-25 13:52:01
@StoneHeart:是的,它是跨浏览器的。由于 DOM 规范中未定义的 contentWindow 属性,代码不符合标准。在 DOM 规范中存在名为 contentDocument 的属性,但 Internet Explorer 6(和 7?)不支持它。可以改用 contentWindow 属性,它在所有常见浏览器(Gecko、Opera、Webkit、IE)中实现。
2021-03-29 13:52:01
我想你的意思是DOMContentLoaded,因为DOMContentReady似乎不是一个东西:developer.mozilla.org/en-US/...
2021-03-30 13:52:01
if(document.getElementById) 有什么用?
2021-04-06 13:52:01

嵌入的单行解决方案:从最小尺寸开始并增加到内容尺寸。不需要脚本标签。

<iframe src="http://URL_HERE.html" onload='javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+"px";}(this));' style="height:200px;width:100%;border:none;overflow:hidden;"></iframe>

它不是跨域。也许服务器需要向框架页面添加一些标题?
2021-03-18 13:52:01
运行代码片段不适用于 Safari 9.1.1 可能包含 SO 问题?
2021-03-20 13:52:01
@Stan 文档中的元素的边距可能大于正文的边距,这在您的解决方案中也没有考虑在内。
2021-03-22 13:52:01
这里提到的所有答案都scrollHeight/scrollWidth应该稍微调整一下,以考虑到身体边距。浏览器为文档的 body 元素应用默认的非零边距(它也适用于加载到框架中的内容)。工作解决方案,我发现是补充一点:parseInt(window.getComputedStyle(this.contentDocument.body).margin
2021-04-01 13:52:01

跨浏览器的jQuery 插件

跨浏览器、跨域,用于mutationObserver根据内容保持 iFrame 的大小并postMessage在 iFrame 和主机页面之间进行通信。使用或不使用 jQuery。

iframe-resizer 库是最强大的解决方案。
2021-04-08 13:52:01

迄今为止给出的所有解决方案只考虑了一次性调整大小。您提到您希望能够在修改内容后调整 iFrame 的大小。为此,您需要在 iFrame 内部执行一个函数(一旦内容发生更改,您需要触发一个事件来说明内容已更改)。

我被这个问题困扰了一段时间,因为 iFrame 内的代码似乎仅限于 iFrame 内的 DOM(并且无法编辑 iFrame),并且在 iFrame 外执行的代码被 iFrame 外的 DOM 卡住(并且不能t 接收来自 iFrame 内部的事件)。

解决方案来自发现(通过同事的帮助)可以告诉 jQuery 使用什么 DOM。在这种情况下,父窗口的 DOM。

因此,像这样的代码可以满足您的需求(在 iFrame 中运行时):

<script type="text/javascript">
    jQuery(document).ready(function () {
        jQuery("#IDofControlFiringResizeEvent").click(function () {
            var frame = $('#IDofiframeInMainWindow', window.parent.document);
            var height = jQuery("#IDofContainerInsideiFrame").height();
            frame.height(height + 15);
        });
    });
</script>
如何自动触发事件而不是jQuery("#IDofControlFiringResizeEvent").click(function ()
2021-03-13 13:52:01
对于尝试跨域进行此类工作的任何人,请查看window.postMessage (IE8+) 并注意您需要在主机(父)和源(在 iframe 中)文档上的自定义脚本。jQuery postmessage 插件可能会有所帮助。由于您需要主机和源上的脚本,因此让主机使用 JSON-P 通过 AJAX 加载内容可能会更容易。
2021-03-14 13:52:01
这个的完整代码是什么?我假设脚本在 iframe html 中?
2021-03-15 13:52:01
这是完整的代码,是的,它在 iFrame 的 HTML 中运行。“window.parent.document”部分指定 jQuery 选择器应该使用父文档的 DOM,而不是您所在的文档(在 iFrame 内)。
2021-03-17 13:52:01
这个精美的作品,如果在iframe的父文档和文件来自同一域都是如果它们不是(或者,在 chrome 中,如果它们都是本地文件),那么浏览器的“同源”安全策略就会启动,它会阻止 iframe 内容修改父文档。
2021-03-23 13:52:01

如果 iframe 内容来自同一个域,这应该很好用。不过它确实需要 jQuery。

$('#iframe_id').load(function () {
    $(this).height($(this).contents().height());
    $(this).width($(this).contents().width());
});

要动态调整大小,您可以执行以下操作:

<script language="javaScript">
<!--
function autoResize(){
    $('#themeframe').height($('#themeframe').contents().height());
}
//-->
</script>
<iframe id="themeframe" onLoad="autoResize();" marginheight="0" frameborder="0" src="URL"></iframe>

然后在 iframe 加载的页面上添加:

<script language="javaScript">
function resize()
{
    window.parent.autoResize();
}

$(window).on('resize', resize);
</script>
当来源来自不同的域时,是否有任何简单的方法可以做到这一点?
2021-03-18 13:52:01