跨域iframe高度自适应 改进版(兼容)

简介:

采用JavaScript来控制iframe元素的高度是iframe高度自适应的关键,同时由于JavaScript对不同域名下权限的控制,引发出同域、跨域两种情况。

由于客户端js使用浏览器的同源安全策略,跨域情况下,被嵌套页面如果想要获取和修改父页面的DOM属性会出现权限不足的情况,提示错 误:Permission denied to access property 'document'。这是因为除了包含脚本的文档载入的主机外,同源策略禁止客户端脚本链接到其他任何主机或者访问其他任何主机的数据。这意味着访问一 个web服务的javascript代码通常只有在它也驻留在Web服务本身所在的同一个服务器的时候才有用。

所以在跨域情况下,我们遇到的问题就是:父窗口无法获得被嵌套页面的高度,而且被嵌套页面也无法通过驻留在其服务器上的js修改父窗口Dom节点的属性。所以我们需要一个媒介,来获得被嵌套页面的高度同时又能修改主界面iframe节点的高度。

思路:现有主界面main在域a下,被嵌套页面B在域b下,被嵌套页面B又嵌套一个在域a下的中介页面A。 当用户打开浏览器访问mail.html的时候载入B,触发B的onload事件获取其自身高度,然后B载入A,并将高度值作为参数赋值给A的 location对象。这样A就可以通过location.hash获得B的高度。(location是javascript里边管理地址栏的内置对象, 比如location.href就管理页面的url,用location.href=url就可以直接将页面重定向url。而location.hash 则可以用来获取或设置页面的标签值。比如http://domain/#admin的location.hash="#admin"。利用这个属性值可以 做一些非常有意义的事情。)。由于A和main页面同域,所以可以修改main的dom节点属性,从而达到我们设置iframe标签高度的目的。

 

关键代码:

iframe主页面:main.html

Java代码   收藏代码
  1. <iframe id="iframeB" name="iframeB" src="www.b.com/B.html" width="100%" height="auto" scrolling="no" frameborder="0"></iframe>  

 iframe嵌套页面:B.html,放在页头或页尾每个页面都能调到

Java代码   收藏代码
  1. <iframe id="iframeA" name="iframeA" src="" width="0" height="0" style="display:none;" ></iframe>  
  2. <script type="text/javascript">  
  3. function sethash(){  
  4.     var hashH = Math.max(document.body.scrollHeight,document.body.clientHeight);//获取自身高度  
  5.     urlC = "www.a.com/A.html"//设置iframeA的src  
  6.     document.getElementById("iframeA").src=urlC+"#"+hashH; //将高度作为参数传递  
  7. }  
  8. window.onload=sethash;  
  9. </script>  

 中介页面:A.html  
iframe页面主要的功能就是从地址栏中读取#height的值,然后调整iframe高度,因为被嵌入页面content的页面是会变化的,所以每500毫秒就会检测下。目前在项目中实现的效果还是可以的。

Java代码   收藏代码
  1. <script>  
  2. //function iframeHeight() {  
  3.     var ifr = parent.parent.document.getElementById('iframeB');//A和main同域,所以可以访问节点  
  4.     var hash = window.location.hash; //访问自己的location对象获取hash值  
  5.     if(hash){  
  6.         hash = hash.replace('height=''');  
  7.         ifr.style.height = hash.split('#')[1]+ 'px';   
  8.     }  
  9. //}  
  10. //window.setInterval("iframeHeight()", 500);    
  11. </script>  

 同域情况下就不用多说了,直接在被嵌套的页面B中获取其自身高度并操作其父窗口main的dom属性即可。

相关文章
|
存储 Java 关系型数据库
家政服务管理平台
家政服务管理平台
|
存储 缓存 编解码
Web端短视频编辑器的设计与实现 - 像做PPT一样做视频
对于视频的生产,一般的方案是交由专业机构去创作,但这将花费很多预算,如果我们能提供一个工具,基于知识的通用结构沉淀一些视频模版,让用户快速创作出视频知识内容岂不美哉?让想法再奔放些,如果我们能直接从知识库中抽取结构化的知识内容直接生成视频或是半成品视频,用户只需要稍作调整就能发布,这想想就很酷吧?是的,小蜜视频创作工具我就是想做这样一件事情。本篇分享来自阿里巴巴前端工程师李志成(敦固)在第十六届D2前端技术论坛的分享。
4124 0
Web端短视频编辑器的设计与实现 - 像做PPT一样做视频
|
8月前
|
存储 缓存 监控
基于淘宝商品详情 API 的竞品监控系统搭建:价格 / 库存 / 促销实时追踪
淘宝商品详情 API 的竞品监控系统搭建:价格 / 库存 / 促销实时追踪
|
8月前
|
SQL 数据库
【赵渝强老师】达梦数据库的事务隔离级别
达梦数据库支持多客户端并发访问,为避免数据不一致,提供三种事务隔离级别:读未提交、读已提交(默认)和串行化。通过SQL可查看隔离级别,其默认的读已提交级别可有效防止脏读问题。
409 0
|
机器学习/深度学习 人工智能 自然语言处理
探索AI技术:从基础原理到实际应用的全面剖析
本文旨在为读者提供关于人工智能(AI)技术的全面了解。从探讨AI的基本概念和关键技术入手,逐步深入到AI在不同领域的应用实例,包括医疗、金融和自动驾驶等。同时,文章也详细讨论了当前AI技术面临的伦理问题和社会影响,以及可能的解决方案。最后,本文还展望了AI技术未来的发展趋势,帮助读者更好地理解这一前沿科技的现状与未来。
1252 6
|
数据可视化 数据挖掘 知识图谱
精选:15款顶尖Python知识图谱(关系网络)绘制工具,数据分析的强力助手
这里有15款免费工具推荐:NetworkX(Python基础),Graph-tool(C++速度),Graphviz(可视化库),ipycytoscape(Jupyter集成),ipydagred3,ipySigma(NetworkX + Web),Netwulf(交互式),nxviz(Matplotlib绑定),Py3plex(复杂网络分析),Py4cytoscape(Python+Cytoscape),pydot(Graphviz接口),PyGraphistry(GPU加速),python-igraph,pyvis(交互式图形),SNAP(大规模网络分析)。绘制和理解网络图从未如此简单!
1525 0
|
编解码 前端开发 C++
CSS【详解】布局 display ( 含 flex 布局,grid 布局,table 布局,float 布局,响应式布局 等)
CSS【详解】布局 display ( 含 flex 布局,grid 布局,table 布局,float 布局,响应式布局 等)
1333 0
|
机器学习/深度学习 存储 算法
python实现基于长短期记忆网络LSTM模型预测茅台股票价格趋势
python实现基于长短期记忆网络LSTM模型预测茅台股票价格趋势
1281 0
|
弹性计算 负载均衡 Cloud Native
Soul 云原生网关最佳实践
我们通过 MSE 云原生网关,将流量、安全、微服务网关三合一,大幅降低请求链路条数、降低架构复杂度、运维和故障排查成本,例如降低整个链路 RT 峰值从500ms下降至峰值50ms,服务发布期间502降为0,499平均降低10%等。
Soul 云原生网关最佳实践
|
缓存 Linux 网络安全