【问题标题】:HTML5 Resize top-level document iframe from inside a nested iframeHTML5 从嵌套 iframe 中调整顶级文档 iframe 的大小
【发布时间】:2013-12-12 10:40:21
【问题描述】:

这个问题可能看起来很难理解,所以我会尽力说明它。

假设我有以下 index.html 正文:

<iframe name="parent"></iframe>

parent iframe 中,我加载了以下页面正文:

<iframe name="nested-navigation"></iframe>
<iframe name="nested-parent"></iframe>

nested-parent iframe 中,我加载了另一个页面。在另一个页面中,我需要以某种方式访问​​顶级(index.html)文档parent iframe,以便我可以使用nested-parent iframe 内容大小调整其内容的高度。

我使用嵌套页面正文的加载内容正确调整了 index.html 的 parent iframe 高度。但是,在下一次嵌套中,我无法访问 index.html 文档上下文,因此无法获取 parent iframe 元素。

我需要帮助来确定如何访问 index.html 的 parent iframe。我该怎么做?

页面已上线,可在此处查看效果:

www.ngeneersinc.com

如果您单击Projects 导航链接,它将正确加载页面并调整parent iframe 的大小。可悲的是,当您单击此嵌套页面内的 Ngen 导航链接时,顶级 (index.html) iframe (parent) 不会调整大小,并且内容会被剪切到在上一页。

编辑:

基本上,我正在尝试在我的 javascript 函数中执行以下操作:

var e = document.getElementById("nested-parent").contentWindow; // which is OK
var x = e.contentWindow; // which is 'undefined' because I lost the context of the index.html document

【问题讨论】:

    标签: javascript html css iframe resize


    【解决方案1】:

    您可以使用以下 jQuery 插件来完成此操作:
    http://benalman.com/projects/jquery-postmessage-plugin/

    然后将以下代码添加到您包含在 iframe 文档父窗口中的 javascript 文件中:

    var iFrames = [];
    var iFrameCounter = 0;
    
    // Get the parent page URL as it was passed in, for browsers that don't support
    // window.postMessage
    var parent_url = decodeURIComponent(document.location.hash.replace(/^#/, ''));
    
    // The first param is serialized using $.param (if not a string) and passed to the
    // parent window. If window.postMessage exists, the param is passed using that,
    // otherwise it is passed in the location hash (that's why parent_url is required).
    // The second param is the targetOrigin.
    function SetHeight() {
        var id = Number(parent_url.replace(/.*#(\d+)(?:&|$)/, '$1'));
        $.postMessage({ if_height: $(document).outerHeight(true), id: id }, parent_url, parent);
    };
    
    // Adds the iframe for the given url to the given container
    function CreateFrame(container, url) {
        $(function () {
            // Pass the parent page URL into the Iframe in a meaningful way
            var src = url + '#' + encodeURIComponent(document.location.href + "#" + iFrameCounter);
    
            // Append the iFrame into the DOM.
            var html = '<iframe id="iFrame' + iFrameCounter + '" src="' + src + '" width="100%" scrolling="no" frameborder="0">Your browser lacks support for iFrames!<\/iframe>';
            iFrames[iFrameCounter] = { id: "iFrame" + iFrameCounter, container: container, if_height: 0 };
    
            // Add iFrame to DOM
            $(container).append($(html));
            iFrameCounter++;
        });
    }
    
    $(function () {
        // Setup a callback to handle the dispatched MessageEvent event. In cases where
        // window.postMessage is supported, the passed event will have .data, .origin and
        // .source properties. Otherwise, this will only have the .data property.
        $.receiveMessage(function (e) {
    
            // Get frameId
            var id = Number(e.data.replace(/.*id=([\d-]*).*/, '$1'));
    
            var frame = iFrames[id];
    
            // Get the height from the passsed data.
            var h = Number(e.data.replace(/.*if_height=([\d-]*).*/, '$1'));
    
            if (!isNaN(h) && h > 0 && h !== frame.if_height) {
                // Height has changed, update the iframe.
                $("#" + frame.id).css("height", (frame.if_height = h));
                $("#" + frame.id).css("min-height", (frame.if_height = h));
                $("#" + frame.id).css("max-height", (frame.if_height = h));
    
                // Also update the parent element of the iframe.
                $("#" + frame.id).parent().css("height", (frame.if_height = h));
                $("#" + frame.id).parent().css("min-height", (frame.if_height = h));
                $("#" + frame.id).parent().css("max-height", (frame.if_height = h));
            }
        });
    });
    

    然后使用以下代码在父窗口中创建 iframe:

    <script type="text/javascript">
         $(document).ready(function () {
             CreateFrame("#someiFrameContainer", url);
         });
    </script>
    <div id="someiFrameContainer"></div>
    

    然后每次 iFrame 内文档的高度发生变化时,都会从 iFrame 页面调用此函数:

    SetHeight();
    

    这将导致 iframe 页面向其父窗口发送一条包含其新总高度的消息(支持跨域),这将捕获该消息并更新 iframe 的大小。这要求父窗口还包括上面的脚本文件,因为该文件注册了事件和函数以在使用CreateFrame();时自动处理这些消息@

    【讨论】:

    • 我没有使用上面所有的代码,但我找到了我需要的部分。谢谢!
    猜你喜欢
    • 2011-11-08
    • 2014-06-04
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2011-08-02
    相关资源
    最近更新 更多