快速精通掌握框架的使用

  初学者可以看看本人编写的框架标签的文章

  FRAME(框架)是Web上经常会看到的页面结构。使用可视Web开发工具(比如Dreamweaver或者Frontpage),虽然可以在WYSIWYG环境中通过简单的鼠标托拽完成FRAME的构建,但是要实现真正细致甚至强大的功能,仔细理解FRAME的代码结构至关重要!你将发现,FRAME原来是这样的亲切易用。

  创建基本的FRAMESET  

  FRAMESET页面与普遍的Web页面有些不同。虽然仍旧以<HTML>和包含标题的<HEAD>标记以及其他脚本开始,但是其内容仅仅是表示的各个页面的版式设计。因此,不再需要有<BODY>元素,只需要<FRAMESET>标记。  

  通过<FRAMESET>标记的<rows>和<cols>属性,浏览器窗口被分割为一个个格子。<rows>和<cols>的设置值可以是固定的像素值,可以是总空间的百分比值,还可以是用*以及一个数字相乘表示的分割剩余空间的比例值。比如说:  

cols="80,20%,*" 分为3列,宽度分别为80像素,窗口宽度的20%,以及剩余宽度  
rows="25%,75%" 分为2列,宽度分别为窗口宽度的25%和75%  
rows="*,3*" 与上述第2个表示的一样,分为2列,但表示方法不同:第一列宽度为第二列的1/3  

  在<FRAMESET>和</FRAMESET>之间,用多个<FRAME>标记表示每个分割区。col表示从左到右的列,row表示从上到下的行。每个<FRAME>有一个src属性,给出了这个FRAME的内容。它可以是浏览器能显示的任何一个合法URL,或者是另外一个FRAMESET。为预防递归现象,一个FRAME不能包含它本身所在的FRAMESET页面。要用name属性定义FRAME的名字,这样就可以在代码或者脚本程序中引用它。 请看一段基本的FRAMESET代码:

<HTML>
<HEAD>
<TITLE>Simple FRAMESET</TITLE>
</HEAD>
<FRAMESET cols="40%,60%" rows="2*,*">
<FRAME name="TopLeft" src="red.htm">
<FRAME name="TopRight" src="green.htm">
<FRAME name="BotLeft" src="blue.htm">
<FRAME name="BotRight" src="white.htm">
</FRAMESET>
</HTML>
<FRAMESET rows="105,*">
<FRAME name="adbanner" src="ad.html">
<FRAMESET cols="40%,60%">
<FRAME name="left" src="red.htm">
<FRAMESET rows="*,*">
<FRAME name="top" src="blue.htm">
<FRAME name="bottom" src="white.htm">
</FRAMESET>
</FRAMESET>
</FRAMESET> 

  FRAME间的链接  

  一个FRAMESET结构的页面,新文档只转载进窗口的一部分中,而其他页面则保持静态不变。当用户点击FRAME中的链接时,新内容就在同一FRAME内打开。要让新内容在其他FRAME中打开,可以设置<A>标记的target属性值为那个FRAME的name值。  

  而且,我们还可以设置打开目标为当前可见的任意一个FRAME,而不局限于本身的FRAMESET。目标可能是一个嵌套的FRAMESET中的FRAME,也可能是其他窗口中的FRAME。但是如果目标FRAME不存在,就会产生一个带有目标FRAME名字的新窗口。  

  下面举个例子说明一下,假设有一个简单含2-FRAME的FRAMESET,文件名叫做home.html,代码如下:  

<HTML>
<HEAD><TITLE>FrommCo home page</TITLE></HEAD>
<FRAMESET cols="115,*">
<FRAME src="menu.htm">
<FRAME name="content" src="main.htm">
</FRAMESET>
</HTML>   

  文件menu.htm在左边的FRAME中,其中有一系列链接,点击它们后新内容将在右边的叫做content的FRAME中打开。下面是menu.html的代码:  

