框架编程概述
一个HTML页面能够有一个或多个子框架,这些子框架以<iframe>来标记,用来显示一个独立的HTML页面。这里所讲的框架编程包括框架的自我控制以及框架之间的互相访问,例如从一个框架中引用另外一个框架中的JavaScript变量、调用其余框架内的函数、控制另外一个框架中表单的行为等。
框架间的互相引用
一个页面中的全部框架以集合的形式做为window对象的属性提供,例如:window.frames就表示该页面内全部框架的集合,这和表单对象、连接对象、图片对象等是相似的,不一样的是,这些集合是document的属性。所以,要引用一个子框架,可使用以下语法:
window.frames["frameName"];
window.frames.frameName
window.frames[index]
其中,window字样也能够用self代替或省略,假设frameName为页面中第一个框架,则如下的写法是等价的:
self.frames["frameName"]
self.frames[0]
frames[0]
frameName
每一个框架都对应一个HTML页面,因此这个框架也是一个独立的浏览器窗口,它具备窗口的全部性质,所谓对框架的引用也就是对window对象的引用。有了这个window对象,就能够很方便地对其中的页面进行操做,例如使用window.document对象向页面写入数据、使用window.location属性来改变框架内的页面等。
下面分别介绍不一样层次框架间的互相引用:
1.父框架到子框架的引用
知道了上述原理,从父框架引用子框架变的很是容易,即:
window.frames["frameName"];
这样就引用了页面内名为frameName的子框架。若是要引用子框架内的子框架,根据引用的框架实际就是window对象的性质,能够这样实现:
window.frames["frameName"].frames["frameName2"];
这样就引用到了二级子框架,以此类推,能够实现多层框架的引用。
2.子框架到父框架的引用
每一个window对象都有一个parent属性,表示它的父框架。若是该框架已是顶层框架,则window.parent还表示该框架自己。
3.兄弟框架间的引用
若是两个框架同为一个框架的子框架,它们称为兄弟框架,能够经过父框架来实现互相引用,例如一个页面包括2个子框架:
<frameset rows="50%,50%">
<frame src="1.html" name="frame1" />
<frame src="2.html" name="frame2" />
</frameset>
在frame1中可使用以下语句来引用frame2:
self.parent.frames["frame2"];
4.不一样层次框架间的互相引用
框架的层次是针对顶层框架而言的。当层次不一样时,只要知道本身所在的层次以及另外一个框架所在的层次和名字,利用框架引用的window对象性质,能够很容易地实现互相访问,例如:
self.parent.frames["childName"].frames["targetFrameName"];
5.对顶层框架的引用
和parent属性相似,window对象还有一个top属性。它表示对顶层框架的引用,这能够用来判断一个框架自身是否为顶层框架,例如:
//判断本框架是否为顶层框架
if(self==top){
//dosomething
}
改变框架的载入页面
对框架的引用就是对window对象的引用,利用window对象的location属性,能够改变框架的导航,例如:
window.frames[0].location="1.html";
这就将页面中第一个框架的页面重定向到1.html,利用这个性质,甚至可使用一条连接来更新多个框架。
<frameset rows="50%,50%">
<frame src="1.html" name="frame1" />
<frame src="2.html" name="frame2" />
</frameset>
<!--somecode-->
<a href="frame1.location='3.html;frame2.location='4.html'">link</a>
<!--somecode-->
引用其余框架内的JavaScript变量和函数
在介绍引用其余框架内JavaScript变量和函数的技术以前,先来看如下代码: <script language="JavaScript" type="text/javascript"> <!-- function hello(){ alert("hello,ajax!"); } window.hello(); //--> </script> 若是运行了这段代码,会弹出“hello,ajax!”的窗口,这正是执行hello()函数的结果。那为何hello()变成了window对象的方法呢?由于在一个页面内定义的全部全局变量和全局函数都是做为window对象的成员。例如: var a=1; alert(window.a); 就会弹出对话框显示为1。一样的原理,在不一样框架之间共享变量和函数,就是要经过window对象来调用。 例如:一个商品浏览页面由两个子框架组成,左侧表示商品分类的连接;当用户单击分类连接时,右侧显示相应的商品列表;用户能够单击商品旁的【购买】连接将商品加入购物车。 在这个例子中,能够利用左侧导航页面来存储用户但愿购买的商品,由于当用户单击导航连接时,变化的是另一个页面,即商品展现页面,而导航页面自己是不变的,所以其中的JavaScript变量不会丢失,能够用来存储全局数据。其实现原理以下: 假设左侧页面为link.html,右侧页面为show.html,页面结构以下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title> New Document </title> </head> <frameset cols="20%,80%"> <frame src="link.html" name="link" /> <frame src="show.html" name="show" /> </frameset> </html> 在show.html中展现的商品旁边能够加入这样一条语句: <a href="void(0)">加入购物车</a> 其中link表示导航框架,在link.html页面中定义了arrOrders数组来存储商品的id,函数addToOrders()用来响应商品旁边【购买】连接的单击事件,它接收的参数id表示商品的id,例子中是一个id为32068的商品: <script language="JavaScript" type="text/javascript"> <!-- var arrOrders=new Array(); function addToOrders(id){ arrOrders.push(id); } //--> </script> 这样,在结账页面或是购物车浏览页面就能够用arrOrders来获取全部准备购买的商品。 框架可使一个页面划分为功能独立的多个模块,每一个模块之间彼此独立,但又能够经过window对象的引用来创建联系,是Web开发中的一个重要机制。