用脚本控制动态FRAME
如果FRAME中变化的内容不多,就可以考虑使用脚本程序动态生成其内容。这样就不用再创建单独的小HTML页面,无需从服务器上下载。创建内容的方法与在任何窗口中书写内容一样,都是通过document对象。
举个例子说明一下。假设要在一个FRAME内显示小组成员的相片,并在其下的一个小FRAME内显示该成员的名字等信息。首先建立信息数组:
empID = new Array();
empID[0] = 'Dana Corolla, CEO';
empID[1] = 'Arturo Montero, senior editor';
empID[2] = 'Percy Tercel, head designer';
empID[3] = 'Angus Coupedeville, astrologer';
然后,建立小组成员照片的图形地图,将每个<AREA>链接到函数showMe(n),由它负责根据索引数据创建信息:
part1 = '<HTML><HEAD></HEAD>';
part1+= '<BODY bgcolor=#ffffff><DIV align=center>';
part2 = '</DIV></BODY></HTML>';
function showMe(n) {
parent.FRAMEs[1].document.open();
parent.FRAMEs[1].document.write(part1);
parent.FRAMEs[1].document.write(empID[n]);
parent.FRAMEs[1].document.writeln(part2);
parent.FRAMEs[1].close();
}
FRAME间的脚本控制
使用JavaScript,我们既可以从创建窗口的页面访问那个窗口,也可以从这个窗口创建的窗口访问它。另一方面,FRAMESET中的文档(包括FRAMESET本身)总是可以访问和操纵其中每个的JavaScript函数和变量。比如说,第三个FRAME中有函数sayGobble(vol),那么在其他FRAME中就可以使用parent.FRAMEs[2].sayGobble(vol)来引用它。同样,FRAMESET页面中的变量myName可以被任何FRAME以parent.myName="Imelda"的命令进行设置。
不管在其他FRAME中的内容如何,在静态FRAME或者FRAMESET中的函数和变量始终保持可用。这个特征非常有价值,不仅可以将通用函数保存在其中从而压缩代码,而且,还可以实现页面间转换时的状态保持。
下面的FRAMESET页面只有一个FRAME叫做query.htm,并且定义了一个JavaScript变量myWord:
<HTML><HEAD>
<TITLE>Passing data</TITLE>
<SCRIPT LANGUAGE="JavaScript"><!--
myWord="";
//--></SCRIPT>
</HEAD>
<FRAMESET rows="*,1" FRAMEBORDER=no>
<FRAME name="active" src="query.htm">
<FRAME name="dummy">
</FRAMESET>
</HTML>
页面query.htm有一个文本输入框以及一个到result.htm的链接,链接的onClick事件将设置FRAMESET页面的myWord变量为文本输入框的内容。代码如下:
<HTML><HEAD></HEAD>
<BODY>
<FORM name="myForm">
<INPUT type=text size=12 name="myText">
<P>
<A onClick="parent.myWord=myText.value"
href="result.htm">See it in yellow on blue!</A>
</FORM>
</BODY></HTML>
页面result.htm取回并打印出myWord的数值,代码是:
<HTML>
<HEAD></HEAD>
<BODY bgcolor=#0000cc vlink=#99ffff>
<FONT size=+3 color=#ffff00>
<SCRIPT language="JavaScript"><!--
document.write(parent.myWord);
//--></SCRIPT>
</FONT><P>
<A href="query.htm">Do it again</a>
</BODY></HTML>
这个例子很有实用价值。比如说,你可以设定访问者按一定的次序打开页面,收集用户信息,最后定制出用户特制的显示内容。
谈到状态维护功能,这个方法不会比使用cookie或CGI更好,因为当FRAMESET重载或者退出时,变量值就丢失了。但是,它不要求服务器端响应,也不存在安全问题,因此还是可以小试一把的。