<HTML><HEAD></HEAD>
<BODY><P><BR>
<IMG src="http://www.webjx.com/htmldata/2005-08-28/Images/tmp_logo.gif" alt="FrommCo"><P>
<A href="main.htm"  target="content">Main page</A><P>
<A href="mission.htm"  target="content">Our mission</A><P>
<A href="staff.htm"  target="content">Our staff</A><P>
<A href="splash.htm"  target="_parent">FrommCo splash page</A>
</BODY></HTML>  

  请注意最后一个链接中target的定义为_parent,这属于4个特殊的保留值。它们是:  
_parent:在当前FRAMESET位置显示新href。  
_top:在当前整个窗口位置显示新href,比如本身FRAMESET位于另一个FRAMESET中。  
_self:强制在当前FRAME中显示新href。  
_blank:在新窗口中显示href。
  表示客户端图形地图的<AREA>标记同样可以应用target属性,比如: 

  <AREA shape=circle coords="75,75,50" href="main.htm" target="content" alt="Main page">  

  还有一种经常的情况是:Web页面中的大部分或者全部链接都要求在一个特别的FRAME中打开。这时,可以在页面的<HEAD>代码区使用<BASE>标记设置默认的target,然后再分别定义特殊链接的target值。

  修饰FRAME 

  FRAMESET不仅在宽度、高度等方面具有可控制的数值,在美观方面也同样可以精确设置。  

  默认情况下,FRAMESET的FRAME间有一个凸起的边沿,表示分割效果。如果不喜欢这个,想营造“无缝连接”的效果,可以在<FRAME>标记中设置FRAMEborder=0来消除它。在3.0及高版本的Navigator和Internet Explorer中,如果在<FRAMESET>标记中设置FRAMEborder=0,那么除了设置为FRAMEborder=1的FRAME外,所有其他FRAME的边沿都将消失。  

  虽然设置了FRAMEborder=0,有些浏览器仍旧会在FRAME间保留一些边沿的颜色痕迹。这时,可以在<FRAMESET>标记中添加FRAMEspacing=0(对Internet Explorer)或者border=0(对Navigator和Opera)实现真正的无缝连接。  

  请看下面的代码是如何使用这些属性的:

<HTML>
<HEAD><TITLE>FrommCo home page</TITLE></HEAD>
<FRAMESET cols="115,*" FRAMEspacing=0 border=0>
<FRAME src="menu.htm" FRAMEborder=0 noresize scrolling=no>
<FRAME name="content" src="main.htm" FRAMEborder=0>
</FRAMESET>
</HTML>  

  上面的代码中有2个新的属性:noresize表示锁住FRAME而不允许使用鼠标改变大小,scrolling=no表示屏蔽FRAME的滚动条,scrolling=yes表示允许,scrolling=auto表示根据显示内容需要自动显示滚动条。

  浮动FRAME  

  浮动FRAME是HTML4.0规范中的一个定义,目前的浏览器都支持它。  

  不象FRAMESET表示的分割区样子,一个浮动FRAME作为一个内置对象存在于Web页面上,其样式就象一个页面上的一个图形或者一个applet。浮动FRAME使用<IFRAME>标记,它具有与<FRAME>相同的大多数属性设置,包括:name、src、marginwidth、marginheight、FRAMEborder以及scrolling。同时,它还具有与图形或者applet一样的height、width和align属性。  

  而且,浮动FRAME遵循与普通FRAME一样的target原则:我们可以通过它的name来指向它。本原则适用于在任一类型FRAME中的浮动FRAME,反之易然。浮动FRAME中的没有traget的链接指向它本身,而_parent链接则指向包含<IFRAME>的文档所在的FRAME或者窗口。比如: 

<IFRAME name="floater" src="start.htm" width=150 height=200 hspace=10 align=left>
<IMG src="http://www.webjx.com/htmldata/2005-08-28/Images/noFRAME.gif" alt="You can't see the floating FRAME"
  width=150 height=200 hspace=10 align=right>
