iframe的一些记录

首要要做配置操作,配置两个域名,我这里使用的是Apache。附件中的demo1和demo2

<VirtualHost *:80>
    DocumentRoot "D:/htdocs/iframe/demo1"
    ServerName www.iframe1.cn
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot "D:/htdocs/iframe/demo2"
    ServerName www.iframe2.cn
</VirtualHost>

iframe的一些属性介绍:

属性 描述
align left
right
top
middle
bottom
不赞成使用。请使用样式代替。
规定如何根据周围的元素来对齐此框架。
frameborder 1
0
规定是否显示框架周围的边框。
height pixels
%
规定 iframe 的高度。
longdesc URL 规定一个页面,该页面包含了有关 iframe 的较长描述。
marginheight pixels 定义 iframe 的顶部和底部的边距
marginwidth pixels 定义 iframe 的左侧和右侧的边距。
name frame_name 规定 iframe 的名称
sandbox ""
allow-forms
allow-same-origin
allow-scripts
allow-top-navigation

启用一系列对 <iframe> 中内容的额外限制。

可以在这里做调试

scrolling yes
no
auto
规定是否在 iframe 中显示滚动条。
seamless seamless
规定 <iframe> 看上去像是包含文档的一部分。

可以在这里做调试

src URL 规定在 iframe 中显示的文档的 URL。
srcdoc HTML_code
规定在 <iframe> 中显示的页面的 HTML 内容。

可以在这里做调试

width pixels
%
定义 iframe 的宽度。

1、iframe无刷新文件上传

这个上传我服务器端使用的是PHP代码。

1 <div style="padding:20px">
2         <h1>1、无刷新上传</h1>
3         <form action="action.php" enctype="multipart/form-data" method="post" target="iframeUpload">
4             <iframe name="iframeUpload" width="400" height="400" frameborder=‘1‘></iframe><br/>
5             <input id="file1" name="file1" type="file">
6             <input value="上传图片" type="submit">
7         </form>
8 </div>

使用iframe上传的关键点是target="iframeUpload",这个属性的设置。action.php中的代码如下:

 1 <?php
 2 require_once(‘upload.php‘);
 3 header("Content-Type:text/html;charset=utf-8");
 4 $type = array(‘jpg‘, ‘jpeg‘, ‘png‘, ‘gif‘);
 5 $path = sprintf(‘%s/%s/%s/‘, date(‘Y‘), date(‘m‘), date(‘d‘));
 6
 7 $upload = new App_Util_Upload(‘file1‘, 0, $type);
 8 //获取上传信息
 9 $info = $upload->getUploadFileInfo();
10 $fileName = time() . rand(1000, 9999) . ‘.‘ . $info[‘suffix‘];
11 $fullName = $path . $fileName;
12 $path = rtrim(‘upload‘, DIRECTORY_SEPARATOR) . ‘/‘ . $fullName;
13 $success = $upload->save($path);
14 $msg = $success ? ‘上传成功<br/>‘ : ‘上传失败<br/>‘;
15 echo $msg;
16 echo ‘<img src="‘.$path.‘" width="300" height="300"/>‘;

2、iframe自适应高度

同域的情况下:

网络中的方法一:直接用onload函数获取iframe中的内容高度,如果页面载入一次以后,高度不变,这招是挺好用的,但是我在firefox与IE中,表现不理想,如图,并没有完全的将页面显示,chrome和safrai的表现不错。

<iframe id="iFrame1" name="iFrame1" width="100%" onload="this.height=iFrame1.document.body.scrollHeight" frameborder="0" src="autoheight.html" scrolling="no"></iframe>

后面发现,如果在iFrame1.document.body.scrollHeight的后面在加上20的话,iframe也是能完全展现出来的,这个应该是受到了我autoheight.html这个页面里的CSS影响,

autoheight.html中的页面代码是这样的:

1 <div style="padding:20px;border:1px solid #000;width:650px">
2         <img src="autoheight.jpg" width="600"><br/>
3         一张图片
4 </div>

为了验证我的猜想,我把padding给去除掉,还是用原先的代码onload="this.height=iFrame1.document.body.scrollHeight",但事实与我的猜想完全不同

