iframe

iframe:一个普通的html元素,可以通过css设置样式,是一个inline-block元素

iframe 的页面和父页面(parent)是分开的,所以它意味着,这是一个独立的区域,不受 parent 的 CSS 或者全局的 JavaScript 的影响,在一定程度上,类似于沙箱隔离(sandbox)。

如果要获取iframe中的内容,需要使用document.contentWindow属性,以及contentDocument属性

  • document.contentWindow获取子窗口的window对象,ie、ff、chrome都支持,chrome需要在服务器端才能使用
  • document.contentDocument 获取子窗口的document对象,(ie6、7不支持)ie8+、ff、chrome支持,chrome需要在服务器端测试
    通过iframe获取其父容器的window属性,通过window.parent,window.top
  • window.parent 直接获取父元素的window,如果父元素还是iframe,那就是该iframe的window对象
  • window.top 获取最顶层的容器的window对象

iframe功能

  1. 用来实现长连接,在websocket不可用的时候作为一种替代 more
  2. 跨域通信
  3. 历史记录管理,解决ajax化网站响应浏览器前进后退按钮的方案,在HTML5的history api不可用时作为一种替代。
  4. 纯前端的utf8和gbk编码互转。比如在utf8页面需要生成一个gbk的encodeURIComponent字符串,可以通过页面加载一个gbk的iframe,然后主页面与子页面通信的方式实现转换,这样就不用在页面上插入一个非常巨大的编码映射表文件了
  5. 用iframe实现无刷新文件上传(同域),在FormData不可用时作为替代方案
    原理:在A页面的表单提交数据到服务器,并且指定target属性为B页面,服务器返回内容到B页面,然后在B页面中调用JavaScript程序,来刷新A页面,完成一次请求。如果在此过程中,B为A页面的一个iframe页面,而且一直不显示,则对用户来说,就是一个无刷新,more
  6. 在移动端用于从网页调起客户端应用(此方法在iphone上并不安全,慎用)
  7. 创建一个全新的独立的宿主环境,用于隔离或者访问原始接口及对象,比如有些前端安全的防范会覆盖一些原生的方法防止恶意调用,那我们就能通过创建一个iframe,然后从iframe中取回原始对象和方法来破解这种防范
  8. IE6下用于遮罩select
  9. 解决加载缓慢的第三方内容如图标和广告等的加载问题

缺点

  1. 搜索引擎的检索程序无法解读这种页面,不利于SEO
  2. 会阻塞主页面的Onload事件
  3. iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载
    如果需要使用iframe,最好是通过javascript
    动态给iframe添加src属性值,这样可以绕开以上两个问题

iframe自适应
参照:http://caibaojian.com/iframe-adjust-content-height.html
http://www.cnblogs.com/snandy/p/3900016.html