</IFRAME><BR>
<A href="one.htm"  target="floater">Show one.htm</A><P>
<A href="two.htm"  target="floater">Show two.htm</A><P>
<A href="start.htm"  target="floater">Bring back start.htm</A> 

  注意,对应支持<IFRAME>标记的浏览器,任何位于<IFRAME>和</IFRAME>间的内容都将忽略。反之,其中的内容将显示出来,这可以用作解释当前浏览器不支持<IFRAME>。

  何时使用FRAME  

  我们知道,FRAMESET的基本用途就是分割浏览器窗口,使得窗口的一部分内容改变,而其他部分保持不变。利用这个特性,就可以实现工具栏导航功能,一个FRAME内放置静态菜单页面,用户点击其中的项目后,在另外的FRAME内显示相关的内容。这样就可以从整体上减少文件大小,因为不必在每个内容页面中再包含菜单项目。  

  FRAME有2个明显的不足: 

  FRAME从另外的级别上增加了站点的管理,原因在于超级链接不仅仅要指向适当的页面,而且也会装载到相关的FRAME内。  

  另外,大多数浏览器在执行“添加书签”的操作时,只能记录下FRAMESET的初始位置。不管添加书签时是位于多么深的FRAMESET中,当再次选择这个书签时,就会返回到FRAMESET的初始页面。这就加大了访问者浏览指定内容的难度。  

  但是,如果好好地组织站点信息,使导航操作只有不深的几层,那么,使用FRAME就能很好地为访问者服务。记住:访问者都希望简洁的导航信息。  

  当然,导航并非是使用FRAME的唯一原因,也可以使用FRAME创建交换工具和交换页面。而且,FRAME的多文档框架结构非常适于被javascript应用程序所操作。

  用FRAME设计站点  

  最常用的FRAME结构就是“菜单-内容”FRAMESET。一个FRAME内放置导航菜单,另一个FRAME内转载子菜单,每个子菜单的链接就指向本身。唯一的有target的链接都在菜单FRAME内。 请看下面的例程代码:  

<HTML><HEAD>
<TITLE>Welcome to webjx.com!</TITLE>
</HEAD>
<FRAMESET cols="150,*">
<FRAME name="menu" src="menu.htm">
<FRAME name="content" src="intro.htm">
</FRAMESET>
<BODY>
<!--如果是支持FRAME的浏览器,则不会显示下面的内容;否则,也显示出简单菜单页面-->
Welcome to webjx.com.<P>
<A href="intro.htm">Introduction</A>
<A href="products.htm">Products</A>
<A href="reviews.htm">Reviews</A>
</BODY></HTML>  

  用脚本控制导航FRAME  

  上面介绍了FRAME的HTML代码结构,现在开始走向更深一步:使用脚本程序控制FRAME。  

  每个Window对象有一个FRAMEs数组。对于普通的Web页面,这个数组是空的,其属性length为0。带有FRAMESET的页面,按照其上<FRAME>标记的前后顺序,生成一个FRAME数组。由于FRAMESET所在页面是每个FRAME的parent窗口,数组索引从0开始,所以从FRAMESET中引用第3个FRAME时就使用self.FRAMEs[2],从其他FRAME文档中引用第3个FRAME时就使用parent.FRAMEs[2]。  

  FRAME数组中的每一个成员都是一个窗口,它们具有普通窗口的一切方法、事件以及属性,并且包括它自己的FRAME数组(当它包含另外一个FRAMESET时)。因此,用脚本去修改一个FRAME的内容就象修改它的location.href一样简单。  

  下面举例说明,假设一个FRAMESET包含3个同样的FRAME,都位于窗口下部: 

<FRAMESET rows="60%,40%">
<FRAME name="link" src="link.htm">
<FRAMESET cols="*,*,*">
  <FRAME name="blank1" src="blank.htm">
  <FRAME name="blank2" src="blank.htm">
  <FRAME name="blank3" src="blank.htm">
</FRAMESET>
</FRAMESET>  

  第一个FRAME中的文档叫做link.htm,使用点击其中的单一链接就可以修改其他三个FRAME中的内容。实现代码如下:  

