创徏基本的FRAMESET
FRAMESET面与普遍的Web面有些不同。虽然仍旧以QHTMLQ和包含标题的<HEADQ标C及其他脚本开始,但是其内容仅仅是表示的各个页面的版式设计。因此,不再需要有QBODYQ元素,只需要<FRAMESETQ标记?
通过QFRAMESETQ标记的QrowsQ和QcolsQ属性,览器窗口被分割Z个个格子。<rowsQ和QcolsQ的讄值可以是固定的像素|可以是ȝ间的癑ֈ比|q可以是?以及一个数字相乘表C的分割剩余I间的比例倹{比如说Q?
cols="80,20%,*"
分ؓ3列,宽度分别?0像素Q窗口宽度的20Q,以及剩余宽度
rows="25%,75%"
分ؓ2列,宽度分别为窗口宽度的25Q和75Q?/p>
rows="*,3*"
与上q第2个表C的一P分ؓ2列,但表C方法不同:W一列宽度ؓW二列的1/3
在<FRAMESETQ和Q?FRAMESETQ之_用多个<FRAMEQ标记表C每个分割区。col表示从左到右的列Qrow表示从上C的行。每个<FRAMEQ有一个src属性,l出了这个FRAME的内宏V它可以是浏览器能显C的M一个合法URLQ或者是另外一个FRAMESET。ؓ预防递归现象Q一个FRAME不能包含它本w所在的FRAMESET面。要用name属性定义FRAME的名字,q样可以在代码或者脚本程序中引用它?L一D基本的FRAMESET代码Q?
QHTMLQ?br /> QHEADQ?br /> QTITLEQSimple FRAMESETQ?TITLEQ?br /> Q?HEADQ?br /> QFRAMESET cols="40%,60%" rows="2*,*"Q?br /> QFRAME name="TopLeft" src="red.htm"Q?br /> QFRAME name="TopRight" src="green.htm"Q?br /> QFRAME name="BotLeft" src="blue.htm"Q?br /> QFRAME name="BotRight" src="white.htm"Q?br /> Q?FRAMESETQ?br /> Q?HTMLQ?
QFRAMESET rows="105,*"Q?br />
QFRAME name="adbanner" src="ad.html"Q?br />
QFRAMESET cols="40%,60%"Q?br />
QFRAME name="left" src="red.htm"Q?br />
QFRAMESET rows="*,*"Q?br />
QFRAME name="top" src="blue.htm"Q?br />
QFRAME name="bottom" src="white.htm"Q?br />
Q?FRAMESETQ?br />
Q?FRAMESETQ?br />
Q?FRAMESETQ?
FRAME间的链接
一个FRAMESETl构的页面,新文档只转蝲q窗口的一部分中,而其他页面则保持静态不变。当用户点击FRAME中的链接Ӟ新内容就在同一FRAME内打开。要让新内容在其他FRAME中打开Q可以设|<AQ标记的target属性gؓ那个FRAME的name倹{?
而且Q我们还可以讄打开目标为当前可见的L一个FRAMEQ而不局限于本n的FRAMESET。目标可能是一个嵌套的FRAMESET中的FRAMEQ也可能是其他窗口中的FRAME。但是如果目标FRAME不存在,׃产生一个带有目标FRAME名字的新H口?
下面举个例子说明一下,假设有一个简单含2QFRAME的FRAMESETQ文件名叫做home.htmlQ代码如下:
QHTMLQ?br /> QHEADQ<TITLEQFrommCo home pageQ?TITLEQ</HEADQ?br /> QFRAMESET cols="115,*"Q?br /> QFRAME src= "menu.htm"Q?br /> QFRAME name= "content" src="main.htm"Q?br /> Q?FRAMESETQ?br /> Q?HTMLQ?
文gmenu.htm在左边的FRAME中,其中有一pd链接Q点d们后新内容将在右边的叫做content的FRAME中打开。下面是menu.html的代码:
QHTMLQ<HEADQ</HEADQ?br /> QBODYQ<PQ<BRQ?br /> QIMG src="Images/tmp_logo.gif" alt="FrommCo"Q<PQ?br /> QA href="main.htm" target="content"QMain pageQ?AQ<PQ?br /> QA href="mission.htm" target="content"QOur missionQ?AQ<PQ?br /> QA href="staff.htm" target="content"QOur staffQ?AQ<PQ?br /> QA href="splash.htm" target="_parent"QFrommCo splash pageQ?AQ?br /> Q?BODYQ</HTMLQ?
h意最后一个链接中target的定义ؓ_parentQ这属于4个特D的保留倹{它们是Q?_parentQ在当前FRAMESET位置昄新href?
_topQ在当前整个H口位置昄新hrefQ比如本wFRAMESET位于另一个FRAMESET中?
_selfQ强制在当前FRAME中显C新href?
_blankQ在新窗口中昄href?/p>
表示客户端图形地囄QAREAQ标记同样可以应用target属性,比如Q?
QAREA shape=circle coords="75,75,50" href="main.htm" target="content" alt="Main page"Q?
q有一U经常的情况是:Web面中的大部分或者全部链接都要求在一个特别的FRAME中打开。这Ӟ可以在页面的QHEADQ代码区使用QBASEQ标记设|默认的targetQ然后再分别定义Ҏ链接的target倹{?/p>
修饰FRAME
FRAMESET不仅在宽度、高度等斚wh可控制的数|在美观方面也同样可以_讄?
默认情况下,FRAMESET的FRAME间有一个凸LҎQ表C分割效果。如果不喜欢q个Q想营?#8220;无缝q接”的效果,可以在<FRAMEQ标C讄FRAMEborder=0来消除它。在3.0及高版本的Navigator和Internet Explorer中,如果在<FRAMESETQ标C讄FRAMEborder=0Q那么除了设|ؓFRAMEborder=1的FRAME外,所有其他FRAME的边沉K消失?
虽然讄了FRAMEborder=0Q有些浏览器仍旧会在FRAME间保留一些边沿的颜色痕迹。这Ӟ可以在<FRAMESETQ标CdFRAMEspacing=0Q对Internet ExplorerQ或者border=0Q对Navigator和OperaQ实现真正的无缝q接?
L下面的代码是如何使用q些属性的Q?
QHTMLQ?br />
QHEADQ<TITLEQFrommCo home pageQ?TITLEQ</HEADQ?br />
QFRAMESET cols="115,*" FRAMEspacing=0 border=0Q?br />
QFRAME src= "menu.htm" FRAMEborder=0 noresize scrolling=noQ?br />
QFRAME name= "content" src="main.htm" FRAMEborder=0Q?br />
Q?FRAMESETQ?br />
Q?HTMLQ?
上面的代码中?个新的属性:noresize表示锁住FRAME而不允许使用鼠标改变大小Qscrolling=no表示屏蔽FRAME的滚动条Qscrolling=yes表示允许Qscrolling=auto表示Ҏ昄内容需要自动显C滚动条?/p>
动FRAME
动FRAME是HTML4.0规范中的一个定义,目前的浏览器都支持它?
不象FRAMESET表示的分割区样子Q一个Q动FRAME作ؓ一个内|对象存在于Web面上,其样式就象一个页面上的一个图形或者一个applet。Q动FRAME使用QIFRAMEQ标讎ͼ它具有与QFRAMEQ相同的大多数属性设|,包括Qname、src、marginwidth、marginheight、FRAMEborder以及scrolling。同Ӟ它还h与图形或者applet一Lheight、width和align属性?
而且QQ动FRAME遵@与普通FRAME一Ltarget原则Q我们可以通过它的name来指向它。本原则适用于在McdFRAME中的动FRAMEQ反之易然。Q动FRAME中的没有traget的链接指向它本nQ而_parent链接则指向包含<IFRAMEQ的文档所在的FRAME或者窗口。比如:
QIFRAME name="floater" src="start.htm" width=150 height=200 hspace=10 align=leftQ?br />
QIMG src= "Images/noFRAME.gif" alt="You can't see the floating FRAME"
width=150 height=200 hspace=10 align=rightQ?
Q?IFRAMEQ<BRQ?br />
QA href="one.htm" target="floater"QShow one.htmQ?AQ<PQ?br />
QA href="two.htm" target="floater"QShow two.htmQ?AQ<PQ?br />
QA href="start.htm" target="floater"QBring back start.htmQ?AQ?
注意Q对应支持<IFRAMEQ标记的览器,M位于QIFRAMEQ和Q?IFRAMEQ间的内定w忽略。反之,其中的内容将昄出来Q这可以用作解释当前览器不支持QIFRAMEQ?
何时使用FRAME
我们知道QFRAMESET的基本用途就是分割浏览器H口Q得窗口的一部分内容改变Q而其他部分保持不变。利用这个特性,可以实现工hD功能Q一个FRAME内放|静态菜单页面,用户点击其中的项目后Q在另外的FRAME内显C相关的内容。这样就可以从整体上减少文g大小Q因Z必在每个内容面中再包含菜单目?
FRAME?个明昄不Q?
FRAME从另外的U别上增加了站点的管理,原因在于链接不仅仅要指向适当的页面,而且也会装蝲到相关的FRAME内?
另外Q大多数览器在执行“d书签”的操作时Q只能记录下FRAMESET的初始位|。不添加书{时是位于多么深的FRAMESET中,当再ơ选择q个书签Ӟ׃q回到FRAMESET的初始页面。这加大了讉K者浏览指定内容的隑ֺ?
但是Q如果好好地l织站点信息QD操作只有不深的几层,那么Q用FRAMEp很好Cؓ讉K者服务。记住:讉K者都希望z的D信息?
当然Q导航ƈ非是使用FRAME的唯一原因Q也可以使用FRAME创徏交换工具和交换页面。而且QFRAME的多文档框架l构非常适于被javascript应用E序所操作?/p>
用FRAME设计站点
最常用的FRAMEl构是“菜单Q内?#8221;FRAMESET。一个FRAME内放|导航菜单,另一个FRAME内{载子菜单Q每个子菜单的链接就指向本n。唯一的有target的链接都在菜单FRAME内?L下面的例E代码:
QHTMLQ<HEADQ?br /> QTITLEQWelcome to my site!Q?TITLEQ?br /> Q?HEADQ?br /> QFRAMESET cols="150,*"Q?br /> QFRAME name= "menu" src="menu.htm"Q?br /> QFRAME name= "content" src="intro.htm"Q?br /> Q?FRAMESETQ?br /> QBODYQ?br /> Q?--如果是支持FRAME的浏览器Q则不会昄下面的内容;否则Q也昄出简单菜单页?-Q?br /> Welcome to my site.QPQ?br /> QA href="intro.htm"QIntroductionQ?AQ?br /> QA href="products.htm"QProductsQ?AQ?br /> QA href="reviews.htm"QReviewsQ?AQ?br /> Q?BODYQ</HTMLQ?/p>
用脚本控制导航FRAME
上面介绍了FRAME的HTML代码l构Q现在开始走向更׃步:使用脚本E序控制FRAME?
每个Window对象有一个FRAMEs数组。对于普通的Web面Q这个数l是I的Q其属性length?。带有FRAMESET的页面,按照其上QFRAMEQ标记的前后序Q生成一个FRAME数组。由于FRAMESET所在页面是每个FRAME的parentH口Q数l烦引从0开始,所以从FRAMESET中引用第3个FRAME时就使用self.FRAMEs[2]Q从其他FRAME文档中引用第3个FRAME时就使用parent.FRAMEs[2]?
FRAME数组中的每一个成员都是一个窗口,它们h普通窗口的一切方法、事件以及属性,q且包括它自qFRAME数组Q当它包含另外一个FRAMESETӞ。因此,用脚本去修改一个FRAME的内容就象修改它的location.href一L单?
下面举例说明Q假设一个FRAMESET包含3个同LFRAMEQ都位于H口下部Q?
QFRAMESET rows="60%,40%"Q?br />
QFRAME name="link" src="link.htm"Q?br />
QFRAMESET cols= "*,*,*"Q?br />
QFRAME name= "blank1" src="blank.htm"Q?br />
QFRAME name= "blank2" src="blank.htm"Q?br />
QFRAME name= "blank3" src="blank.htm"Q?br />
Q?FRAMESETQ?
Q?FRAMESETQ?/p>
W一个FRAME中的文档叫做link.htmQ用点d中的单一链接可以修改其他三个FRAME中的内容。实C码如?
Qa href="javascript:navAll()"Q修改下?个FRAME的内容</aQ?br />
QSCRIPT language="javascript"Q<!--
function navAll() {
parent.FRAMEs[1].location.href= "red.htm";
parent.FRAMEs[2].location.href= "blue.htm";
parent.FRAMEs[3].location.href= "white.htm"; }
// --Q</SCRIPTQ?/p>
用脚本控制动态FRAME
如果FRAME中变化的内容不多Q就可以考虑使用脚本E序动态生成其内容。这样就不用再创建单独的HTML面Q无需从服务器上下载。创建内容的Ҏ与在MH口中书写内容一P都是通过document对象?
举个例子说明一下。假设要在一个FRAME内显C小l成员的相片Qƈ在其下的一个小FRAME内显C成员的名字等信息。首先徏立信息数l:
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';
然后Q徏立小l成员照片的囑Ş地图Q将每个QAREAQ链接到函数showMe(n)Q由它负责根据烦引数据创Z息:
part1 = 'QHTMLQ<HEADQ</HEADQ?;
part1+= 'QBODY bgcolor=#ffffffQ<DIV align=centerQ?;
part2 = 'Q?DIVQ</BODYQ</HTMLQ?;
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间的脚本控制
使用javascriptQ我们既可以从创建窗口的面讉K那个H口Q也可以从这个窗口创建的H口讉K它。另一斚wQFRAMESET中的文档Q包括FRAMESET本nQL可以讉K和操U其中每个的javascript函数和变量。比如说Q第三个FRAME中有函数sayGobble(vol)Q那么在其他FRAME中就可以使用parent.FRAMEs[2].sayGobble(vol)来引用它。同PFRAMESET面中的变量myName可以被Q何FRAME以parent.myName="Imelda"的命令进行设|?
不管在其他FRAME中的内容如何Q在静态FRAME或者FRAMESET中的函数和变量始l保持可用。这个特征非常有价|不仅可以通用函数保存在其中从而压~代码,而且Q还可以实现面间{换时的状态保持?
下面的FRAMESET面只有一个FRAME叫做query.htmQƈ且定义了一个javascript变量myWordQ?
QHTMLQ<HEADQ?br />
QTITLEQPassing dataQ?TITLEQ?br />
QSCRIPT LANGUAGE="javascript"Q<!--
myWord="";
//--Q</SCRIPTQ?br />
Q?HEADQ?br />
QFRAMESET rows="*,1" FRAMEBORDER=noQ?br />
QFRAME name= "active" src="query.htm"Q?br />
QFRAME name= "dummy"Q?br />
Q?FRAMESETQ?br />
Q?HTMLQ?
面query.htm有一个文本输入框以及一个到result.htm的链接,链接的onClick事g设|FRAMESET面的myWord变量为文本输入框的内宏V代码如下:
QHTMLQ<HEADQ</HEADQ?br />
QBODYQ?br />
QFORM name="myForm"Q?br />
QINPUT type=text size=12 name="myText"Q?br />
QPQ?br />
QA onClick="parent.myWord=myText.value"
href= "result.htm"QSee it in yellow on blue!Q?AQ?br />
Q?FORMQ?br />
Q?BODYQ</HTMLQ?/p>
面result.htm取回q打印出myWord的数|代码是:
QHTMLQ?br />
QHEADQ</HEADQ?br />
QBODY bgcolor=#0000cc vlink=#99ffffQ?br />
QFONT size=+3 color=#ffff00Q?br />
QSCRIPT language="javascript"Q<!--
document.write(parent.myWord);
//--Q</SCRIPTQ?br />
Q?FONTQ<PQ?br />
QA href="query.htm"QDo it againQ?aQ?br />
Q?BODYQ</HTMLQ?
q个例子很有实用价倹{比如说Q你可以讑֮讉K者按一定的ơ序打开面Q收集用户信息,最后定制出用户特制的显C内宏V?
谈到状态维护功能,q个Ҏ不会比用cookie或CGI更好Q因为当FRAMESET重蝲或者退出时Q变量值就丢失了。但是,它不要求服务器端响应Q也不存在安全问题,因此q是可以试一把的?/p>
用脚本控制Q动FRAME
用脚本控制普通FRAME与Q动FRAME的方法基本相同,唯一的差别是动FRAME按<IFRAMEQ出现的序定义索引位置。如果FRAMEs.length不ؓ0Q就表示可以安全地处理Q动FRAME。比如说Q在下面的代码中Q如果存在叫做floater的Q动FRAMEQ链接就指向它;否则指?_top"Q?
QIFRAME name="floater" src="trog.htm" width=200 height=200Q</IFRAMEQ?
QA href="grot.html" target="floater" onClick="if (!self.FRAMEs.length)
this.target='_top'"QSee grot.htmQ?AQ?/p>
带有动FRAME的Web面是FRAME文档的parentH口Q因此,多个动FRAME仍然可以通过parent.FRAME数组去访问每一个FRAME?/p>
预防脚本~程错误
管FRAME是HTML的一个稳定规范说明,但DOM模型只把它们当做HTML元素而不是窗口,因此围绕FRAME的脚本编Eƈ不是能很周全地定义。这个不_致了当装载FRAME时会发生一些脚本执行方面的冲突?
立即修改FRAME内容的脚本经怼产生错误。原因在于:览器通常是先执行脚本命oQ然后在按照src所C入页面内宏V?
解决Ҏ很直接,是判断FRAME内容是否装蝲完毕。有一个好的处理技巧是以HTML面开始所有的FRAMEQ由它象主FRAMESET报告装蝲L。比如说Q有一个FRAMESET面Q要{装载完所有的FRAME后才能执行函数goToIt()Q那么就下面的javascriptE序D|qFRAMESET文档中:
countDown=FRAMEs.length;
function soundOff() {
countDown--;
if (countDown==0) {
goToIt();
}
}
然后Q在每个FRAME面的<BODYQ标C讄上onLoad="parent.soundOff()"。当FRAME面装蝲q执行soundOFF()后,{到countDown ?ӞpCFRAME完全装蝲完毕?/p>
ȝ
FRAME是双刃剑Q用不好会造成混ؕ的站点结构和外观Q用得当将大大方便用户的操作方式以及Ş成清晰的面风格。相信你看完本文后,会对FRAME有了更亲切的认识?