JS frame 使用

框架编程概述
一个HTML页面能够有一个或多个子框架,这些子框架以<iframe>来标记,用来显示一个独立的HTML页面。这里所讲的框架编程包括框 架的自我控制以及框架之间的互相访问,例如从一个框架中引用另外一个框架中的JavaScript变量、调用其余框架内的函数、控制另外一个框架中表单的行为 等。 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
} html


改变框架的载入页面
对框架的引用就是对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变量和函数的技术以前,先来看如下代码:
<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)" onclick="self.parent.link.addToOrders(32068)">加入购物车</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开发中的一个重要机制。 java

页面内引用此页面中Iframe页面内的控件的值可直接写:
function test() {
   var num = window.iframename.inputtextname.value;
alert( num );
}
此页面中的Iframe要调用页面中的js代码时可直接写:
<input value="点击" type="button" onclick="window.parent.test()" /> ajax

相关文章
相关标签/搜索