<a href="javascript:navAll()">修改下面3个FRAME的内容</a>
<SCRIPT language="javascript"><!--
function navAll() {
parent.FRAMEs[1].location.href="red.htm";
parent.FRAMEs[2].location.href="blue.htm";
parent.FRAMEs[3].location.href="white.htm"; }
// --></SCRIPT>

  用脚本控制动态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
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重载或者退出时,变量值就丢失了。但是,它不要求服务器端响应,也不存在安全问题,因此还是可以小试一把的。

  用脚本控制浮动FRAME  

  用脚本控制普通FRAME与浮动FRAME的方法基本相同,唯一的差别是浮动FRAME按<IFRAME>出现的顺序定义索引位置。如果FRAMEs.length不为0,就表示可以安全地处理浮动FRAME。比如说,在下面的代码中,如果存在叫做floater的浮动FRAME,链接就指向它;否则就指向"_top": 

<IFRAME name="floater" src="trog.htm" width=200 height=200></IFRAME>  
<A href="grot.html" target="floater" >See grot.htm</A>  

  带有浮动FRAME的Web页面是FRAME文档的parent窗口,因此,多个浮动FRAME仍然可以通过parent.FRAME数组去访问每一个FRAME。

  预防脚本编程错误  

  尽管FRAME是HTML的一个稳定规范说明,但DOM模型只把它们当做HTML元素而不是窗口,因此围绕FRAME的脚本编程并不是能很周全地定义。这个不足导致了当装载FRAME时会发生一些脚本执行方面的冲突。  

  立即修改FRAME内容的脚本经常会产生错误。原因在于:浏览器通常是先执行脚本命令,然后在按照src所示装入页面内容。  

  解决方法很直接,就是判断FRAME内容是否装载完毕。有一个好的处理技巧是以HTML页面开始所有的FRAME,由它象主FRAMESET报告装载请看。比如说,有一个FRAMESET页面,要等装载完所有的FRAME后才能执行函数goToIt(),那么就将下面的javascript程序段放进FRAMESET文档中: 

countDown=FRAMEs.length;
function soundOff() {
countDown--;
if (countDown==0) {
  goToIt();
  }
}  

  然后,在每个FRAME页面的<BODY>标记中设置上。当FRAME页面装载并执行soundOFF()后,等到countDown 为0时,就表示FRAME完全装载完毕。

  总结

  FRAME是双刃剑,使用不好会造成混乱的站点结构和外观,使用得当将大大方便用户的操作方式以及形成清晰的页面风格。相信你看完本文后,会对FRAME有了更亲切的认识。

时间: 2024-08-04 01:10:01

快速精通掌握框架的使用的相关文章

网页设计必学:快速精通网页框架FRAME

设计|网页|网页设计 FRAME(框架)是Web上经常会看到的页面结构.使用可视Web开发工具(比如Dreamweaver或者Frontpage),虽然可以在WYSIWYG环境中通过简单的鼠标托拽完成FRAME的构建,但是要实现真正细致甚至强大的功能,仔细理解FRAME的代码结构至关重要!你将发现,FRAME原来是这样的亲切易用. 创建基本的FRAMESET FRAMESET页面与普遍的Web页面有些不同.虽然仍旧以<HTML>和包含标题的<HEAD>标记以及其他脚本开始,但是其内

《精通自动化测试框架设计》目录—导读

作者简介 精通自动化测试框架设计 陈冬严,浙江大学硕士,具有10年软件测试和团队管理的工作经验,先后服务于ITSM.PLM软件研发企业,现就职于某金融行业核心机构IT规划部门.业余时间喜欢园艺. 邵杰明,热爱测试工作,10多年的测试行业经验,曾先后供职于多家世界一流软件公司担任测试开发和测试管理工作,积累了丰富的行业工作经验,拥有PMP认证,目前担任测试架构师的工作,致力于自动化测试设计.持续交付等方面的工作. 王东刚,常用网名fastpoint,资深测试专家,<软件测试与Junit实践>作者

云服务器 ECS 建站教程:快速搭建 ThinkPHP 框架

快速搭建 ThinkPHP 框架 ThinkPHP 是一款免费开源的,快速.简单的面向对象的轻量级 PHP 开发框架,遵循 Apache2 开源协议发布,是为了敏捷 Web 应用开发和简化企业应用开发而诞生的. 适用对象 本文档介绍如何使用云市场的 ThinkPHP 框架(含智慧云虚机面板) 快速搭建 ThinkPHP 框架.适用于正在学习 PHP 或者已经基于 ThinkPHP 框架研发的开发者. 基本流程 购买 ThinkPHP 框架镜像. 上传您的程序. 切换 PHP 脚本适应您的程序.