网络中的方法二:这个函数出自于前端开发博客。与上面的简单方法不同,这里多了些浏览器兼容方面的检验。

 1 <script type="text/javascript">
 2             function setIframeHeight(iframe) {
 3                 if (iframe) {
 4                     var iframeWin = iframe.contentWindow || iframe.contentDocument.parentWindow;
 5                     if (iframeWin.document.body) {
 6                         iframe.height = iframeWin.document.documentElement.scrollHeight || iframeWin.document.body.scrollHeight;
 7                     }
 8                 }
 9             };
10             window.onload = function () {
11                 setIframeHeight(document.getElementById(‘iFrame2‘));
12             };
13  </script>
14  <iframe id="iFrame2" name="iFrame2" width="100%" frameborder="0" src="autoheight.html" scrolling="no" onload="setIframeHeight(this)"></iframe>
var iframeWin = iframe.contentWindow || iframe.contentDocument.parentWindow;

这句是用来获取iframe的window对象。

文章Iframes, onload, and document.domain中 说“he iframe element object has a property called contentDocument that contains the iframe’s document object, so you can use the parentWindow property to retrieve the window object.”

意思就是一些浏览器可以通过iframeElement.contentDocument.parentWindow获得iframe的window对象。经过测试发只有IE9与IE8是根据iframe.contentDocument.parentWindow来获取的,其他firefox、chrome、safrai、IE6、IE7都是根据frame.contentWindow获取的



iframe.height = iframeWin.document.documentElement.scrollHeight || iframeWin.document.body.scrollHeight;

这句话就是在获取iframe的高度了。

body是DOM对象里的body子节点,即 <body> 标签;
documentElement 是整个节点树的根节点root,即<html> 标签;

刚刚上一个方法由于用的是body.scrollHeight导致了各个浏览器的解释不同,引起了显示的不一致。经测试发现使用documentElement.scrollHeight后,都能正确显示。

异域的情况下:

跨域的时候,由于js的同源策略,父页面内的js不能获取到iframe页面的高度。需要一个页面来做代理。总共有三张页面,

注意下三个页面的域名
http://www.iframe1.cn/index.html
http://www.iframe1.cn/agent.html
http://www.iframe2.cn/iframe.html
index.html与agent.html在同一个域名下

iFrame3与iframeC分别为index.html与iframe.html页面上面的iframe的id。下面的图是用websequencediagrams在线画的。

index.html中代码:

<iframe id="iFrame3"  name="iFrame3" src="http://www.iframe2.cn/iframe.html" width="100%" height="0" scrolling="no" frameborder="0"></iframe>

iframe.html中代码:

 1 <body>
 2     <img src="koala.jpg" />
 3     跨域访问!
 4     <iframe id="iframeC" name="iframeC" width="0" height="0" style="display:none;" ></iframe>
 5     <script type="text/javascript">
 6     function sethash(){
 7         hashH = document.documentElement.scrollHeight;
 8         urlC = "http://www.iframe1.cn/agent.html";
 9         document.getElementById("iframeC").src=urlC+"#"+hashH;
10     }
11     window.onload=sethash;
12     </script>
13 </body>

agent.html中代码:

 1 <body>
 2     <script type="text/javascript">
 3     function  pseth() {
 4         var iObj = parent.parent.document.getElementById(‘iFrame3‘);
 5         iObjH = parent.parent.frames["iFrame3"].frames["iframeC"].location.hash;
 6         iObj.style.height = iObjH.split("#")[1]+"px";
 7     }
 8     pseth();
 9     </script>
10 </body>

3、iframe跨域通信

网络方法一:这是一种通过第三张页面来跨域执行函数,一种代理的感觉

注意下三个页面的域名
http://www.iframe1.cn/index_cross.html
http://www.iframe1.cn/cross_domain2.html
http://www.iframe2.cn/cross_domain1.html
index.html与cross_domain2.html在同一个域名下

iFrame4与iframeD分别为index_cross.html与cross_domain1.html页面上面的iframe的id。

这是一种非常优雅的方式,但是是用url的方式在传递参数,大小被受到了限制,如果数据量大的话,是会有问题的。

index_cross.html中代码:

1 <script type="text/javascript">
2             function showQueryString(prompt) {
3                 document.getElementById(‘testCross1‘).innerHTML = ‘跨域‘+prompt;
4             };
5 </script>
6 <iframe id="iFrame4"  name="iFrame4" src="http://www.iframe2.cn/cross_domain1.html">
7 </iframe>
8 <div id="testCross1"></div>

cross_domain1.html中代码:

<body>
    <iframe id="iframeD" name="iframeD" src="http://www.iframe1.cn/cross_domain2.html?cross=success"></iframe>
</body>

cross_domain2.html中代码:

 1 <body>
 2     <script type="text/javascript">
 3         function getQueryString(name) {
 4             var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
 5             var r = window.location.search.substr(1).match(reg);
 6             if (r != null) return unescape(r[2]); return null;
 7         }
 8         parent.parent.showQueryString(getQueryString(‘cross‘));
 9     </script>
10 </body>

成功后出现的提示信息

网络方法二:

1) 支持HTML5的浏览器可以使用postMessage

  IE8、IE9、firefox、chrome和safrai可用postMessage函数

  index_cross.html中代码:

 1 <script type="text/javascript">
 2             window.onload = function () {
 3                 if(window.postMessage) {
 4                     var ifr = document.getElementById(‘iFrame5‘);
 5                     var targetOrigin = ‘http://www.iframe2.cn/‘;
 6                     //postMessage的第一个参数不仅仅可以是字符串,结构对象、数据对象(如:File和ArrayBuffer)或是数组都是可以
 7                     //但IE8/IE9/FireFox3.6及其以下版本只支持字符串数据
 8                     ifr.contentWindow.postMessage(‘I am parent!‘, targetOrigin);
 9                 }
10             };
11 </script>

  post_message.html中代码:

 1 <body>
 2     <div id="postmessage"></div>
 3     <script type="text/javascript">
 4         window.onmessage = function(event){
 5             var event = event || window.event;
 6             if (event.origin == ‘http://www.iframe1.cn‘) {
 7                 document.getElementById(‘postmessage‘).innerHTML = event.data;
 8             }
 9         }
10     </script>
11 </body>

2) IE6、IE7可以用navigator对象的跨大域漏洞

  index_cross.html中代码:

 1 <iframe id="iFrame6"  name="iFrame6" src="http://www.iframe2.cn/navigator.html" width="100%" height="100"></iframe>
 2         <div id="testCross2"></div>
 3         <script type="text/javascript">
 4             window.onload = function () {
 5                 navigator.a = function(prompt) {
 6                     document.getElementById(‘testCross2‘).innerHTML = ‘这是父页面的方法:‘+prompt;
 7                 };
 8                 var iframe = document.getElementById(‘iFrame6‘);
 9                 if(typeof navigator.b === ‘function‘) {
10                     navigator.b(‘children‘);
11                 }
12             };
13 </script>

  navigator.html中代码:

 1 <body>
 2     <div id="navigator"></div>
 3     <script type="text/javascript">
 4         navigator.b = function(prompt) {
 5             document.getElementById(‘navigator‘).innerHTML = ‘这是子页面的方法:‘+prompt;
 6         }
 7         setInterval(function(){
 8             if(typeof navigator.a === ‘function‘) {
 9                 navigator.a(‘parent‘);
10             }
11         }, 3000);
12     </script>
13 </body>

源码可以在这里下载:

iframe.rar

参考资料:

http://www.w3school.com.cn/tags/tag_iframe.asp HTML <iframe> 标签
http://www.cnblogs.com/fangjins/archive/2012/08/19/2645631.html 深入理解iframe
http://www.cnblogs.com/mrxigua/p/3217287.html  iframe无刷新跨域上传文件并获取返回值
http://www.alloyteam.com/2012/08/lightweight-solution-for-an-iframe-cross-domain-communication/ 跨域通信的解决方案
http://blog.csdn.net/sfdev/article/details/5807045 优雅绝妙的Javascript跨域问题解决方案  
http://www.cnblogs.com/rainman/archive/2011/02/21/1960044.html window.name实现的跨域数据传输
http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html JavaScript跨域总结与解决办法
http://www.cnblogs.com/skywind/archive/2007/07/24/829550.html 实现iFrame自适应高度,原来很简单!
http://www.ccvita.com/376.html Iframe高度自适应(兼容IE/Firefox、同域/跨域)
http://caibaojian.com/iframe-adjust-content-height.html iframe高度自适应内容
http://www.cnblogs.com/demix/archive/2009/09/16/1567906.html 【翻译】Iframe, onload 与 document.domain

iframe的一些记录

时间: 2024-09-29 08:02:25

iframe的一些记录的相关文章

JQuery调用iframe父页面元素与方法

