您的位置:寻梦网首页编程乐园HTML园地HTML 4.0 参考文献

前页 | 后页 | 目录 | 元素 | 特性

脚本

目录
  1. 为提供脚本的用户代理器设计文档
    1. SCRIPT 元素
    2. 指定脚本语言
    3. 语法和脚本内容
    4. 内部事件
    5. 文档的动态描述
  2. 为不提供脚本的用户代理器设计文档
    1. NOSCRIPT 元素
    2. 脚本的注释
一 个 客 户 端脚 本 是 个 附 着 于HTML 文 档 的 或 直 在 其 中 的 程 式. 这 个 程 式 当 文 档 被 调 入 时 在 客 户 的 机 器 上 运 行, 或 在 其 它 如 链 接 被 激 活 的 时 候 运 行. HTML 对 于 脚 本 的 支 持 独 立 于 脚 本 语 言.

脚 本 提 供 作 者 一 个 扩 展 HTML 文 档 活 跃 和 交 互 的 方 法. 例 如:

  • 脚 本 可 以 作 为 文 档 动 态 修 改 内 容 的 考 虑.
  • 脚 本 可 以 附 着 表 单 在 输 入 进 入 的 时 候 处 理 它 们. 设 计 者 可 以 根 据 其 它 域 的 值 动 态 的 填 写 部 分 的 表 单. 它 们 也 可 以 确 保 输 入 的 数 据 与 预 先 决 定 的 值 的 范 围 符 合, 这 些 域 是 互 相 一 致 的, 等 等.
  • 脚 本 可 以 被 影 响 文 档 的 事 件 触 发, 如 文 档 被 调 入, 卸 载, 元 素 得 到 焦 点, 鼠 标 移 动 等 等.
  • 脚 本 可 以 被 链 接 到 控 件 (如 按 钮) 来 产 生 图 像 用 户 接 口 元 素.
有 两 种 脚 本 可 被 作 者 附 着 于 HTML 文 档:
  • 那 些 在 文 档 被 用 户 代 理 器 调 入 时 运 行 一 次 的 脚 本. 出 现 于 SCRIPT 元 素 的 脚 本 只 在 文 档 被 调 入 时 执 行. 对 于 不 能 会 不 打 算 处 理 脚 本 的 用 户 代 理 器, 作 者 可 以 通 过 NOSCRIPT 元 素 来 包 含 一 个 轮 替 内 容 .
  • 那 些 在 每 个 指 定 出 现 进 运 行 的 脚 本. 这 些 脚 本 可 通 过 内部 事件 特 性 来 分 配 给数 个 元 素.
注 意: 这 份 说 明 书 在 脚本宏 章 节 中 包 含 了 一 些 更 细 节 化 的 关 于 脚 本 信 息.

为提供脚本的用户代理器设计文档

下 面 的 章 节 讨 论 与 提 供 脚 本 的 用 户 代 理 器 有 关 的 发 行 问 是.

SCRIPT 元素

  
<!ELEMENT SCRIPT - - CDATA -- script statements -->
<!ATTLIST SCRIPT
type CDATA  #IMPLIED-- Internet content type for script language --
language CDATA #IMPLIED -- predefined script language name --
src %URL #IMPLIED-- URL for an external script -->
开 始 标 记: 需 要, 结 束 标 记: 需 要
特 性 定 义
type = cdata
这 个 特 性 指 定 了 这 个 元 素 内 容的 脚 本 语 言. 这 个 值 必 须 是 一 个 互 联 网 媒 体 格 式. 这 个 特 性 没 有 缺 省 值.
language = cdata
不 赞成. 这 个 特 性 指 定 了 元 素 的 内 容 的 脚 本 语 言. 它 的 值 是 这 个 语 言 的 标 识 符, 但 由 于 这 些 标 识 符 不 是 标 准 的, 这 个 特 性 被 认 为 是 不 赞 成 的 页 被 type 代 替.
src = url
这 个 特 性 指 定 了 外 部 脚 本 的 位 置.
SCRIPT 元 素 在 文 档 中 放 置 一 个 脚 本. 这 个 元 素 可 以 在 HTML 文 档 的 HEADBODY 中 出 现 任 意 多次.

