设为首页 收藏本站
查看: 1979|回复: 0

[经验分享] iframe大小自适应

[复制链接]
发表于 2017-2-25 10:31:23 | 显示全部楼层 |阅读模式
前几天,舍友去某互联网公司面前端研发工程师。回来后,他就跟我们聊了下面试官给他出的题。其中,有一道题是“如何实现iframe高度的自适应?”。好吧,我承认,我听到iframe这个词的第一反应就是:这个东西性能差、搜索引擎不友好等等。由于这样的偏见,还真没有好好研究一下iframe。其实,iframe对于第三方的广告插入还是非常有用的。这两天,好好研究了下iframe自适应的问题。研究的过程中,利用nodejs搭建了简单的服务器来测试方法的正确性。

同域下的iframe自适应
  同域下实现iframe自适应比较简单,可以直接利用javascript操作DOM来达到目的。下面的示例是在http://localhost:8887作用域下,iframe.html引入index.html。
  index.html









<img src="ghost.png" alt="ghost" style="width:600px; height: 300px;">


  iframe.html









<iframe id="iframe" src="index.html" frameborder="0"scrolling="no" style="border: 0px;"></iframe>

  

<script>

    // 兼容性代码

  function autoHeight(iframe) {

    if (iframe) {

      var iframeWin = iframe.contentWindow || iframe.contentDocument.parentWindow;

      if (iframeWin.document.body) {

        iframe.height = iframeWin.document.documentElement.scrollHeight || iframeWin.document.body.scrollHeight;

        iframe.width = iframeWin.document.documentElement.scrollWidth || iframeWin.document.body.scrollWidth;

      }

    }

  }

  window.onload = function() {

    autoHeight(document.getElementById('iframe'));

  }

</script>


  显示效果
DSC0000.jpg

  注意:一定要通过服务器来访问iframe.html,像chrome这样的浏览器访问本地静态文件会有限制,导致错误!

跨域下的iframe自适应
  跨域(只要协议、域名、端口有任何一个不同,都被当作是不同的域)的时候,由于js的同源策略,父页面内的js不能获取到iframe页面的大小。
  解决方案原理:使用代理页面,并通过location.hash来进行传值。
  示例如下:http://localhost:8887下的一个页面a.html使用iframe标签引入http://localhost:8888下的一个页面b.html。在http://localhost:8887下创建一个agent.html页面做代理,b.html此时可利用隐藏的iframe通过location.hash将自己的大小传给agent.html。由于agent.html与a.html在同一个域下,所以agent.html可直接操作a.html,不受js同源限制。
  a.html









// 引入b.html

<iframe id="a_iframe" src="http://localhost:8888/b.html"frameborder="0" scrolling="no" style="border: 0;"></iframe>


  b.html









<img src="ghost.png" alt="ghost" style="width:600px; height: 300px;">

  

// 通过隐藏的iframe,利用loacation.hash传值

<iframe id="b_iframe" src="http://localhost:8887/agent.html"height="0" width="0" frameborder="0" style="display: none;"></iframe>

  

<script>

  (function autoHeight() {

    var width = Math.max(document.body.scrollWidth, document.body.clientWidth);

    var height = Math.max(document.body.scrollHeight, document.body.clientHeight);

    var b_iframe = document.getElementById("b_iframe");

    b_iframe.src = b_iframe.src + "#" + width + "|" + height;

  })();

</script>


  agent.html









<script>

  var a_iframe = window.parent.parent.document.getElementById("a_iframe");

  var hash_url = window.location.hash;

  if (hash_url.indexOf("#") >= 0) {

    var hash_width = hash_url.split("#")[1].split("|")[0] + "px";

    var hash_height = hash_url.split("#")[1].split("|")[1] + "px";

    a_iframe.style.width = hash_width;

    a_iframe.style.height = hash_height;

  }

</script>


  显示效果
DSC0001.jpg


结语

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346937-1-1.html 上篇帖子: js-shortid:优雅简洁地实现短ID 下篇帖子: 如何把 Callback 接口包装成 Promise 接口
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表