一个HTML页面能够有一个或多个子框架,这些子框架以<iframe>来标记,用来显示一个独立的HTML页面。这里所讲的框架编程包括框架的自我控制以及框架之间的互相访问,例如从一个框架中引用另外一个框架中的JavaScript变量、调用其余框架内的函数、控制另外一个框架中表单的行为等。html
一个页面中的全部框架以集合的形式做为window对象的属性提供,例如:window.frames就表示该页面内全部框架的集合,这和表单对象、连接对象、图片对象等是相似的,不一样的是,这些集合是document的属性。所以,要引用一个子框架,能够使用以下语法:ajax
window.frames["frameName"]; window.frames.frameName window.frames[index]
其中,window字样也能够用self代替或省略,假设frameName为页面中第一个框架,则如下的写法是等价的:编程
self.frames["frameName"] self.frames[0] frames[0]
每一个框架都对应一个HTML页面,因此这个框架也是一个独立的浏览器窗口,它具备窗口的全部性质,所谓对框架的引用也就是对window对象的引用。有了这个window对象,就能够很方便地对其中的页面进行操做,例如使用window.document对象向页面写入数据、使用 window.location属性来改变框架内的页面等。数组
下面分别介绍不一样层次框架间的互相引用:浏览器
知道了上述原理,从父框架引用子框架变的很是容易,即:框架
window.frames["frameName"];
这样就引用了页面内名为frameName的子框架。若是要引用子框架内的子框架,根据引用的框架实际就是window对象的性质,能够这样实现:函数
window.frames["frameName"].frames["frameName2"];
这样就引用到了二级子框架,以此类推,能够实现多层框架的引用。spa
每一个window对象都有一个parent属性,表示它的父框架。若是该框架已是顶层框架,则window.parent还表示该框架自己。code
若是两个框架同为一个框架的子框架,它们称为兄弟框架,能够经过父框架来实现互相引用,例如一个页面包括2个子框架:htm
<frameset rows="50%,50%"> <frame src="1.html" name="frame1" /> <frame src="2.html" name="frame2" /> </frameset>
在frame1中能够使用以下语句来引用frame2:
self.parent.frames["frame2"];
框架的层次是针对顶层框架而言的。当层次不一样时,只要知道本身所在的层次以及另外一个框架所在的层次和名字,利用框架引用的window对象性质,能够很容易地实现互相访问,例如:
self.parent.frames["childName"].frames["targetFrameName"];
和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'" onclick="">link</a> <!--somecode-->
引用其余框架内的JavaScript变量和函数
在介绍引用其余框架内JavaScript变量和函数的技术以前,先来看如下代码:
function hello(){ alert("hello,ajax!"); } window.hello();
若是运行了这段代码,会弹出“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)" onclick="self.parent.link.addToOrders(32068)">加入购物车</a>
其中link表示导航框架,在link.html页面中定义了arrOrders数组来存储商品的id,函数addToOrders()用来响应商品旁边【购买】连接的单击事件,它接收的参数id表示商品的id,例子中是一个id为32068的商品:
var arrOrders=new Array(); function addToOrders(id){ arrOrders.push(id); }
这样,在结账页面或是购物车浏览页面就能够用arrOrders来获取全部准备购买的商品。
框架能够使一个页面划分为功能独立的多个模块,每一个模块之间彼此独立,但又能够经过window对象的引用来创建联系,是Web开发中的一个重要机制。
页面内引用此页面中Iframe页面内的控件的值可直接写:
function test() { var num = window.iframename.inputtextname.value; alert( num ); }
此页面中的Iframe要调用页面中的js代码时可直接写:
<input value="点击" type="button" onclick="window.parent.test()" />
玩技术,要学会忍受寂寞--