跨域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属性即可。

相关文章
|
存储 缓存 编解码
Web端短视频编辑器的设计与实现 - 像做PPT一样做视频
对于视频的生产,一般的方案是交由专业机构去创作,但这将花费很多预算,如果我们能提供一个工具,基于知识的通用结构沉淀一些视频模版,让用户快速创作出视频知识内容岂不美哉?让想法再奔放些,如果我们能直接从知识库中抽取结构化的知识内容直接生成视频或是半成品视频,用户只需要稍作调整就能发布,这想想就很酷吧?是的,小蜜视频创作工具我就是想做这样一件事情。本篇分享来自阿里巴巴前端工程师李志成(敦固)在第十六届D2前端技术论坛的分享。
3778 0
Web端短视频编辑器的设计与实现 - 像做PPT一样做视频
|
JavaScript 数据可视化
Vue引入Echarts词云图实现数据可视化(实现源码+案例)
本文主要讲Vue如何引入Echarts词云图实现数据可视化
2316 0
Vue引入Echarts词云图实现数据可视化(实现源码+案例)
|
11月前
|
机器学习/深度学习 人工智能 NoSQL
记忆层增强的 Transformer 架构:通过可训练键值存储提升 LLM 性能的创新方法
Meta研究团队开发的记忆层技术通过替换Transformer中的前馈网络(FFN),显著提升了大语言模型的性能。记忆层使用可训练的固定键值对,规模达百万级别,仅计算最相似的前k个键值,优化了计算效率。实验显示,记忆层使模型在事实准确性上提升超100%,且在代码生成和通用知识领域表现优异,媲美4倍计算资源训练的传统模型。这一创新对下一代AI架构的发展具有重要意义。
551 11
记忆层增强的 Transformer 架构:通过可训练键值存储提升 LLM 性能的创新方法
|
编解码 前端开发 C++
CSS【详解】布局 display ( 含 flex 布局,grid 布局,table 布局,float 布局,响应式布局 等)
CSS【详解】布局 display ( 含 flex 布局,grid 布局,table 布局,float 布局,响应式布局 等)
721 0
|
机器学习/深度学习 存储 算法
python实现基于长短期记忆网络LSTM模型预测茅台股票价格趋势
python实现基于长短期记忆网络LSTM模型预测茅台股票价格趋势
715 0
|
Web App开发 移动开发 安全
如何阻止 iframe 里引用的网页自动跳转
如何阻止 iframe 里引用的网页自动跳转
443 0
|
弹性计算 负载均衡 Cloud Native
Soul 云原生网关最佳实践
我们通过 MSE 云原生网关,将流量、安全、微服务网关三合一,大幅降低请求链路条数、降低架构复杂度、运维和故障排查成本,例如降低整个链路 RT 峰值从500ms下降至峰值50ms,服务发布期间502降为0,499平均降低10%等。
Soul 云原生网关最佳实践
|
缓存 Linux 网络安全
|
存储 运维 虚拟化
更改docker存储路径
更改docker存储路径
935 0
|
开发工具 文件存储 对象存储
阿里云图片上传返回地址有blob格式问题处理实录
阿里云OSS上传图片功能很多人可能对实现过,正常情况下会返回https开头的图片地址.
阿里云图片上传返回地址有blob格式问题处理实录