iframe基本用法

1、最基本的用法

iframe 标签指定 src

  1. <iframe src="demo_iframe_sandbox.htm"></iframe>

2. 常用属性

(1). frameborder    是否显示边框,1代表显示,0代表不显示

(2). height, width    高度 、宽度

(3). name      框架的名字,可通过window.frames[name]被调用

(4). scrolling     框架是否滚动,yes no auto(需要时滚动)

(5). scr        内框架中文档的URL,可以是页面地址也可以是图片地址。

(6). sandbox        HTML5新特性,对iframe进行限制。IE10+支持。

(7). align        规定如何根据周围的元素来对齐<iframe> (left right top middle bottom)。

3、自适应 iframe

默认情况下,iframe会自带滚动条,不会全屏.如果你想自适应iframe的话:

第一步:去掉滚动条

  1. <iframe src="./iframe1.html" id="iframe1" scrolling="no"></iframe>

第二步,设置iframe的高为body的高

  1. var iwindow = iframe.contentWindow;
  2. var idoc = iwindow.document;
  3. iframe.height = idoc.body.offsetHeight;

另外,还可以添加其它的装饰属性:

allowtransparency    是否允许iframe设置为透明(true /false),默认为false

allowfullscreen       是否允许iframe全屏(true /false),默认为false

  1. <iframe id="google_ads_frame2" name="google_ads_frame2" width="" height="" frameborder=""src="target.html" marginwidth="" marginheight="" vspace="" hspace="" allowtransparency="true"scrolling="no" allowfullscreen="true"></iframe>

获取iframe里的内容

1、主要的两个API contentWindow,contentDocument

iframe.contentWindow,   获取 iframe 的 window 对象

iframe.contentDocument,  获取 iframe 的 document 对象

这两个 API 只是 DOM 节点提供的方式( 即 getELement 系列对象 )

  1. var iframe = document.getElementById('demo');
  2. var iwindow = iframe.contentWindow; // 获取iframe的window对象
  3. var idoc = iframe.contentDocument; // 获取iframe的document对象

2、通过 iframe 的 name 属性 调用 iframe。

刚刚我们提到了,我们也可以通过window.frames[iframeName]来调用

window.frames[iframeName]

  1. let iframe = window.frames['demo']

返回的就是window对象

在iframe中获取父级内容

1、在同域下,父页面可以获取子 iframe 的内容,子 iframe 同样也能操作父页面内容

  1. window.parent   获取上一级的window对象,如果还是iframe则是该iframewindow对象
  2. window.top    获取最顶级容器的window对象,即,就是你打开页面的文档
  3. window.self    返回自身window的引用。可以理解 window===window.self

2、跨域通讯之 postMessage

postMessage ( message, targetOrigin ):

message:     就是传递给iframe的内容, 通常是string,

targetOrigin:    接受你传递消息的域名,可以设置绝对路径,也可以设置 "或者 "/" 。 表示任意域名都行,"/" 表示只能传递给同域域名

postMessage 是 html5 的新特性 具体介绍请查看 MDN postMessage

我们可以通过html5这个新特性进行iframe间的跨域通信,使用 postMessage 进行数据传递,通过 Message 监听通信事件