脚本 可 以 在 SCRIPT 元 素 中 或 处 部 文 件 中 被 定 义. 如 果 src 特 性 没 有 被 设 定, 用 户 代 理 器 必 须 把 元 素 内 容 作 为 脚 本 来 解 译. 如 果 src 有 一 个 URL 值, 用 户 代 理 器 必 须 忽 略 元 素 内 部 并 且 通 过 URL 取 得 脚 本.

脚 本 被 作 为 必 须 被 用 户 代 理 器 知 道 的 脚 本 引 擎 来 考 虑.

指定脚本语言

因 为 HTML 并 不 依 赖 于 某 个 脚 本 语 言, 文 档 作 者 必 须 显 式 地 告 诉 用 户 代 理 器 每 个 脚 本 的 语 言. 这 可 以 通 过 一 个 缺 省 声 明 或 本 地 声 明 来 完 成.

SCRIPT 元 素 中 即 不 包 含 缺 省 脚 本 语 言 声 明 也 不 包 含 本 地 声 明 的 文 档 是 不 正 确 的. 用 户 代 理 器 可 能 仍 旧 解 译 并 不 需 要 的 脚 本.

缺省脚本语言

为 了 在 文 档 中 指 定 所 有 脚 本 的 缺 省 语 言 可 以 在 文 档 的 HEAD 中 包 含 下 列 的 META 声 明:
<META http-equiv="Content-Script-Type" content="type">
这 里 的 "type" 是 一 个 用 来 命 名 脚 本 语 言 的 互 联 网 媒 体 格 式 (Internet Media Type, 参 见 [MIMETYPES]). 这 些 值 的 例 子 是 "text/tcl", "text/javascript", "text/vbscript". 参 见 [MIMETYPES] 来 获 得 完 整 的 合 法 脚 本 语 言 列 表.

如 果 没 有 META 声 明, 缺 省 值 可 通 HTTP 引 导 头 的 "Content-Script-Type" 来 设 定.

 Content-Script-Type: type
这 里 的 "type" 也 是 命 名 脚 本 语 言 的 互 联 网 媒 体 格 式.

当 数 个 HTTP 引 导 头 和 META 元 素 存 在 时, 最 后 一 个 定 义 了 缺 省 的 脚 本 语 言. 由 于 我 们 的 目 的, HTTP 引 导 头 在 文 档 HEAD 之 前 出 现 被 考 虑.

本地脚本语言声声

通 过 type 特 性 在 每 个 SCRIPT 元 素 中 指 定 脚 本 语 言 也 是 可 能 的. 如 果 缺 少 缺 省 脚 本 语 言 的 指 定, 这 个 特 性 必 须 在 每 个 SCRIPT 元 素 中 设 置. 当 缺 省 的 脚 本 语 言 被 指 定 时, type 特 性 能 够 超 越 它.
在 本 例 中, 我 们 把 缺 省 脚 本 语 言 声 明 为 "text/tcl". 我 们 在 引 导 头 中 包 含 一 个 SCRIPT , 这 些 脚 本 位 于 一 个 外 部 文 件 并 在 "text/vbscript" 脚 本 语 言 中. 我 们 也 可 以 在 主 干 中 包 含 一 个 SCRIPT, 它 包 含 了 它 自 身 的 用 "text/javascript" 写 的 脚 本.
<HTML>
<HEAD>
<META http-equiv="Content-Script-Type" content="text/tcl">
<SCRIPT type="text/vbscript" src="http://someplace.com/progs/vbcalc">
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT type="text/javascript">
...some JavaScript...
</SCRIPT>
</BODY>
</HTML>

来自于脚本的 HTML 元素参照

每 个 脚 本 语 言 都 有 其 自 身 的 从 脚 本 指 向 HTML 物 件 的 惯 例. 这 个 说 明 书 没 有 定 义 一 个 有 关 HTML 物 件 的 标 准.

然 而, 脚 本 应 当 根 据 其 分 配 的 名 称 指 向 元 素. 脚 本 引 擎 应 当 在 标 识 一 个 元 素 时 遵 守 下 列 的 优 先 法 则: 如 果 两 个 均 被 设 置 name 特 性 比 id 更 有 优 先 权. 无 论 如 何 一 个 或 另 一 个 将 被 使 用.

脚本内容语法

