项目中需要使用iframe嵌套另外一个项目的子页面,但是要求不能有滚动条,也就是说iframe的高度得根据嵌套页面的高度自适应
由于跨域,所以父子页面显然是不能通信的
第一个想到的是最近才接触到的window.name方式
代码片段:
修改自此处
原理:当子iframe页面onload后自身计算高度并写在window.name中,父页面修改iframe的src加载本地代理页后获取高度,然后设置高度,并修改iframe的src为原来的地址(相当的别扭!!)
而且这个方法是有缺陷的:
1, iframe会被加载2次(其中第二次是会被浏览器cache掉的)
2, 无法解决当iframe页包含分页后的高度自适应(有办法解决,但是更别扭)
昨天闲逛无意中发现完美解决方法,原文.
关键是window.top
原理不难:当跨域子页面B加载完成后,计算高度,并动态加载代理页C(和父页面A同域),同时将高度传递给C, C调用顶级页面(也就是A),回传参数.
经过简单修改,以下是demo:
页面A
子页面B1
子页面B2
代理页C
也就是说,应用A需要准备容器页(frameA)和代理页(frameC), 应用B需要在页面加载后计算高度, 然后动态加载应用A的代理页并传递高度参数.
(补充:其实通过现有技术通过nginx跳转可以很方便的实现应用间的同域访问)