首 先, 我 稍 微 解 释 一 下frames的 功 用。 因 为frames功 能 才 开 发 不 久, 仍 有 许 多HTML文 件 中 未 使用 这 项 新 功 能。Frames最 主 要 功 用 是"分 割"您 的 视 窗, 使 每 个"小 视 窗"(frame)能 显 示 不 同 的HTM L文 件(译 按:这 有 点 类 似 电 视 的 子 母 画 面)。 更 妙 的 是, 不 同frame之 间 可 以 互 动(interact), 也 就 是说 不 同frame之 间 可 以 交 换 讯 息 与 资 料(information)。 例 如:假 设 您 开 了 两 个frames, 第 一 个frame可显 示 普 通HTML文 件, 第 二 个frame可 显 示 工 具 列(toolbar)。 此 工 具 列 中 可 包 含 浏 览 您homepage所需 的 各 种 按 钮。 如 此 一 来, 即 使 第 一 个frame载 入 了 另 一 个HTML文 件, 您 仍 可 在 第 二 个frame中看 到 工 具 列。
现 在 我 先 将 上 述 特 性 展 示 给 您 瞧 瞧。 请 按 一 下 下 面 的 按 钮, 看 一 看frames的 长 相。(如 果 您 是 线上 观 看 此 文 件, 您 可 能 需 稍 候 一 下 才 看 得 到 结 果, 因 为scripts必 需 由server中 载 入 到 您 的 机 器)。
以 下 是 此frame的 写 法:
<HTML> <HEAD> <title>Frames</title> </HEAD> <FRAMESET ROWS="50%,50%"> <FRAME SRC="frtest1.html" name="fr1"> <FRAME SRC="frtest2.html" name="fr2"> </FRAMESET> </HTML>
首 先 您 必 须 告 诉 浏 览 器 您 要 开 几 个frame?这 是 由 <frameset...> 这 个 标 签(tag)来 宣 告。rows这 项叁 数 是 告 诉 浏 览 器 您 想 将 视 窗 分 割 成 几 列?而 cols这 项 叁 数 是 告 诉 浏 览 器 您 想 将 视 窗 分 割 成 几行?您 也 可 以 用 很 多 组 的 <frameset...> tags 将 视 窗 分 割 得 更 复 杂。 以 下 是 Netsacpe所 提 到 的 一 个范 例:
<FRAMESET COLS="50%,50%"> <FRAMESET ROWS="50%,50%"> <FRAME SRC="cell.html"> <FRAME SRC="cell.html"> </FRAMESET> <FRAMESET ROWS="33%,33%,33%"> <FRAME SRC="cell.html"> <FRAME SRC="cell.html"> <FRAME SRC="cell.html"> </FRAMESET> </FRAMESET>
上 面 这 个 例 子 产 生 了 两 行, 而 且 第 二 行 又 分 割 成 三 列 大 小 相 等 的 空 间。 在 第 一 个 <frameset> tag 中 的 50%,50% 两 项 叁 数 是 用 来 表 是frame的 大 小。
您 可 以 给 每 个frame一 个"名 字" (name)。frame的 名 字 在JavaScript语 法 中 的 地 位 非 常 重 要。 在 本章 的 第 一 个 范 例 中 您 已 学 到 如 何 替frame命 名。 接 下 来 您 可 以 用 <frame> tag 告 诉 浏 览 器 您 要 载入 哪 一 个 HTML文 件。
我 想 您 已 了 解frames的 基 本 用 法, 接 下 来 我 们 再 看 一 个 有 趣 的 范 例:
上 面 的 按 钮 将 显 示 : 按 某 个frame中 的 按 钮 後, 会 在 另 一frame中 写 入 文 字。
以 下 是 此 功 能 的 原 始 码:
在 产 生frames效 果 之 前, 您 需 先 制 作 下 列 原 始 码 (frames.html):
<HTML> <HEAD> <title>Frames</title> </HEAD> <FRAMESET ROWS="50%,50%"> <FRAME SRC="frame1.html" name="fr1" noresize> <FRAME SRC="frame2.html" name="fr2"> </FRAMESET> </HTML>
以 下 是 frame1.html 的 原 始 码:
<HTML> <HEAD> <script language="JavaScript"> <!-- Hiding function hi() { document.write("嗨!<br>"); } function yo() { document.write(" !<br>"); } function bla() { document.write("啦 啦 啦<br>"); } // --> </script> </HEAD> <BODY> 这 是 第 一 个 frame! </BODY> </HTML>
以 下 是 frame2.html 的 原 始 码:
<HTML> <body> 这 是 第 二 个 frame! <p> <FORM NAME="buttonbar"> <INPUT TYPE="button" VALUE="嗨" onClick="parent.fr1.hi()"> <INPUT TYPE="button" VALUE=" " onClick="parent.fr1.yo()"> <INPUT TYPE="button" VALUE="啦" onCLick="parent.fr1.bla()"> </FORM> </BODY> </HTML>
哇!这 些 语 法 越 来 越 长 了!上 述 的 语 法 是 如 何 运 作 的 呢?当 使 用 者 载 入 第 一 个 档 案 (frames.html)後, 将 会 产 生 两 个frame, 并 且 在 第 一 个frame(命 名 为 'fr1')中 载 入frame1.html, 而 在 第 二 个frame ( 命 名 为 'fr2')中 载 入frame2.html。 到 目 前 为 止 都 只 是 普 通 的 HTML 语 法。 或 许 您 已 发 现 在 frame1.html中 包 含 了JavaScript语 法, 但 此JavaScript并 没 有 马 上 被 执 行。 难 到 这 些 函 式(functions) 是 不 必 要 的?亦 或 是 我 得 删 除 这 些 不 必 要 的 函 式?虽 然 我 是 散 惯 的 人, 但 这 些 函 式 确 实 是 必须 的。 它 们 是 被 位 於frame2.html中 之JavaScript语 法 所 呼 叫 而 执 行 的。 我 在frame2.html中 利 用Java Script语 法 制 作 了 三 个 按 钮, 制 作 按 钮 来 呼 叫 函 式 的 方 法 我 已 在 第 一 章 提 过, 相 信 您 对onClick的用 法 已 相 当 熟 悉。 但 是...... parent.fr1 是 干 嘛 用 的?
若 您 对 物 件 观 念 已 相 当 了 解, 相 信 它 对 您 不 是 甚 麽 新 鲜 事。 您 可 以 看 到frames.html同 时 呼 叫 frame1.html 与 frame2.html两 个 档 案, 所 以frames.html称 为frame1.html与frame2.html的 parent (请恕 我 直 接 用 英 文)。 同 理, 这 两 个 新 的frame就 称 为frames.html的 child- frames。 您 可 将 这 种 复 杂的 关 系 想 像 成 阶 层 式 架 构(hierarchy)。 以 下 我 借 助 一 个 小 '图' 来 厘 清 这 种 关 系:
frames.html parent / / / / / / fr1(frame1.html) fr2(frame2.html) children
当 然 您 可 依 此 类 推, 产 生 一 些 'grandchildren' frames。 (当 然, 这 并 不 是 正 式 的 名 称):
frames.html parent / / / / / / fr1(frame1.html) fr2(frame2.html) children / / / / / / gchild1 gchild2 'grandchildren'
若 您 想 由frame2.html呼 叫parent- frame中 的 任 何 函 数, 您 只 要 将 parent 放 在 您 欲 呼 叫 函 数 名 称 之前 即 可。 同 理, 若 由parent- frame呼 叫 位 於frame1.html中 的 函 数, 您 只 需 将 fr1 放 在 被 呼 叫 函 数名 称 之 前。 为 什 麽 用 fr1 呢?原 因 是 我 们 在frames.html中 开 了 两 个frame, 而 且 将 它 们 分 别 命 名 为 fr1和 fr2。 所 以 我 用 fr1 代 表 第 一 个frame (frame1.html)。 接 下 来 的 步 骤 就 相 当 容 易 了。 当 我 们 欲由frame2.html ( 命 名 为 fr2)呼 叫 第 一 个frame中 的 函 式 时 该 怎 麽 做?由 上 面 的"小 图"您 可 以 发 现, frame1.html 和frame2.html之 间 并 无 直 接 关 连 (connection), 因 此 您 不 可 以"直 接"由frame2.html呼叫 位 於 frame1.html中 的 函 式。 您 必 须 透 过parent- frame来 呼 叫 它, 所 以 正 确 指 标(index)应 为 parent.fr1。 例 如 若 您 想 由frame2.html呼 叫 hi(), 您 必 须 写 成 parent.fr1.hi()。 这 也 就 是 为 什 麽 frame2.html中 的 onClick要 写 成 那 种 样 子 的 原 因 了。
对 了!附 带 提 一 点 小 东 西。 您 或 许 已 发 现 本 章 中 都 用<script language="JavaScript">代 替 前 两 章 用的<script language="LiveScript">。 其 实 此 二 者 间 并 没 什 麽 差 别。 但 起 初JavaScript被 植 入Netscape 浏 览 器 时, 您 只 能 用LiveScript语 法。(这 是 一 种 由Netscape发 展 的 旧 语 法, 和JavaScript极 为 类 似 )。 我 想 既 然 我 们 讨 论 的 是JavaScript函 式, 就 应 使 用JavaScript语 法。 (这 只 是 我 的 一 己 之 见, 在 'JavaScript- society'中 有 许 多 关 於LiveScript的 讨 论, 目 前 也 是 众 说 纷 纭....)
在 此 我 要 花 一 点 时 间 讨 论 一 个 很 多 人 关 心 的 问 题。 当 您 观 赏 一 个 拥 有 数 个frame的 网 页 时, 若 您想link至internet其 它 网 页, 这 些frame并 不 会 消 失 而 且 会 带 来 视 觉 上 的 干 扰。 这 些 讨 厌 的frame应该 如 何 消 除 呢?
您 只 要 在 您 的<a href...> tag中 加 入TARGET="_top" 就 可 解 决 这 个 困 扰。 方 法 如 下:
<a href="goaway.html" TARGET="_top">如 果 您 不 想 观 赏 我 的 网 页 了</a>
当 然, 您 必 须 在 您 想 要 获 得 此 效 果 的link中 都 加 入TARGET="_top" 。 若 想 要 整 个 网 页 中 的link 都 有 此 效 果, 您 可 在 此 网 页 的head中 加 入<base target="_top">较 方 便。 如 此 一 来 每 个link被 按 下後 都 可 将frame消 除。