SCRIPT 元 素 的 内 容 是 脚 本, 正 因 如 此 不 应 当 被 用 户 代 理 器 作 为 HTML 标 注 来 对 评 价. 用 户 代 理 器 必 须 把 它 当 作 传 送 给 脚 本 引 擎 的 数 据.

HTML 剖 析 器 必 须 根 据 开 始 标 记 和 结 束 标 记 一 开 始 时 的 后 跟 名 称 字 符 ([a-zA-Z]) 的 ETAGO ("</") 定 界 符 就 能 够 认 出 脚 本 数 据. 脚 本 数 据 并 非 必 须 要 用 </SCRIPT> 结 束 标 记 来 终 止, 但 它 终 止 于 任 何 后 跟 名 称 字 符 的 "</" .

因 此, 任 何 HTML 标 注 被 送 到 脚 本 引 擎 时 (无 论 何 时 只 要 是 希 望 标 注 时) 必 需 "换 码(escape)" 以 此 不 使 HTML 剖 析 器 感 到 混 乱. 每 种 脚 本 语 言 的 设 计 者 应 当 推 荐 语 言 特 性 支 持 来 解 决 这 个 问 题.

非法例程:

下 面 的 代 码 是 非 法 的, 因 为 "</EM>" 出 现 在 SCRIPT 元 素 里 面:

 <SCRIPT type="text/javascript">
  document.write ("<EM>This won't work</EM>")
 </SCRIPT>
一 个 一 致 剖 析 性 必 定 把 "</EM>" 数 据 当 作 脚 本 数 据 的 结 束, 这 明 显 不 是 作 者 的 意 图.

在 JavaScript 中, 这 个 代 码 可 以 通 过 确 保 不 让 ETAGO 定 界 符 紧 贴 着 SGML 名 称 开 始 字 符 之 前 出 现 来 表 达:

 <SCRIPT type="text/javascript">
  document.write ("<EM>This will work<\/EM>")
 </SCRIPT>
在 Tcl 中, 可 以 如 下 完 成:
 <SCRIPT type="text/tcl">
  document write "<EM>This will work<\/EM>"
 </SCRIPT>
在 VBScript, 这 个 问 题 可 以 通 过Chr() 函 数 来 避 免:
  
 "<EM>This will work<\" & Chr(47) + "EM>"

内部事件

特 性 定 义
当 用 户 通 过 用 户 代 理 器 交 互 时 为 一 定 数 量 的 事 件 联 系 一 个 动 作 是 可 能 的. 每 个 在 上 面 列 示 的 "内 部 事 件" 占 用 一 个 脚 本 的 值. 这 个 脚 本 无 论 何 时 只 要 元 素 的 事 件 出 现 就 执 行.

控 件 元 素 如 INPUT, SELECT, BUTTON, TEXTAREALABEL 均 响 应 于 一 定 的 内 部 事 件. 当 这 些 元 素 没 有 出 现 在 一 个 表 单 时, 它 们 可 以 用 来 提 高 文 档 的 图 像 用 户 接 口.

例 如, 设 计 者 可 能 希 望 在 他 们 的 文 档 中 包 含 一 个 按 钮 并 且 按 动 后 不 提 交 表 单 而 是 当 它 们 被 激 活 时 继 续 与 节 点 通 讯.

下 面 的 例 程 展 示 了 一 些 可 能 的 控 件 和 基 于 内 部 事 件 的 用 户 接 口 行 为.

在 下 列 的 例 程 中, userName 是 一 个 必 须 的 文 本 域. 当 一 个 用 户 打 算 留 空 这 个 域 时, OnBlur 事 件 呼 叫 JavaScript 函 数 来 确 定 userName 是 否 是 一 个 可 被 接 受 的 值.
<INPUT NAME="userName" onBlur="validUserName(this.value)">
这 里 是 另 一 个 JavaScript 例 程:
<INPUT NAME="num"
 onChange="if (!checkNum(this.value, 1, 10))
   {this.focus();this.select();} else {thanks()}"
 VALUE="0">
这 里 是 一 个 文 本 域 事 件 的 VBScript处 理 例 程:
 <INPUT name="edit1" size="50">  
 <SCRIPT type="text/vbscript">
  Sub edit1_changed()
   If edit1.value = "abc" Then
    button1.enabled = True
   Else
    button1.enabled = False
   End If
  End Sub

 </SCRIPT>