快速搭建ThinkPHP框架教程

本文教你如何快速搭建ThinkPHP框架.ThinkPHP 是一款免费开源的,快速.简单的面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷 Web 应用开发和简化企业应用开发而诞生的.ThinkPHP 是国内最领先和最具影响力的 Web 应用开发框架,是开发者学习 PHP 及研发网站的不错选择. ##适用对象 本文档介绍如何使用云市场的 **ThinkPHP 框架(含智慧云虚机面板)** 快速搭建 ThinkPHP 框架.适用于正在学习 PHP 或者已经基于 Think

《精通自动化测试框架设计》—第2章 2.1节简介

第2章 测试数据管理精通自动化测试框架设计2.1 简介在本章中将结合案例介绍各种数据管理与交互的方法.那么问题来了,作为一本介绍架构自动化测试框架的书籍,为什么首先要介绍数据管理呢? 正所谓兵马未动,粮草先行.自动化测试也建议数据先行.测试过程中所涉及的被测应用自身.测试用例.测试报告等,都需要各种不同类型的数据进行支撑.一般来讲,所谓软件产品的功能,就是该产品在某一上下文状态下,将一系列的输入数据处理以后,转换成相应的输出数据.而软件测试,也就是通过模拟数据来触发这些功能的过程.因此,在软件测

《精通自动化测试框架设计》—第2章 2.6节使用数据库

2.6 使用数据库 如果读者所在的企业正在招聘测试工程师或者读者正在求职,翻开工作说明书,无论是熟悉.掌握还是精通,估计绝大部分都会对于数据库有一定的要求.这说明了数据库在现在软件行业的普遍应用,也说明了这几乎是自动化测试所绕不开的一个技术点.在本小节中,将简要介绍如何通过编写代码与数据库进行交互.当然,这只是浅显的使用层面的介绍.如果牵涉到多套数据库数据配套不同用例集.基础数据导入以及数据清洗等问题,读者可以参考第1章中有关"快速回归测试系统"的介绍,以及下一小节中有关CSV文件的处

使用 Spring Boot 快速构建 Spring 框架应用,PropertyPlaceholderConfigurer

Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.Spring 框架包含几十个不同的子项目,涵盖应用开发的不同方面.如此多的子项目和组件,一方面方便了开发人员的使用,另外一个方面也带来了使用方面的问题.每个子项目都有一定的学习曲线.开发人员需要了解这些子项目和组件的具体细节,才能知道如何把这些子项目整合起来形成一个完整的解决方案.在如何使用这些组件上

《精通自动化测试框架设计》—第1章 1.2节史前的自动化

1.2 史前的自动化 自动化测试不等于UI自动化测试,也不仅仅是完成测试用例的自动化翻译和执行过程.本节将介绍一些过往的自动化实践,供读者在自动化测试框架设计或者选型时进行参考. 1.2.1 自动化安装系统 该SUT是一套典型的B/S架构的基于J2EE的产品,安装过程中至少有20个GUI页面,需要不停地填写和勾选相关的配置信息.最令人头痛的是需要填写大约50个端口号.当然,后续的版本上这个问题已经改善许多.开发环境中,还要考虑一台服务器上部署多套系统,手工安装时选择端口号几乎成了最痛苦的事情,就

《精通自动化测试框架设计》—第2章 2.7节使用CSV文件

2.7 使用CSV文件 CSV[1]的全称是Comma Separate Values,即以逗号为分隔符,每条记录占一行的一种文件格式.当然分隔符并不限制于逗号,因此其另一个名字叫做Character Separated Values.这种古老的文件格式早在20世纪60年代就已出现,被使用于IBM OS360上,远早于个人电脑时代的来临.时至今日,CSV文件依然顽强并且广泛地使用着,特别是在程序间交换数据的场合.例如,在某些ERP系统中,作为安装的一部分,在完成了二进制可执行文件的安装之后,需要