iframe 跨域通信实现其高度自适应解决方案

发布于 2021-11-21 16:17:12 字数 3153 浏览 1307 评论 2

背景

大多数应用平台中会通过 iframe 的方式插入跨站的应用。大多数时候基本上能满足需求,但是如果遇到一些比较特殊的应用,他们的高度并不是固定的,会随着应用内容而变化。虽然会有滚动条的出现,但是这样从某种程度上会影响到页面的美观。于是乎,有没有一种方案可以让 iframe 的高度随着 iframe 内容而变化呢?

尝试

1、通过 JavaScript获取 iframe 的内容高度。设置 iframe 的告诉和内容高度相同。

这种方案在同域的情况下百试不爽,但是缺点是在跨域的情况下,却无能为力。

2、在 iframe 里面引入一段 js,通过 js 实时检测 iframe 内容的高度,发送到服务器。嵌入 iframe 的页面不停的从服务器获取传过来的 iframe 的高度,并设置。

这种方案,确实可以解决问题,但是却有些令人不爽的地方。

  • 不停的向服务器发送数据,增加量服务器的负担。
  • Javasript 不停的请求服务器,获取新的高度。这种不停的轮询,也确实让人蛋疼。

3、在上面的基础上如果能避开服务器,不失为是一种好方法,但是如何才能避开服务器呢?

我们尝试了 cookie、local storage 等等,希望能有一种方案可以跨过域的限制,但都以失败告终。最后,突然灵光一现,如果能通过一层代理作为桥梁解决跨域的问题,那么所有的问题不就会迎刃而解了么?

方案

域!我们通过上面的实验已经在 iframe 插入了一段 js,这就意味着我们可以随意的控制 iframe 里面的内容了。这时候如果我们在iframe中通过js插入一个iframe地址和最外面的页面是同域的话,是不是就可以通讯了呢?于是就有了下面的模型

a.com/index.html

<body>
    <iframe src="b.com">
        content
        <script src="a.com/iframe.js" type="text/javascirpt"> </script>
        <!--通过javascript加入的iframe-->
        <iframe src="a.com/height.html"></iframe>
    </iframe>
</body>

a.com/iframe.js

    var height = document.height;
    var iframe2 = document.createElement('iframe');
    iframe2.height = 0;
    iframe2.src = "http://a.com/height.html";
    document.body.appendChild(iframe2);

a.com/height.html

<body>
    <script type="text/javascript">
         alert(top.document.getElementsByTagName('iframe')[0])
    </script>
</body>

通过上面的代码我们惊奇的发现,height.html确实可以取到a.com/index.html里面的东西。

实现

于是乎,问题就简单了,只要把 iframe 的高度传给 index.html 就 ok 了,改写代码如下

a.com/iframe.js

    var height = document.height;
    var iframe2 = document.createElement('iframe');
    iframe2.height = 0;
    iframe2.style.display = 'none';
    iframe2.src = "http://127.0.0.1/test3.html?height=" + document.height + '&v' + Math.random();
    document.body.appendChild(iframe2);
    setInterval(function() {
        if(document.height!=height){
            iframe2.src = "http://a.com/height.html?height=" + document.height + '&v' + Math.random();
            height=document.height;
        }
    }, 10);

a.com/height.html

<body> 
    <script type="text/javascript">
        var height=/height=(\d+)&/.exec(location.href)[1];
        top.document.getElementsByTagName('iframe')[0].height = parseInt(height);
    </script>
</body>

总结

问题解决了,满身的轻松,该方案的主要方法就是在 iframe 创建一个同源的 iframe,通过地址传递 iframe 的高度,这样的话就可以打通 iframe 和外界的联系,实现了高度的自适应。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

JSmiles 回复 douya_cai 2022-11-11 14:42:15

就是示例代码里面的 height.html

douya_cai 2022-11-11 14:33:33

test3.html 又是什么

~没有更多了~

关于作者

不再见

暂无简介

0 文章
0 评论
346 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文