iFrame 功能详解
目录索引:
一、 简介
二、 属性
三、 功能
四、 应用
一、简介
  网页“帧”的概念最早是由Netscape所提出,当时全部由“帧”构成的页面,也被称之为 “框架集”页面,在一个“框架集”页面中,“帧” 
是其最小构成单位,每个帧都是一个窗口,用于实现在一个框架集页面中载入许多其它页面。而且,W3C也为其推出了三种文档类型之一的 框架型:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
  到了 1996年,Internet Explorer 将iframe元素加入到了 HTML 中,并在IE 4.0中实现了对其支持,在IE5.5中,实现了通过设置allowTransparency属性来设置透明的 iframe 功能。
	  iframe 规定了一个“独立帧”,也叫内联框架。在这个框架中,可以用于保存另一个页面的的窗口,文档等内容。相比于“框架集”页面,iframe可以被放入到页面中的任意位置,并且可以与当前页面其它元素同时存在。
	  在 HTML4.0 版本之后,iframe 以及“框架集”技术都被不建议使用,这是因为 iframe 对浏览器加载页面具有很大的干扰性,搜索引擎的蜘蛛不会识别在 iframe 中被调用的图片、文本、url等内容的,因为该内容不属于该页面,只是访问的时候被临时的调用,
	但是目前的 HTML5 中 iframe 又被重新启用。这是因为它对以下的使用环境,还具有很大的优势:
  · 引入第三方的内容
  · 用于需要保存历史记录或操作步骤以及焦点的独立子窗口。
  · 用于解决跨域问题。
简单的了解了iframe与框架集的历史前身,下面让我们从最基础开始学习与iframe相关的知识。
二、属性
iframe 是一种古老的技术,同时也是一个不断在改进的技术,学习 iframe 的属性,这里只针对性的学习 iframe 具有使用价值的属性。
1. src
规定载入页面的 URL。
2. name
     定义框架窗口的名称。
          a,shape,form等标签的target属性,可以指定内容在该框架窗口中打开。 
3. frameborder
规定内联框架边框线是否显示,值如果为0表示不显示边框线,不为0则表示显示边框线。
4. width
设置内联框架的宽。
5. height
设置内联框架的高。
6. scrolling
用于控制 iframe 是否出现滚动条,如果取值为 no 则表示不出现滚动条。
7. allowTransparency
     设置 iframe 是否为透明。值为 boolean,取值为 true 表示将 iframe 设置为透明。
    * 该属性只有IE浏览器支持。
8. seamless
    设置 iframe 嵌入的内容,在展示上是否是当前文档的一部分。 
	      该属性是 HTML5 新增属性,实际上也就是取消 iframe 的边框,滚动条而已。
9. srcdoc
    该属性是 HTML5 新增属性。用于设置 iframe 中显示的html内容,值为 html 代码。
	      该属性可覆盖src属性,如果指定了 srcdoc 那么 iframe 就显示 srcdoc 指定的html内容,否则才会显示src载入的页面。
	      示例:
<iframe srcdoc="<p> Hellow World ! </p>" src="exmaple.com/index.html"></iframe>
10. sandbox
    该属性是 HTML5 新增属性。启用一系列对 <iframe> 中内容的额外限制。
    其是有:
      allow-forms               : 允许iframe中的表单提交
      allow-same-origin     : 开启同源策略,这里的所开启的同源策略相当于浏览器同源策略的子集。
      allow-scripts              : 允许iframe中的脚本运行
      allow-top-navigation : 嵌入的页面的上下文可以导航(加载)内容到顶级的浏览上下文环境(browsing context)。如果未使用该关键字,这个操作将不可用。
三、功能
  1. 创建 iframe
	   通过JavaScript创建iframe的标准方法是利用createElement这个方法:
var ifr = document.createElement('iframe');
而IE 8- 则支持另一种特殊插入方法:
var ifr = document.createElement('<iframe id="iframe' src="" ></iframe>');
  2. 获取iframe中的内容
	   * 以下操作都是在同源情况下执行
   · 获取 window
   	       标准写法是通过contentWindow属性,获取iframe内部的窗口(window)对象。
var ifr = document.getElementById('iframe');
ifr.contentWindow // 即iframe所载入页面的window对象。
同样 iframe 也会像 <frame> 元素一样,加入 window.frames 伪数组中
window.frames['iframe'] // 通过frames伪数可以直接获取iframe所载入页面的window对象。
    注:iframe 是 id名称。
    也就是说: ifr.contentWindow === window.frames['iframe']
    · 获取 document
         用JavaScript获取iframe载入页面的document对象,有两种方式:
     	      方式一: ifr.contentWindow.document 
     	      方式二: ifr.contentDocument  
         需要注意的是,方式二 只有IE8+才能支持。
         兼容性解决方案:
var getIframeDocument = function(ifr){
  return ifr.contentDocument || ifr.contentWindow.document;
};
  3.  获取上层windo对象
	      在当前iframe页面中,可以利用以下方式获取上层页面的window对象:
window.parent // 获取上层页面的window对象。
window.top // 获取顶层页面的window对象。
  4.  获得iframe在父页面中的html标签 
	    在iframe页面中可以通过  window.frameElement  获取到位于上层页面中的 iframe DOM 对象。	
	   * 注意在某些浏览器下,该方式只能作用在服务器环境下。
  5.  iframe onload
	   之前遇到过一个需求,需要判断iframe是否加载完毕,如果没有加载完成便要展示一个loading层,用于提示正在加载中...
	     拿到这个需求之后,我直接采用了onlaod事件去判断iframe是否加载完毕:
	   代码:
var ifr = document.getElementById('iframe');
ifr.onload = function() {
	alert('加载完成!');
}
   经过测试,发现在chrome、firefox等主流浏览器中都是正常,但是在IE中会出现有时不能触发onload事件的情况。
	   当时同事提供了另一种解决方案:
var ifr = document.getElementById('iframe');
ifr.onload = function() {
	alert('加载完成!');
}
ifr.src = 'url';
   即页面中先放入一个空的iframe,先绑定onload事件,再去为iframe设置src的值。
	   这种方式确实能够解决onload在IE中有时无法触发的问题,但是通过js去传入iframe src的值,这种操作对于加载时间还是有很大的牺牲。因为这种方式首先要页面加载,然后试行JS,最后才是iframe去加载具体内容。
	   最后通过查阅资料,发现在IE中 iframe是支持 onreadystatechange 事件,这个事件会根据 iframe 的加载状态不断改变,最终再通过readyState去判断是否加载完成。
	     具体实现代码:
function iframeLoad(obj, fn) {
	obj.isloaded = false;
	obj.onreadystatechange = function() {
		if (this.readyState == 'complete') {
			if (!this.isloaded) {
				this.isloaded = true;
				fn && fn();
			}
		}
	};
	obj.onload = function() {
		if (!this.isloaded) {
			this.isloaded = true;
			fn && fn();
		}
	};
}
   最后在无意之中看到别人代码中通过attacheEvent为iframe绑定onload事件,我才明确,原来IE中iframe的onload事件不是不能触发,而是需要IE私有的事件绑定方法绑定才能触发:
	    完美解决代码:
function iframeLoad(ifr, fn) {
	if (window.attachEvent) {
		ifr.attachEvent('onload', fn);
	} else {
		ifr.onload = function() {
			fn();
		}
	}
}
  6.  iframe 全屏
        全屏方法是HTML5的新标准,目前在浏览器中只有Chrome以及Firefox才支持,具体实现的标准也都是各个浏览器厂商的私有标准。
        例如Chomre浏览器中:
element.webkitRequestFullScreen() // 开启全屏
document.webkitCancelFullScreen(); //退出全屏
element.onwebkitfullscreenchange; // 全屏事件
document.IsFullScreen; // 是否全屏
而Firrefox中:
element.mozRequestFullScreen(); // 开启全屏
document.mozCancelFullScreen(); //退出全屏
element.onmozfullscreenchange; // 全屏事件
document.mozFullScreen; // 是否全屏
通过以上方法与属性,我们可以为iframe设置全屏展示效果。
四,应用
1. 防嵌套网页
我们不仅要学会如何嵌套好页面,也应该掌握自己的页面不被其它方恶意嵌套。
最简单的方式,判断顶层窗口是否就是本窗口。
if (window != window.top) {
	window.top.location.href = self.location.href;
}
  2.  广告
		   通过iframe载入广告页面,优点就在于iframe相当于一个独立的沙盒,你引入额外的css和js文件,也不会对当前页面的布局或功能产生影响。
		   一般而言使用iframe 载入广告都是在页面中创建一个跟自己同域的空iframe。然后用这个iframe去载入对应的广告页面即可。
		   嵌入广告用的iframe模板:
<iframe width="728" height="90" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" onload="" style="left:0;position:absolute;top:0;"></iframe>
3. 高度自适应
· 外部检测高度
(function(root){
	var iframe = document.getElementById('iframe');
	function setHeight(){
		var doc = iframe.contentDocument || iframe.contentWindow.document,
			height = doc.documentElement.scrollHeight || doc.body.scrollHeight;
		iframe.style.height = height + 'px';
	}
	if(window.attachEvent){
		iframe.attachEvent('onload',function(){
			setHeight();
		});
	}else{
		iframe.onload=function(){
			setHeight();
		}
	}
}(window));
这种方式,需要在 iframe 的 onload 事件中进行高度处理,如果此时改变嵌套页面的内容,并不会再次触发onload事件。
· 内部响应高度
(function(root){
  	var height = 0,
  		back = 0;
  	function heightCompare(){
  		try{
  			height = document.documentElement.scrollHeight || document.body.scrollHeight;
  			if(height != back){
  				window.frameElement.style.height = height + 'px';
  				back = height;
  			}
  			setTimeout(arguments.callee,1000);
  		}catch(e){}
  	}
  	heightCompare();
}(window));
相比之下,更加推荐这种方式,因为通过定时器实时检测,可以动态的根据iframe页面中的内容变化而变化。另外代码的维护也统一在被嵌套页面。
PS : ~ 转载 的童鞋请注明出处哦!另外,如果有不足之处,或者是更好的建议,请一定要给我留言 ~
iFrame 功能详解的更多相关文章
- iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例
		
使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现 2.纯代 ...
 - SVN功能详解
		
SVN功能详解 TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. ...
 - 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )
		
