iframe同域跨域高度自适应的实现
本文章收集大量的关于iframe同域跨域高度自适应的实现程序代码,下面我来给大家介绍介绍,本效果的实现需要父页面和子页面都需要作相应的设置,以下是具体的设置及代码:
一、父层页面的设置
1、是父层的iframe引入,代码如下:
- <iframe frameborder="0" scrolling="no" width="100%" src="iframe.html" id="paopaowang"></iframe>
2、父层要设计一个域名的变量 domain,代码如下:
- <script type="text/javascript">
- document.domain = "aqy106.com";
- </script>
二、包含的iframe的设置
在这个页面里,你需要给你的body或用一个容器将iframe中的所有元素包裹,然后添加一个个id
1.id="bodybox"
然后再添加以下的脚本代码,其中要注意的是 document.domain = “aqy106.com”; 这里的域名要设置成和父层一样的域名,代码如下:
- <script type="text/javascript">
- document.domain = "aqy106.com";
- function reSetHeight(h, scl) {
- if (!top.document.getElementById("paopaowang")) return;
- with (top.document.getElementById("paopaowang")) {
- if (offsetHeight != h) {
- style.height = h + 'px';
- }
- }
- top.document.body.style.height = top.document.body.scrollHeight;
- if (!scl) {
- if (top.document.documentElement.scrollTop) top.document.documentElement.scrollTop = 0;
- if (top.document.body.scrollTop) top.document.body.scrollTop = 0;
- }
- h=document.getElementById("bodybox").offsetHeight;
- with (top.document.getElementById("paopaowang")) {
- if (offsetHeight != h) {
- style.height = h + 'px';
- }
- }
- }
- window.onload=function(){
- reSetHeight(document.getElementById("bodybox").offsetHeight);
- }//xiariboke.net
- </script>
至此已全部完成,具体代码已很简单明了,可以自行修改和分析,各位具体可以尝试将代码放到同域或不同域中尝试。
但该脚本也有不完美的地方,就是如果iframe页面中有脚本进行操作,改变了iframe页面的高度,父层的页面的iframe的高度无法自动适应,也就只能实现浏览器初次载入能成功获取iframe的高度和加载高度,但在firame中的操作时父层无法实时的适应高度,所以还是有改进的地方的,以后将继续完善。
其它站长提供的方法
关键代码:iframe主页面:main.html,代码如下:
- <iframe id="iframeB" name="iframeB" src="www.b.com/B.html" width="100%" height="auto" scrolling="no" frameborder="0"></iframe>
iframe嵌套页面:B.html,代码如下:
- <iframe id="iframeA" name="iframeA" src="" width="0" height="0" style="display:none;" ></iframe>
- <script type="text/javascript">
- function sethash(){
- hashH = document.documentElement.scrollHeight; //获取自身高度
- urlC = "www.a.com/A.html"; //设置iframeA的src
- document.getElementById("iframeA").src=urlC+"#"+hashH; //将高度作为参数传递
- }
- window.onload=sethash;
- </script>
中介页面:A.html,代码如下:
- <script>
- function pseth() {
- var iObj = parent.parent.document.getElementById('iframeB');//A和main同域,所以可以访问节点
- iObjH = parent.parent.frames["iframeB"].frames["iframeA"].location.hash;//访问自己的location对象获取hash值
- iObj.style.height = iObjH.split("#")[1]+"px";//操作dom
- }
- pseth();
- </script>
跨域方法
实现原理:比如现在有两个网站域名分别为A.com; B.com; A网站有个Iframe,需要把B网站放到该Iframe中,但是Iframe的高度 得先获取B网站的页面高度,然后根据所获取的高度来修改A网站Iframe的高度值。 1: 是要在B网站(即下属网站)获取自己的页面的高度, 2:B网站没权限修改A网站的高度,需要一个中间页面,该中间页面可以修改A网站的高度,so.这个中间页面必须与A网站在同一个域下。
A网站的关键代码:
- <iframe id="iframepage" name="iframepage" frameborder="0" scrolling="no" width="100%" src="@ViewData["urlstr"]">
- </iframe> //src是B网站的页面地址
B网站的关键代码:
在B网站下也加一个iframe,该iframe是为了导向A网站的中间页面,从而改掉A网站的Iframe高度,代码如下:
- <!DOCTYPE html>
- <html>
- <head>
- <script type="text/javascript">
- $(function () {
- hashH = document.documentElement.scrollHeight;
- urlC = "http://www.:9001/Home/Agent"; //为A域名的中间页面,此处一定要用域名,不能用Ip
- document.getElementById("MiddleIframe").src=urlC+"#"+hashH;
- });
- </script>
- </head>
- <body>
- <div class="topTitle">
- .....
- </div>
- @RenderBody()
- <iframe id="MiddleIframe" name="MiddleIframe" src="http://www.:9001/Home/Agent" width="0" height="0" style="display: none;">
- </iframe>
- </body>
- </html>
中间页面的关键代码:
该页面是在A域名下的一个文件,由上面的src知道我就是在A网站的HomeController下开了个Agent的方法,代码如下:
- <script type="text/javascript">
- $(function () {
- var iObj = parent.parent.document.getElementById('iframepage'); //找到该域下的iframe然后修改其值
- iObjH = parent.parent.frames["iframepage"].frames["MiddleIframe"].location.hash;
- iObj.style.height = iObjH.split("#")[1] + "px";
- });
- </script>