这 是 使 用 Tcl 的 同 一 个 例 程:
 <INPUT name="edit1" size="50">
 <SCRIPT type="text/tcl">
  proc edit1_changed {} {
   if {[edit value] == abc} {
    button1 enable 1
   } else {
    button1 enable 0
   }
  }
  edit1 onChange edit1_changed
 </SCRIPT>
这 是 一 个 事 件 的 JavaScript 例 程 绑 定 于 一 个 脚 本. 首 先 这 是 一 个 单 击 处 理:
  
<BUTTON type="button" name="mybutton" value="10">
<SCRIPT type="text/javascript">
  function my_onclick() {
     . . .
  }
 document.form.mybutton.onclick = my_onclick
</SCRIPT>
</BUTTON>
这 里 是 一 个 更 有 趣 的 视 窗 处 理:
  
<SCRIPT type="text/javascript">
  function my_onload() {
     . . .
  }

  var win = window.open("some/other/URL")
  if (win) win.onload = my_onload
</SCRIPT>
在 Tcl 中 为 :
<SCRIPT type="text/tcl">
   proc my_onload {} {
    . . .
   }
   set win [window open "some/other/URL"]
   if {$win != ""} {
     $win onload my_onload
   }
</SCRIPT>
注 意 "document.write" 或 等 价 的 语 句 在 本 质 的 事 件 处 理 上 建 立 并 写到一 个 新 新 文 档 而 不 是 修 改 当 前 的 那 个.

本质事件脚本剖析