postMessage挂载到window对象上,即,使用window.postmessage() 调用.

  1. <iframe src="http://tuhao.com" name="sendMessage"></iframe>
  2. //页面A
  3. let ifr = window.frames['sendMessage'];
  4. //使用iframe的window向iframe发送message。
  5. ifr.postmessage('hello I'm a ', "http://tuhao.com");
  6. //页面B 监听 message 事件
  7. window.addEventListener('message', receiver, false);
  8. function receiver(e) {
  9. if (e.origin == 'http://tuhao.com') {
  10. if (e.data == 'give u a message') {
  11. e.source.postMessage('hello I'm b', e.origin); //向原网页返回信息
  12. } else {
  13. alert(e.data);
  14. }
  15. }
  16. }

当targetOrigin接受到message消息之后,会触发message事件。 message提供的event对象上有3个重要的属性,data,origin,source.

  1. data:    postMessage传递进来的值
  2. origin:  发送消息的文档所在的域
  3. source:  发送消息文档的window对象的代理,如果是来自同一个域,则该对象就是window,可以使用其所有方法,如果是不同的域,则window只能调用postMessage()方法返回信息

iframe 的安全问题

iframe出现安全性有两个方面,一个是你的网页被别人 iframe,一个是你 iframe 别人的网页。

1、防嵌套网页

拦截 click 事件。iframe 享有着 click 的最优先权,当有人在伪造的主页中进行点击的话,如果点在iframe上,则会默认是在操作 iframe 的页面。

(1)在前端领域,我们可以通过window.top来防止我们页面被嵌套。

  1. //iframe2.html
  2. if(window != window.top){
  3. window.top.location.href = correctURL;
  4. }

(2)通过window.location.host来检测是否跨域了,限定你的网页不能嵌套在任意网页内。如果你想引用同域的框架的话,可以判断域名。

  1. if (top.location.host != window.location.host) {
  2.   top.location.href = window.location.href;
  3. }

当然,如果你网页不同域名的话,上述就会报错。
所以,这里可以使用try...catch...进行错误捕获。如果发生错误,则说明不同域,表示你的页面被盗用了。这时候再进行跳转即可.

  1. try{
  2.   top.location.hostname; //检测是否出错
  3.   //如果没有出错,则降级处理
  4.   if (top.location.hostname != window.location.hostname) {
  5.     top.location.href =window.location.href;
  6.   }
  7. }
  8. catch(e){
  9.   top.location.href = window.location.href;
  10. }

(3)在服务器上,对使用iframe的权限进行设置

X-Frame-Options

X-Frame-Options是一个响应头,主要是描述服务器的网页资源的 iframe 权限。目前的支持度是IE8+有3个选项:

  1. DENY:      当前页面不能被嵌套 iframe 里,即便是在相同域名的页面中嵌套也不允许,也不允许网页中有嵌套 iframe
  2. SAMEORIGIN:  iframe 页面的地址只能为同源域名下的页面
  3. ALLOW-FROM:  可以在指定的 origin url iframe 中加载

实例:

  1. X-Frame-Options: DENY
  2. 拒绝任何iframe的嵌套请求
  3.  
  4. X-Frame-Options: SAMEORIGIN
  5. 只允许同源请求,例如网页为 foo.com/.php,則 foo.com 底下的所有网页可以嵌入此网页,但是 foo.com 以外的网页不能嵌入
  6.  
  7. X-Frame-Options: ALLOW-FROM http://s3131212.com
  8. 只允许指定网页的iframe请求,不过兼容性较差Chrome不支持

Web前端之【 iframe 】的更多相关文章

  1. Web前端之iframe详解

    iframe基本内涵 通常我们使用iframe直接直接在页面嵌套iframe标签指定src就可以了. <iframe src="demo_iframe_sandbox.htm" ...

  2. 也许你需要点实用的-Web前端笔试题

    之前发的一篇博客里没有附上答案,现在有空整理了下发出来,希望能帮助到正在找工作的你,还是那句话:技术只有自己真正理解了才是自己的东西,共勉. Web前端笔试题 Html+css 1.对WEB标准以及w ...

  3. web前端面试试题总结---html篇

    HTML Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前.告知浏览器的解析器 ...

  4. Web前端上万字的知识总结

    下面是自己学HTML+DIV+CSS+JS时的学习笔记,给大家分享以下,相互学习.大二时候寒假在家无聊的时候想做点事,总结了一下web前端基础的东西,下面的每个字都是自己手敲的. 1.<html ...

  5. web前端基础知识总结

    上个寒假总结的web前端的一些知识点给大家分享一下 1.<html>和</html> 标签限定了文档的开始和结束点. 属性: (1)  dir: 文本的显示方向,默认是从左向右 ...

  6. HTML5零基础学习Web前端需要知道哪些?

    HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...

  7. web前端性能优化指南(转)

    web前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网络 ...

  8. Web前端优化最佳实践及工具集锦

    Web前端优化最佳实践及工具集锦 发表于2013-09-23 19:47| 21315次阅读| 来源Googe & Yahoo| 118 条评论| 作者王果 编译 Web优化Google雅虎P ...

  9. Web前端开发工程师面试题

    Web前端开发工程师面试题1.说说css的优先级?2.在移动端中,常常使用tap作为点击事件,好处是?会带来什么问题?3.原生JS的window,onload与Jquery的$(document).r ...

  10. web前端-面试经验总结

    这几次面试主要是冲着百度去的 面试1的主要问题: 笔试: 1.解释css盒子模型 2.常用选择器,以及优先级 3.B如何继承A 4.写一个闭包实例,有什么优点缺点 5.html5的心特性有哪些 6. ...

随机推荐

  1. java中map和对象互转工具类的实现示例

    在项目开发中,经常碰到map转实体对象或者对象转map的场景,工作中,很多时候我们可能比较喜欢使用第三方jar包的API对他们进行转化,而且用起来也还算方便,比如像fastJson就可以轻松实现map ...

  2. Java13新特性 -- switch表达式

    引入了yield语句,用于返回值: 和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块. @Test public void testSwitch ...

  3. MSSQL附加数据库时提示以下错误: 无法打开物理文件“***.mdf”。操作系统错误 5:“5(拒绝访问。)”。 (Microsoft SQL Server,错误: 5120)

    MSSQL附加数据库时提示以下错误: 无法打开物理文件“***.mdf”.操作系统错误 5:“5(拒绝访问.)”. (Microsoft SQL Server,错误: 5120) ***** 解决方法 ...

  4. IDEA 使用SequenceDiagram插件绘制时序图

    最近看代码,由于代码的调用层级深度比较多,层层深入到某处时,已经忘记了身处何处,虽然自己可以使用一些画图工具来时序图,但是,这种情况下,自己画时序图很繁琐,比较浪费时间,上网找了一下IDEA有一个插件 ...

  5. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之Nodejs调用bat或sh脚本

    关于EasyDSS流媒体服务器 EasyDSS商用流媒体服务器解决方案是一套集流媒体点播.转码与管理.直播.录像.检索.时移回看于一体的一套完整的商用流媒体服务器解决方案,EasyDSS高性能RTMP ...

  6. JKS转PFX

    通过jks2pfx工具 请下载:JKS2PFX转换工具. 将压缩包解开到 c:\jks2pfx 目录下, 运行以下命令:JKS2PFX <导出文件名> [Java Runtime的目录]备 ...

  7. SpringBoot小技巧:Jar包换War包

    SpringBoot小技巧:Jar包换War包 情景 我们都知道springBoot中已经内置了tomcat,是不需要我们额外的配置tomcat服务器的,但是有时这也可能是我们的一个瓶颈,因为如果我们 ...

  8. Mac系统Android 命令行签名

    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore keystore文件位置 -signedjar ~/afterSign ...

  9. 修改IP地址之后认证信息问题

    $ ssh lvph@172.16.20.20 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOT ...

  10. OI总结

    当下考的钟声叮当响起,该走了,一年半的OI竞赛就此结束 留下了很多遗憾.也拥有过一段美好的竞赛生活 结识了一群优秀的OI战友,一起进步一起开心一起忧愁,但这一切的一切都将在今晚变成过去式,CSp的好与 ...