JavaScript专题(二):深入理解iframe
原文地址为: JavaScript专题(二):深入理解iframe
一 目的
iframe是网页布局中重要的元素,是解决一些常见前端问题的必修课,而iframe总是让人捉摸不透,不好掌握。关于iframe,有很多问题我们必须要彻底弄清。笔者累一年经验,3天构思,欲阐述关于iframe的那些事。虽然都是常见的知识,但是很少有人能深入理解,灵活使用。
iframe在布局,无刷新方面都有极其中重要,不可替代的地位。虽然现在流行DIV布局,但是有时还得用iframe布局;虽然2005年流行使用AJAX进行无刷新,但是在特效情况下还得使用iframe;在flash动画内嵌html时,iframe更是必不可少。本文的主要目的就是针对这些问题展开讨论,并且总结。本文目的有:
1.iframe的基础,深入理解frame是何物,属性该如何设置。
2.iframe自适应高宽,即ifrmae在布局方面的应用。
3.iframe的表单无刷新,iframe在上传文件时的无刷新作用。
4.iframe的跨越问题。
5.iframe与jQuery。
请不要怀疑iframe的缺点,不要担心iframe的使用量。各大网站都在使用,淘宝,百度,新浪,博客园,都能找到iframe的踪迹。
二 什么是iframe
iframe即内联框架。不同于frame,frame与frameset综合使用,成为帧,框架集。frame已经不大使用了,说白了,frame是僵硬的叠加,iframe是内联的,不是简单的叠加,而是承前启后,对于外围的页面,iframe是一个普通的元素,对于iframe里面的内容,又是一个五脏俱全的页面。iframe的写法是:
<iframe id="coreIframe" name="coreIframe" src="/blank.html"></iframe>
可以看出,iframe毫无神秘可言,就是一个普通的元素,与span,div一样。那么,iframe是内联元素还是块元素?第一,iframe可以设置width,height并且有效。第二,iframe像普通文本一样不会换行。看图:
由此两点,可以判定:
iframe是inline-block元素。
iframe的基本属性与其他元素一样,有样式的,也有特有的。其中,关于样式的完全可以使用css设置。有些属性不建议使用,也没有必要使用,下面列出iframe的常用属性:
1.frameborder:是否显示边框,yes,no。
2.height:框架作为一个普通元素的高度,建议在使用css设置。
3.width:框架作为一个普通元素的宽度,建议使用css设置。
4.name:框架的名称,window.frame[name]时专用的属性。
5.scrolling:框架的是否滚动。yes,no,auto。
6.src:内框架的地址,可以使页面地址,也可以是图片的地址。
比较特别的iframe属性只用三个:frameborder,scrolling,src,所有的iframe几乎都要指定。典型的iframe元素一般是:
<iframe id="mainIframe" name="mainIframe" src="http://www.baidu.com" frameborder="0" scrolling="auto" ></iframe>
<iframe id="mainIframe" name="mainIframe" src="blank.html" frameborder="0" scrolling="auto" ></iframe>
并且使用css设置其样式:
#mainIframe{
width:1000px;
height:800px;
border:1px blue solid;
margin-left:10px;
}
上面都是将iframe作为一个普通元素看待,看的出来,iframe就是一个普通的元素。
三 iframe自适应高度
iframe的自适应高宽是个不小的难题。所谓的iframe高度自适应,一般就是要嵌入的iframe符合以下要求:
1.内嵌的iframe,要适应父页面,当需要滚动条,滚动条显示,不需要时,滚动条不显示。
2.当父页面窗口发生变化时,iframe也会变化。
3.当iframe的内容变化时,其滚动条也要适应。
首先,不要盲目的去关注这个命题,而应该理解,哪些东西影响了iframe的高宽,iframe在页面中如何表现。如果对页面的高度,宽度不不够了解,经常糊涂,请看笔者的另两篇文章,页面的高度发微,页面的宽度发微。要是做到高宽自适应,无非是在父页面的窗口大小,文档大小,iframe元素的高宽,子页面的窗口大小,文档大小,等方面下功夫。首先,父页面是我们编写的,窗口大小由用户即浏览器决定,文档大小由页面内容决定,而子页面的文档大小,我们也许不能决定,如果是跨越的。幸好,iframe的自适应高宽无需使用文档大小。而只需要窗口大小和iframe元素大小,其中窗口大小是只读的,所以只需要关心iframe元素大小即可。
页面的加载顺序很重要,一般的,我们使用$(function(){})或window.onload等函数初始化页面,此时,页面中所有元素已经加载完毕。如果内嵌了iframe,同样道理,iframe作为页面的一个普通元素,也是先加载完毕,就是说,父页面的$(function(){})执行时,iframe的所有内容已经加载完毕了。下面是顺序图:
由此,完全不用再iframe里设置,全部js可以在父页面完成,而且只要调节iframe元素的width,height,scrolling即可。一般的,自适应iframe,将iframe得scrolling设置为auto即可。为了让页面上只显示一个滚动条,还要隐藏父页面的滚动条。那么总结起来,要注意以下事项,即可完成iframe的自适应高宽,而且不用关心跨域,跨浏览器等问题:
1.隐藏父页面的(一般为top)滚动条。
2.设置iframe这个元素的width,height为某个高宽,scrolling为auto。
3.设置$(window).resiez(),或$(#XXX).resize(),使容纳iframe元素的节点在大小变化时,改变iframe的width,height以适应。
通过以上设置,完全可以做到iframe自适应。此间,不用对iframe中的子页面做任何设置,只需要在父页面完成所有程序。之所以这样,都归功于iframe的srcolling=auto这句程序最后起作用。示例如下:
1.全屏无边框:http://www.zangb.com/html/demo/javascript/js_iframe_autoHeight_border.html
2.有边框效果更明显:http://www.zangb.com/html/demo/javascript/js_iframe_autoHeight_border.html
四 iframe与无刷新
iframe与无刷新有悠久的关系。笔者不知道ajax以前是如何无刷新的,也许是通过iframe。具体可以参看笔者的另一篇文章:form的target属性。iframe实现无刷新的原理就是在A页面的表单提交数据到服务器,并且指定target属性为B页面,服务器返回内容到B页面,然后在B页面中调用JavaScript程序,来刷新A页面,完成一次请求。如果在此过程中,B为A页面的一个iframe页面,而且一直不显示,则对用户来说,就是一个无刷新。
这种无刷新比ajax要麻烦,但是同样意义非凡。在上传文件时,ajax是无法提交的,此时iframe似乎成了不二选择。
但是有一个要求,就是AB页面同域。因为在整个过程中,会在B页面来调用A页面的js对象的方法或函数,就必须保证两个页面同域。否则操作非法。这种无刷新在网上随处可见,淘宝上很多。
五 iframe的跨域
这里主要讲述iframe内html页面的归属。iframe内的html页面可以有两个来源,本域内的页面,外部引用的页面。我们知道,为了安全,js是不能访问其他页面的对象和方法的,除非两个页面同域。这是可以理解的,因为你不可能希望别人修改引用你的网站时还修改你的网站。
如果有两段代码如下:
A:<iframe id="mainIframe" name="mainIframe" src="/main.html" frameborder="0" scrolling="auto" ></iframe>
B:<iframe id="mainIframe" name="mainIframe" src="http://www.baidu.com" frameborder="0" scrolling="auto" ></iframe>
我们该如何取iframe和子页面?有以下方法代码:
var mainIframe = document.getElementById("mainIframe");
var mainIframeW = window.frames["mainIframe"];
var mainDocument = mainIframeW.document;
分别对应到AB页面是什么意思呢?我想很多人都不是很清晰。下面表格说明:
mainIframe | maiIframeW | mainDocument | |
A代码 | 页面的普通元素,可以通过该对象设置iframe的width,height等一个普通元素的属性,DOM对象 | 子页面的window对象引用,BOM对象 | 子页面window对象的文档模型document,可以在父页面对子页面改写 |
B代码 | 同A代码,DOM对象 | 子页面的window对象引用,BOM对象 | 子页面window对象的文档模型document,不可以在父页面改写 |
有一点要说明,如果两个页面有一个是其中一个的二级域名,可以通过js的方式设置为同域名:document.domain = xxx.xx。
六 iframe与jQuery
iframe与jQuery的关系十分简单。只要理解了一点,即可完全搞清楚:jQuery,$是页面上的一个js对象,即window的一个普通对象,获得这个jQuery对象后,就可以进行操作了。jQuery对象属于页面,如果要访问iframe页面的jQuery对象,首先要保证能够访问子页面的的对象,就是要满足父页面与子页面同域。当然iframe页面也要引入jquery.js。通常是以下写法:
1.在父页面访问子页面的jQuery对象。window.frames["xxxIframe"].$("#top"),表示访问子页面的top元素。如果拆分开来,会更容易理解即:
var iframe$ = window.frames["xxxIframe"].$;
iframe$("#top");
这里iframe$就相对于$。
2.在子页面访问页面的jQuery对象。parent.$("#top")。拆分开来就是:
var parent$ = parent.$;
parent$("#top");
如果是顶层框架,就是top.$("#top")。
七 总结
关于iframe的主要知识点就这么多,如果不够详细,请留言。总结如下:
1.iframe就是一个普通的html元素,同样可以通过css设置其样式,而起iframe还是一个inline-block元素。
2.只要掌握了父页面和子页面的渲染顺序,就能很容易掌握iframe的自适应高宽。其实很简单,在父页面设置iframe元素的width,height即可,并且scrolling为auto。
3.iframe的一个独特用处是,对含有文件上传表单的无刷新提交。
4.注意如果iframe的内容是外部网址内容,则不能操作其document。
方劲松 南京焦点科技 写于鼓楼清凉山 2012-8-19
转载请注明本文地址: JavaScript专题(二):深入理解iframe
JavaScript专题(二):深入理解iframe相关推荐
- JavaScript专题(二)数组去重,会就要会的理直气壮
JavaScript专题系列之数组去重 相信当部分开发同学都会遇到这个问题,它的答案有很多种,但是想要真的的回答好这个问题却比较难,我们今天来看看应该怎么回答这个问题. 本文篇幅较长,不妨收藏下来慢慢 ...
- 彻底掌握 Javascript(二十一)async 函数-曾亮-专题视频课程
彻底掌握 Javascript(二十一)async 函数-433人已学习 课程介绍 async 函数已经被所有现代浏览器和 node.js 8.x 原生支持了,从而让我们彻底脱离了,异 ...
- 深入理解iframe
一 目的 iframe是网页布局中重要的元素,是解决一些常见前端问题的必修课,而iframe总是让人捉摸不透,不好掌握.关于iframe,有很多问题我们必须要彻底弄清.笔者累一年经验,3天构思,欲阐述 ...
- JavaScript 专题之函数柯里化
JavaScript 专题系列第十三篇,讲解函数柯里化以及如何实现一个 curry 函数 定义 维基百科中对柯里化 (Currying) 的定义为: In mathematics and comput ...
- div iframe html5,深入理解iframe
深入理解iframe 一.什么是 iframe iframe 用于在页面内显示页面,使用 会创建包含另外一个文档的内联框架(即行内框架) 二.iframe 的常用属性 1.width 定义 ifram ...
- JavaScript专题(五)深浅拷贝
JavaScript专题之深浅拷贝 了解拷贝背后的过程,避免不必要的错误,Js专题系列之深浅拷贝,我们一起加油- 目录 一.拷贝示例 二.浅拷贝 三.深拷贝的方法? 四.自己实现深浅拷贝 一.拷贝示例 ...
- JavaScript专题之从零实现jQuery的extend
JavaScritp 专题系列第七篇,讲解如何从零实现一个 jQuery 的 extend 函数 前言 jQuery 的 extend 是 jQuery 中应用非常多的一个函数,今天我们一边看 jQu ...
- JavaScript 专题之如何判断两个对象相等
JavaScript 专题系列第十二篇,讲解如何判断两个参数是否相等 前言 虽然标题写的是如何判断两个对象相等,但本篇我们不仅仅判断两个对象相等,实际上,我们要做到的是如何判断两个参数相等,而这必然会 ...
- 前端周报:前端面试题及答案总结;JavaScript参数传递的深入理解
1.2017前端面试题及答案总结 |掘金技术征文 "金三银四,金九银十",用来形容求职最好的几个月.但是随着行业的饱和,初中级前端er就业形势不容乐观. 行业状态不可控,我们能做的 ...
最新文章
- 包邮送25本经典书籍,无任何套路!
- XML publisher 填充空白行数
- 待发箱outbox空间已满
- python向sqlite数据库中插入数据(变量)
- ActiveMQ点对点消息通信demo
- 个人图书藏书管理系统-菜单截图
- 第九篇:Spring Boot整合Spring Data JPA_入门试炼03
- Android--List与ArrayList区别(转)
- linux限制堆栈大小,进程超过RedHat Enterprise Linux 6的线程堆栈大小限制?
- zookeeper运维
- 开源商城小程序源码(小程序商城完整版源码)附搭建部署教程
- 全角半角字符转换函数[SJIS_SBC_TO_DBC][SJIS_DBC_TO_SBC]
- Norton AntiVirus (诺顿杀毒)v9.0 简体中文企业版
- 图像的上采样、下采样
- 2021-07-22MATLAB基于元胞自动机模型的传染病扩散模型
- Protus 8.6 及以上如何找到library文件夹
- 模拟人生畅玩版android,模拟人生畅玩版
- PDF报表生成方式:iText与JasperReport概述
- 视网膜屏幕和高清视网膜屏幕
- IE中点击链接下载EXCEL文件直接以乱码方式打开解决
热门文章
- 英文文献作者的几种写法
- 基因组特征评估——k-mer analysis
- 莫尔斯编码的c语言实现,C程序-蓝桥-摩尔斯电码
- 杭州c语言开发招聘,杭州招银网络科技
- 田野调查手记·浮山篇(六)
- 360元(含硬盘)!小白二手旧电脑组建超低价NAS记录
- Anaconda or Miniconda windows下 cmd命令行模式创建、激活、关闭、删除虚拟环境方法步骤
- 生信小白学习日记Day4Day5——NGS基础 NGS分析注释(BWA软件)
- 计算机术语什么叫袜子,大电脑织袜机部分功能操作与说明
- 计算机组成原理时序与启停实验,计算机组成原理时序与启停实验.doc