本 质 事 的 脚 本 特 性 被 定 义 为 CDATA. SGML 的 CDATA 特 性 值 处 理 需 要 (1) 出 现 于 特 性 值 的 实 体 更 换, 和 (2) 那 个 特 性 值 用 双 引 号 (") 或 单 引 号 (') 限 定.

通 过 给 出 这 些 语 法 限 定, 定 界 符 ('), ("), "&" 和 "&#" 无 法 直 接 地 出 现 于 特 性 值 中. 为 了 解 决 这 个 问 题, 我 们 建 议 脚 本 事 件 的 处 理 特 性 始 终 使 用 (") 定 界 符 而 出 现 在 事 件 处 理 特 性 中 的 定 界 如 下 表 示:

 '"'应 当 写 作 "&quot;" 或 "&#34;"
 '&'应 当 写 作 "&amp;"或 "&#38;"
因 此 举 例 来 看 应 当 写 作:
<INPUT name="num" value="0"
onChange="if (compare(this.value, &quot;help&quot;)) {gethelp()}">
SGML 允 许 (') 被 包 含 于 用 双 引 号 (") 的 特 性 字 符 串 中, 或 相 反. 因 此 下 列 是 正 确 的:
"this is 'fine'"

文档的动态修改

当 文 档 被 调 入 时 运 行 的 脚 本 可 以 动 态 地 修 改 文 档 的 内 容. 如 此 做 的 能 力 取 决 于 脚 本 语 言 自 身 (例 如 由 某 些 卖 主 提 供 的 HTML 物 件 模 板 中 的 "document.write" 语 句).

文 档 的 动 态 修 改 可 如 下 建 模:

  1. 所 有 的 SCRIPT 元 素 均 在 文 档 被 调 入 时 依 次 被 评 定.
  2. 所 有 在 一 个 给 出 的 SCRIPT 元 素 中 的 脚 本 结 构 被 认 为 生 成 SGML CDATA. 它 们 结 合 的 生 成 文 字 被 插 入 到 SCRIPT 元 素 的 位 置.
  3. 生 成 的 CDATA 被 重 新 评 定.
HTML 文 档被 强 迫 SCRIPT 元 素 前 后 均 于 与 HTML DTD 一 致.
下 面 的 例 程 举 例 说 明 了 脚 本 是 如 何 动 态 修 改 文 档 的. 下 面 的 脚 本:
<TITLE>Test Document</TITLE>
<SCRIPT type="text/javascript">
   document.write("<p><b>Hello World!<\/b>")
</SCRIPT>
具 有 相 同 于 HTML 标 注 的 效 果:
<TITLE>Test Document</TITLE>
<P><B>Hello World!</B>

为不提供脚本的用户代理器设计文档

下 面 的 章 节 讨 论 了 作 者 在 设 计 好 的 HTML 文 档 时 应 该 考 虑 的 关 于 缺 少 脚 本 支 持 问 题.

NOSCRIPT 元素

<!ELEMENT NOSCRIPT - - (%block)>
开 始: 需 要, 结 束: 需 要

NOSCRIPT 元 素 允 许 作 者 在 脚 本 无 法 运 行 的 时 候 提 供 轮 替 内 容. NOSCRIPT 元 素 的 内 容 只 在 脚 本 - 知 道 的 用 户 代 理 器 上 在 下 列 情 况 被 渲 染:

  • 用 户 代 理 器 设 置 为 不 考 虑 脚 本.
  • 用 户 代 理 器 不 支 持 在 文 件 前 段 的 SCRIPT 元 素 请 求 的 脚 本 语 言.
不 提 供 客 户 端 脚 本 语 言 的 用 户 代 理 器 必 须 渲 染 这 个 元 素 的 内 容.
在 下 面 的 例 程 中, 一 个 用 户 代 理 器 激 活 SCRIPT 将 在 文 档 中 包 含 一 些 动 态 建 立 的 数 据. 如 果 用 户 代 理 器 不 支 持 脚 本, 用 户 可 以 仍 旧 从 链 接 中 取 得 数 据.
<SCRIPT type="text/tcl">
...some Tcl script to insert data...
</SCRIPT>
<NOSCRIPT>
<P>To access the data, click <A href="http://someplace.com/data">here.</A>
</NOSCRIPT>

注释掉脚本Commenting out scripts

那 些 不 认 识 SCRIPT 元 素 的 用 户 代 理 器 将 把 元 素 内 容 如 文 本 般 渲 染. 某 些 脚 本 引 擎, 包 括 那 些 使用 JavaScript, VBScript 和 Tcl 语 言 的 允 许 脚 本 语 句 被 附 着 于 一 个 SGML 注 释 中. 不 认 识 SCRIPT 元 素 的 用 户 代 理 器 将 因 此 忽 略 这 些 注 释 而 好 的 脚 本 引 擎 则 能 理 解 这 些 在 注 释 中 的 脚本 并 执 行 之.

另 一 种 解 决 这 个 问 题 的 方 法 是 把 脚 本 置于 处 部 文 档 并 在 src 特 性 是 指 向 它 们.

在 JavaScript 中注释脚本
JavaScript 引 擎 允 许 "<!--" 字 串 出 现 在 一 个 SCRIPT 元 素 开 始 时, 并 且 忽 略 后 续 的 字 符 直 到 行 末. JavaScript 把 "//" 解 译 为 开 始 注 释 并 扩 展 到 当 前 行 末. 这 是 JavaScript 剖 析 器 的 需 要: 隐 藏 "-->" 字 串.

<SCRIPT type="text/javascript">
<!-- to hide script contents from old browsers
function square(i) {
 document.write("The call passed ", i ," to the function.","<BR>")
 return i * i
}
document.write("The function returned ",square(5),".")
// end hiding contents from old browsers-->
</SCRIPT>
在 VBScript 注释脚本
在 VBScript, 一 个 单 引 号 字 符 引 起 后 面 的 在 当 前 行 中 的 均 被 作 为 注 释 对 待. 因 此 可 以 从 VBScript 中 隐 藏 "-->" 字 串, 例 如:
  <SCRIPT type="text/vbscript">
   <!--
    Sub foo()
   ...
    End Sub
   ' -->
 </SCRIPT>
在 TCL 中注释脚本
在 Tcl,"#" 字 符 注 释 掉 行 的 多 余 部 分:
<SCRIPT type="text/tcl">
<!--to hide script contents from old browsers
proc square {i} {

 document write "The call passed $i to the function.<BR>"
 return [expr $i * $i]
}
document write "The function returned [square 5]."
# end hiding contents from old browsers-->
</SCRIPT>
注 意: 某 些 浏 览 器 以 第 一 个 ">" 字 符 关 闭 注 释, 所以 为 了 在 这 种 浏 览 器 中 隐 藏 脚 本 注 释, 你 可 对 运 算 关 系 改 变 运 算 符 和 改 变 操 作 (如 使 用 "y < x" 较 之 与"x > y") 或 使 用 基 于脚 本 语 言 的 转 义 ">" 字 符.

前页 | 后页 | 目录 | 元素 | 特性