如何根据iframe内嵌页面调整iframe高宽续篇
接着昨天的工作 如何根据iframe内嵌页面调整iframe高宽 来说,按照文章中说的第二种方法实现代码如下:
实现
A.com/detail/view 页面的iframe代码如下:
1
|
<iframe id=
"thirdiframe"
src=
"http://B.com/location/testiframe"
width=
"100%"
scrolling=
"no"
frameborder=
"0"
height=
"900"
></iframe>
|
B.com是第三方的域名,所以要求在B.com/location/testiframe的页面增加下面的html
1
2
3
|
<iframe id=
"aiframe"
src=
"#"
style=
"display:none"
></iframe>
<script type=
"text/javascript"
>this.document.getElementById(
"aiframe"
).src=
"http://A.com/detail/iframe?height="
+ window.innerHeight;</script>
A.com/deatil/iframe是A提供的动态接口,返回的数据是一段js:
|
1
|
<script type=
"text/javascript"
>parent.parent.document.getElementById(
"thirdiframe"
).style.height=
"20px"
;</script>
|
这段中的20px是根据参数来生成的
基本这样就可以了。但是在同事的提醒下,考虑到后面几个问题:
1 动态接口的安全问题
A.com/detail/iframe?height=20
会返回一段js,而这里返回的js是带传入参数的。所以这里很有可能会出现反射型XSS。
所以在安全性上要注意一下,需要对height参数进行验证,比如使用php的intval这个函数来一劳永逸。
2 让B这个第三方嵌入一套html代码好吗?
这里不讨论B是否允许嵌入的商务问题。即使B允许嵌入了,但是以后万一想修改这个代码,还需要去让B来修改。
实际上让B嵌入一个A域名的js
1
|
|
这个js:http://A.com/detail/iframejs 是A提供的一个js,它受A(我方)控制,所以,这个逻辑就可以由A方进行控制了
这个js返回的内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
function
initA() {
var
iframeA = document.createElement(
'iframe'
);
iframeA.style.display=
'none'
;
iframeA.id=
'iframeA'
;
document.body.appendChild(iframeA);
}
function
updateAHeight(height) {
if
(document.getElementById(
'iframeA'
) == null) {
init360();
}
var
iframeA = document.getElementById(
'iframeA'
);
}
if
(window.addEventListener) {
window.addEventListener(
'load'
, initA, false);
}
else
{
window.attachEvent(
'onload'
, initA);
}
|
对上面的一段代码,注意几点:
a 当页面加载完成之后再执行initA事件,需要使用addEventListener和attachEvent函数,不应该直接把document.onload来执行,因为B的页面本身可能会有绑定其他事件。
b addEventListener是firefox,chrome等使用的事件加绑定的函数,而attachEvent是IE使用的事件加绑定事件,所以需要分开来做。
c 这里为什么提供一个updateAHeight函数呢?因为有可能B的页面高度会进行变化,那么当B的页面高度变化的时候有没办法改变A的iframe的高度呢?
有两种方法:
c.1 B在改变页面高度的事件上调用一个函数,来修改B页面的iframe的src,其中,这里的updateAHeight就是这个用处的
c.2 做循环,循环体内就是将当前页面的高度设置值,传递给iframe,这个循环当然可以给http://A.com/detail/iframejs 这个js来做的。
总结
原本以为很简单的一个事情,整一整还可以整出这么多名堂,话说也好久没写js了。。。代码啥的,都是技术熟练活啊。。。
本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/3457737.html,如需转载请自行联系原作者

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
阅读《深入理解JavaScript定时机制》
鸟哥的这篇《深入理解JavaScript定时机制》从javascript线程角度分析了setTimeout和setInterval两个定时触发器的实现原理。 看完的体验就是主要要记住两点: javascript的引擎是单线程的 javascript的引擎是基于事件驱动的 setTimeout和setInterval都是往事件队列中增加一个待处理事件而已。setTimeout是触发一次,而setInterval是循环触发。 但是 想要使用setTimeout循环触发 可以这样做: 1 2 3 4 setTimeout( function () { /* 代码块... */ setTimeout(arguments.callee, 10); }, 10); 这个看起来和 1 2 3 setInterval( function (){ /*代码块... */ }, 10); 但是上一份代码中,是执行完了代码块,才挂起来这个事件,所以两次执行时间会大于10,而第二份代码,是自动在10的时候挂上这个事件,所以两次事件相隔的时间会小于等于10(这个说法还是有点憋屈。。。) 但是要明确: 当线...
-
下一篇
如何根据iframe内嵌页面调整iframe高宽
问题来自于工作的实例,我的一个域名A的页面,有个iframe,它可能内嵌了另一个域名B的页面,也可能内嵌域名C的页面,但是呢,B和C的页面大小是不一样的,特别是高是不一样的高,那么我如何设置iframe的height属性呢? 这个本质就是跨域设置的问题。 一种解法 B和C提供一个jsonp接口,让有iframe的页面A来调用,这个jsonp接口的目的就是告诉A,我的页面的高宽各是多少。 第二种解法 1 首先给A页面的iframe设置个id,比如id=”aiframe” 2 B和C页面内嵌一段html: <iframe src=”http://A.com/detail/iframe?height=200&weight=100”></iframe> 3 其中http://A.com/detail/iframe是A提供的一个接口,这个接口返回一段js <script type=”text/javascript”>parent.parent.getElementById(“aiframe”).style.height=”200px”</scri...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- 面试大杂烩
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)