Magnific Popup iframe自动调整内容更改(跨域)

时间:2014-05-14 14:05:21

标签: javascript jquery iframe autoresize magnific-popup

目前我们只使用iframe类型的Magnific Popup(jQuery插件)。但是,当iframe的内容动态增长/缩小时,弹出窗口不会调整其高度。我认为内联内容调整似乎有效。

我搜索了文档和网络,但找不到任何解决方案。

因此,我一直在寻找第三方解决方案,以便在内容更改时自动调整大小(跨域)iframe。 到目前为止我找到的最好的(寻找一个简单的解决方案)是:

jQuery resize event(使用Fork因为原来似乎没有维护)
能够结合以下内容绑定resize事件:

jQuery postMessage(出于同样的原因使用Fork)
实现iframe和父级之间的跨域通信(因为相同的源策略)。

(不能发布指向分叉的链接,因为这是我的第一个问题而且我只允许发布两个链接...)

我让那些工作用于简单的测试iframe,现在我想将它实现为Magnific Popup。

刚才我在文档中发现了调整大小事件,该事件已内置于MFP中:"仅在高度更改或布局强制时调整事件触发器"。但是,当我根据选择输入在iframe中显示更多/更少的文本时,它不会触发(目前为止仅测试,但这就是我目前所需要的)。

所以在实现所有这些插件之前,我想也许我会问是否有人已经有了这个工作解决方案,或者我只是忽略了内置函数/没有正确使用它。我是JavaScript的新手。

提前致谢

3 个答案:

答案 0 :(得分:2)

您可以使用:https://github.com/davidjbradshaw/iframe-resizer

这要求您在加载<iframe>

的页面中添加脚本
<script type="text/javascript" src="../iframeResizer.min.js"></script> 

除了外部页面,您还要尝试加载<iframe>的内部:

<script type="text/javascript" src="../iframeResizer.contentWindow.min.js"></script>

注意:如果您尝试加载不属于您的外部域名,这可能对您不起作用 - 因为您必须在两个地方添加一个脚本(对不起),但是如果您是尝试在非HTTPS页面中加载HTTPS页面。

我还为剧本中的大胆弹出窗口定义了自己的标记。

      $(document).ready(function() {
        $('.open-popup').magnificPopup({
            items: {src: '/file.html'},
            type: 'iframe',
              iframe: {
                 markup: '<div class="iframe-popup">'+
                            '<iframe class="mfp-iframe" frameborder="0" scrolling="no" allowtransparency="true" allowfullscreen></iframe>'+
                            '<div class="mfp-close"></div>'+
                          '</div>'
              },
        });
      });

您可以使用CSS轻松地将iframe的宽度调整为父窗口的100%...只要您的父级max-width设置为.iframe-popup,请参阅上面的示例中的 callbacks: { resize: function() { $('iframe').iFrameResize([{ enablePublicMethods: true, checkOrigin: false }]); } )。

我发现一个重要的事情是,它的代码中包含了一个调整大小回调:

{{1}}

那就是它。每次都适合我。

答案 1 :(得分:1)

由于Magnific Popup似乎没有自动调整大小(非视频)iframe的内置解决方案,因此我使用外部插件构建了自己的解决方案。

要检查iframe内容高度是否已更改,我使用了this Fork of jQuery resize event plugin,它与当前的jQuery版本1.11.1兼容。

要将新的高度从iframe发送到父窗口(跨域兼容),我最终使用了这个jQuery postMessage Plugin,它似乎维护得很好,可以在IE6 +中使用。

此外,我切换到使用Magnific Popup的“type:inline”来显示iframe,因为“type:iframe”似乎特别针对iframe视频嵌入设置为YouTube视频,这让我很难设置样式弹出窗口高度以简单的方式。

可能有一个更清洁/直接的解决方案,这就是为什么我没有深入细节。另一个原因是我使用了很多行代码来实现MFP,因为我是JS的新手,它可能不是最好的代码;) 但由于没有答案,我现在将此标记为已接受的答案,因为它有效。

最佳解决方案当然是Magnific Popup会有内置解决方案(功能请求!)。

答案 2 :(得分:0)

我一直在寻找解决方案,并且只在不使用插件的情况下找到了非跨域通信的简单解决方案。 (我没有测试跨域,但我不能说它不起作用。)

iframe有一种方法可以与父母的窗口进行固有的交流。您可以通过iframe

上的此代码调整父级的大小
<script>
    $(document).ready(function() {

        // access the iframe's parent in order to resize
        var contentHeight           = $('.your-iframe-wrapper').height(),
            parentBody              = window.parent.document.body;          

        $('iframe', parentBody).animate({
            height: contentHeight + 100,
            maxHeight : "100%"
        }, 200)     

    });

</script>

当您的iFrame加载时,它应该运行此脚本,并访问iFrame的父窗口并从那里调整大小。希望这可以帮助别人。