博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
跨域iframe的高度自适应
阅读量:7071 次
发布时间:2019-06-28

本文共 4189 字,大约阅读时间需要 13 分钟。

If you cannot hear the sound of the genuine in you, you will all of your life spend your days on the ends of strings that somebody else pulls.

1. 跨子域的iframe高度自适应

2. 完全跨域的iframe高度自适应

 

的我们可以轻松的做到

1. 父页面通过iframe的contentDocument或document属性访问到文档对象,进而可以取得页面的高度,通过此高度值赋值给iframe tag。

2. 子页面可以通过parent访问到父页面里引入的iframe tag,进而设置其高度。

 

但跨域的情况则不允许对子页面或父页面的文档进行访问(返回undefined),所以我们要做的就是打通或间接打通这个壁垒。

 

一、跨子域的iframe高度自适应

比如 'a.jd.com/3.html' 嵌入了 'b.jd.com/4.html',这种跨子域的页面

3.html

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
  
<head>
    
<meta charset=
'utf-8'
/>
    
<title>1.html</title>
    
<script type=
"text/javascript"
>
        
document.domain =
'jd.com'
    
</script>
  
</head>
  
<body>
     
<iframe id=
"ifr"
src=
"b.jd.com/4.html"
frameborder=
"0"
width=
"100%"
></iframe>
  
</body>
</html>

4.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html>
  
<head>
    
<meta charset=
"utf-8"
>
    
<title>2.html</title>
    
<script type=
"text/javascript"
>
        
document.domain =
'jd.com'
    
</script>
  
</head>
  
<body>
     
<p>这是一个ifrmae,嵌入在3.html里 </p>
     
<p>根据自身内容调整高度</p>
     
<p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p>
<script>
    
// 计算页面的实际高度,iframe自适应会用到
    
function
calcPageHeight(doc) {
        
var
cHeight = Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)
        
var
sHeight = Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight)
        
var
height  = Math.max(cHeight, sHeight)
        
return
height
    
}
    
window.onload =
function
() {
        
var
height = calcPageHeight(document)
        
parent.document.getElementById(
'ifr'
).style.height = height +
'px'     
    
}
</script>
  
</body>
</html>

可以看到与对比,只要在两个页面里都加上document.domain就可以了

 

二、完全跨域的iframe高度自适应

分别有以下资源

  • 页面 A:
  • 页面 B:
  • 页面 C:
  • D.js:

这四个资源有如下关系

1. A里嵌入C,A和C是不同域的,即跨域iframe

2. C里嵌入B,C和B是不同域的,但A和B是同域的

3. C里嵌入D.js,D.js放在和A同域的项目里

 

通过一个间接方式实现,即通过一个隐藏的B.html来实现高度自适应。

A.html

嵌入页面C:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
  
<head>
    
<meta charset=
'utf-8'
/>
    
<title>A.html</title>
  
</head>
  
<body>
    
<iframe id=
"ifr"
src=
"http://snandy.jd-app.com"
frameborder=
"0"
width=
"100%"
></iframe>
  
</body>
</html>

 

B.html

嵌入在C页面中,它是隐藏的,通过parent.parent访问到A,再改变A的iframe(C.html)高度,这是最关键的,因为A,B是同域的所以可以访问A的文档对象等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html>
  
<head>
    
<meta charset=
'utf-8'
/>
    
<title>B.html</title>
  
</head>
  
<body>
    
<script type=
"text/javascript"
>
        
window.onload =
function
() {
            
var
isSet =
false
            
var
inteval = setInterval(
function
() {
                
var
search = location.search.replace(
'?'
,
''
)
                
if
(isSet) {
                    
clearInterval(inteval)
                    
return  
                
}
                
if
(search) {
                    
var
height = search.split(
'='
)[1]
                    
var
doc = parent.parent.document
                    
var
ifr = doc.getElementById(
'ifr'
)
                    
ifr.style.height = height +
'px'
                    
isSet =
true
                
}
            
}, 500)
        
}
    
</script>
  
</body>
</html>

 

C.html

嵌入在A中,和A不同域,要实现C的自适应,C多高则A里的iframe就设为多高。C里嵌入B.html 和 D.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!doctype html>
<html>
<head>
    
<title>C.html</title>
    
<meta charset=
"utf-8"
>
</head>
<body>
    
<h3>这是一个很长的页面,我要做跨域iframe的高度自适应</h3>
    
<ul>
        
<li>页面 A:http:
//snandy.github.io/lib/iframe/A.html</li>
        
<li>页面 B:http:
//snandy.github.io/lib/iframe/B.html</li>
        
<li>页面 C:http:
//snandy.jd-app.com</li>
        
<li>D.js:http:
//snandy.github.io/lib/iframe/D.js</li>
    
</ul>
    
<p>A</p><p>A</p><p>A</p><p>A</p><p>A</p><p>A</p><p>A</p><p>A</p><p>A</p><p>A</p><p>A</p><p>A</p><p>A</p><p>A</p><p>A</p><p>A</p>
    
<iframe id=
"myifr"
style=
"display:none"
src=
"http://snandy.github.io/lib/iframe/B.html"
></iframe>
    
<script type=
"text/javascript"
src=
"http://snandy.github.io/lib/iframe/D.js"
></script>
</body>
</html>

  

D.js

在页面C载入后计算其高度,然后将计算出的height赋值给C里引入的iframe(B.html)的src

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 计算页面的实际高度,iframe自适应会用到
function
calcPageHeight(doc) {
    
var
cHeight = Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)
    
var
sHeight = Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight)
    
var
height  = Math.max(cHeight, sHeight)
    
return
height
}
window.onload =
function
() {
    
var
doc = document
    
var
height = calcPageHeight(doc)
    
var
myifr = doc.getElementById(
'myifr'
)
    
if
(myifr) {
        
myifr.src =
'http://snandy.github.io/lib/iframe/B.html?height='
+ height
        
// console.log(doc.documentElement.scrollHeight)     
    
}
};

  

线上示例:

转载于:https://www.cnblogs.com/webenh/p/6054975.html

你可能感兴趣的文章
Spring 源码解析(六)创建bean实例
查看>>
ios-xml和json的解析
查看>>
Http报头Accept与Content-Type的区别
查看>>
分析Linux内核创建一个新进程的过程【转】
查看>>
快速排序(QuickSort)
查看>>
Java8之使用Optional进行Null处理
查看>>
jsckson,想说爱你不容易啊。。。406错误
查看>>
WindowsForm 公共控件 菜单和工具栏
查看>>
真正的竞争力,是把所有人都可能拥有的东西变成财富,让沙子变成硅,这才是核心。大家都把大数据当作金矿,想要掘金。但在我看来,大数据的厉害之处是把沙子变成了硅。...
查看>>
C#中static关键字的作用(转)
查看>>
Codeforces Round #428 (Div. 2) B
查看>>
iOS开发——OC篇&纯代码退出键盘
查看>>
SQL Server 2008R2各个版本,如何查看是否激活,剩余可用日期?
查看>>
使用批处理实现完整备份Outlook 2010和恢复
查看>>
RSA加密(C语言)
查看>>
loadrunner常用函数整理
查看>>
办公技巧:局域网内设置固定ip
查看>>
响应式区间
查看>>
jq各个版本
查看>>
nc ltx转发
查看>>