原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...
 - UIViewController中各方法调用顺序及功能详解
		
UIViewController中各方法调用顺序及功能详解 UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, ...
 - MySQL的用户密码过期功能详解
		
MySQL的用户密码过期功能详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 先说明两个术语. Payment Ca ...
 - 【转】 /etc/fstab功能详解
		
[转] /etc/fstab功能详解 最近去客户现场时,遇到 了一个关于挂载文件/etc/fstab文件的问题,就写了一下/etc/fstab文件的作用一个文件中各个参数的含义.供大家参考有不正确的地 ...
 - 在ASP.NET 5应用程序中的跨域请求功能详解
		
在ASP.NET 5应用程序中的跨域请求功能详解 浏览器安全阻止了一个网页中向另外一个域提交请求,这个限制叫做同域策咯(same-origin policy),这组织了一个恶意网站从另外一个网站读取敏 ...
 - .NET ORM框架 SqlSuagr4.0 功能详解与实践【开源】
		
SqlSugar 4.0 ORM框架的优势 为了未来能够更好的支持多库分布式的存储,并行计算等功能,将SqlSugar3.x全部重写,现有的架构可以轻松扩展多库. 源码下载: https://gith ...
 - SNS社交系统“ThinkSNS V4.6”活动应用功能详解及应用场景举例
		
sns社交系统ThinkSNS目前拥有功能:朋友圈(微博).微吧(论坛).频道.积分商城.IM即时聊天.直播.问答.活动.资讯(CMS).商城.广场.找人.搜索.评论.点赞.转发.分享.话题.积分.充 ...
 
随机推荐
- UIViewController生命周期-完整版
			
一.UIViewController 的生命周期 下面带 (NSObject)的方法是NSObject提供的方法.其他的都是UIViewController 提供的方法. load (NSObje ...
 - 浅谈 LayoutInflater
			
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
 - Vertica 数据库知识汇总篇
			
Vertica 数据库知识汇总篇(更新中..) 1.Vertica 集群软件部署,各节点硬件性能测试 2.Vertica 创建数据库,创建业务用户测试 3.Vertica 数据库参数调整,资源池分配 ...
 - ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器
			
原文:Filters 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码.过滤器可以配置为全局有效.仅对控 ...
 - The Zen of Python
			
Beautiful is better than ugly. 优美总比丑陋好Explicit is better than implicit. 直率总比含蓄好Simple is better than ...
 - 【夯实PHP基础】nginx php-fpm 输出php错误日志
			
本文地址 原文地址 分享提纲: 1.概述 2.解决办法(解决nginx下php-fpm不记录php错误日志) 1. 概述 nginx是一个web服务器,因此nginx的access日志只有对访问页面的 ...
 - web服务器集群
			
概述 集群和分布式都是从集中式进化而来的.分布式和集群会相互合作的,同时的集群和分布式.在这里重点说说集群 集群是什么? 集群能提高单位时间内处理的任务数量,提升服务器性能 有多台服务器去处理任务,但 ...
 - iOS中支付宝集成
			
iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...
 - SQL面试笔试经典题(Part 1)
			
本文是在Cat Qi的原贴的基础之上,经本人逐题分别在MySql数据库中实现的笔记,持续更新... 参考原贴:http://www.cnblogs.com/qixuejia/p/3637735.htm ...
 - 杂项之python描述符协议
			
杂项之python描述符协议 本节内容 由来 描述符协议概念 类的静态方法及类方法实现原理 类作为装饰器使用 1. 由来 闲来无事去看了看django中的内置分页方法,发现里面用到了类作为装饰器来使用 ...