如何根据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
<script type= "text/javascript"  src= "http://A.com/detail/iframejs" ></script>

这个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.src= 'http://A.com/detail/iframe?height='  + window.innerHeight;
     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' );
     iframeA.src= 'http://A.com/detail/iframe?height='  + height;
}
 
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,如需转载请自行联系原作者

相关文章
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
本文介绍了在C# WPF应用程序中引入外部iconfont图标时可能遇到的显示问题及其解决方法:1) 检查资源路径和引入格式是否正确,确保字体文件引用格式为“#xxxx”,并正确指向字体文件位置;2) 确保图标资源被包含在程序集中,通过设置字体文件的生成操作为Resource(资源)来实现。
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
|
9月前
【vue2】切换页面之后滚动条停留在上个页面的位置,解决方案
【vue2】切换页面之后滚动条停留在上个页面的位置,解决方案
674 6
|
9月前
|
前端开发
前端 CSS 经典:鼠标位置信息
前端 CSS 经典:鼠标位置信息
69 0
|
前端开发
CSS样式控制页面的几种方式
1.行内样式。 把样式写在元素标记之间。 用css控制页面样式的行内样式 2.内嵌式 把样式写在head之间,并且用<style></style>包括起来。
256 0
|
Web App开发 前端开发 JavaScript
学会一行CSS即可提升页面滚动性能
一般情况下 CSS 并不会影响 JS 事件,但有一个 CSS 属性则比较特殊.........
|
前端开发 UED
【网页前端】CSS进阶之元素的背景以及清除浏览器默认样式
【网页前端】CSS进阶之元素的背景以及清除浏览器默认样式
352 0
【网页前端】CSS进阶之元素的背景以及清除浏览器默认样式
|
JavaScript
如何用原生js写一个懒加载页面带渐变效果
懒加载经常是我们性能优化经常使用的方案,那么我们今天就实现一波。
|
Web App开发 前端开发 程序员
好程序员web前端教程分享3种方法实现CSS隐藏滚动条并可以滚动内容
好程序员web前端教程分享3种方法实现CSS隐藏滚动条并可以滚动内容,隐藏滚动条的同时还需要支持滚动,我们经常在前端开发中遇到这种情况,最容易想到的是加一个iscroll插件,但其实现在CSS也可以实现这个功能,我已经在很多地方使用了,下面一起看看这三种方法。
1657 0
|
JavaScript 前端开发
中高级前端应该必会,js实现事件委托代理、切换样式、元素获取相对于文档位置等
1、介绍   随着组件开发大流行,现在三大框架已经基本占领了整个前端。   这时候,我们要是引入一个 jq 是不是先得你的项目非常臃肿,jq 也很不适合。   这个时候,你就需要来增加你 js 的功底。
1524 0
下一篇
oss创建bucket