JQuery操作iframe父页面与子页面的元素与方法 下面简单使用Jquery来操作iframe的一些记录,这个使用纯JS也可以实现. 第一.在iframe中查找父页面元素的方法: $('#id', window.parent.document) 第二.在父页面中获取iframe中的元素方法: $(this).contents().find("#suggestBox") 第三.在iframe中调用父页面中定义的方法和变量: parent.method parent.value 第四.

JQuery操作iframe父页面与子页面的元素与方法

JQuery操作iframe父页面与子页面的元素与方法 更新: 2011-05-05 来源: 互联网 字体:[大 中 小] - JQUERY IFRAME 下面简单使用Jquery来操作iframe的一些记录,这个使用纯JS也可以实现. 第一.在iframe中查找父页面元素的方法: $('#id', window.parent.document) 第二.在父页面中获取iframe中的元素方法: $(this).contents().find("#suggestBox") 第三.在ifr

前端性能分析

前端性能分析 最近在读一本经典书<高性能网站建设进阶指南>. 虽然书籍很多年前就出版了,但里面的内容还是耐人寻味,这次就好好的实践了一下. 纸上得来终觉浅,绝知此事要躬行,实践中将会发现一些问题. 有个官方网址<Even Faster Web Sites>,点击“Run the Examples”按钮,就能进入在线demo. 在Github上面有个叫awesome-wpo的项目,里面记录了各个方面关于性能的资源,有书籍.文章.工具等. 下面所有的实验都是在Chrome 49浏览器中

前端开发面试题——HTML篇

二.HTML篇 2.1.<img>标签上title属性与alt属性的区别是什么? alt属性是为了给那些不能看到你文档中图像的浏览者提供文字说明的.且长度必须少于100个英文字符或者用户必须保证替换文字尽可能的短. 这包括那些使用本来就不支持图像显示或者图像显示被关闭的浏览器的用户,视觉障碍的用户和使用屏幕阅读器的用户等. title属性为设置该属性的元素提供建议性的信息.使用title属性提供非本质的额外信息.参考<alt和title属性的区别及应用> 2.2.分别写出以下几个H

实践一下前端性能分析

一.浏览器并行下载数量 浏览器的并发请求数目限制是针对同一域名的. 同一时间针对同一域名下的请求有一定数量限制,超过限制数目的请求会被阻塞. 所以我们经常能看到不同静态资源会有不同域名,例如图片.JavaScript.CSS等. HTTP1.1与HTTP1.0,限制的数量还不一样. 1)HTTP1.1 先来看看browserscope网上的数量限制的统计结果,比IE6.IE7那会儿进步了很多. 接下来做一个对比,分别是一个域名和两个域名,分别加载图片. 当一个域名的时候最多只能并发6个请求,而两

document.body的一些用法以及js中的常见问题

document.body的一些用法以及js中的常见问题 网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight; 网页可见区域宽: document.body.offsetWidth    (包括边线的宽); 网页可见区域高: document.body.offsetHeight   (包括边线的宽); 网页正文全文宽: document.body.scrollWidth; 网页正文全文高: documen

web前端常见面试题汇总

一.理论知识 1.1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起TCP的3次握手 c. 建立TCP连接后发起http请求 d. 服务器端响应http请求,浏览器得到html代码 e. 浏览器解析html代码,并请求html代码中的资源 f. 浏览器对页面进行渲染呈现给用户 参考<一次完整的HTTP事务是怎样一个过程> 1.2.谈谈你对前端性能优化的理解 a. 请求数量:合并脚本和样式表,CSS Sprites,拆分初始化负载,划分主域 b. 请求带宽:开

网页开发中调用iframe中的函数或者是dom元素

iframe中的代码 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>By DragonDean</title> <script&g

[前端] 记录一些工作中遇到的问题,及解决方案

最近一年,在开发实践过程中遇到了不少问题,大多都能得到解决 部分知其原理,部分只能做到解决问题,而半年前遇到的问题,或多或少都忘得差不多了 是该记录一下一些问题,防止再遇到就得再查资料了 1. 浏览器在开启有道划词插件的时候,使用 AjaxFileUpload 插件上传文件报错 开启插件时,该插件会往文档中添加音频元素节点 而AjaxFileUpload插件的上传文件处理方式是,获取返回的实体内容,直接进行eval 解析,解析失败,报错,则无法上传 这插件在旧系统中常用到,解决办法就是不用这个插