|
|
|
前页 | 后页 | 目录 | 元素 | 特性 脚本脚 本 提 供 作 者 一 个 扩 展 HTML 文 档 活 跃 和 交 互 的 方 法. 例 如:
注 意: 这 份 说 明 书 在 脚本宏
章 节 中 包 含 了 一 些 更 细 节 化 的 关 于 脚 本 信 息.
为提供脚本的用户代理器设计文档下 面 的 章 节 讨 论 与 提 供 脚 本 的 用 户 代 理 器 有 关 的 发 行 问 是.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 -->开 始 标 记: 需 要, 结 束 标 记: 需 要 特 性 定 义
SCRIPT 元 素 在 文 档 中
放 置 一 个 脚 本. 这 个 元 素 可 以 在 HTML 文 档 的 HEAD
或 BODY 中 出 现
任 意 多次.
脚本 可 以 在 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, TEXTAREA 和 LABEL 均 响 应 于 一 定 的 内 部 事 件. 当 这 些 元 素 没 有 出 现 在 一 个 表 单 时, 它 们 可 以 用 来 提 高 文 档 的 图 像 用 户 接 口. 例 如, 设 计 者 可 能 希 望 在 他 们 的 文 档 中 包 含 一 个 按 钮 并 且 按 动 后 不 提 交 表 单 而 是 当 它 们 被 激 活 时 继 续 与 节 点 通 讯. 下 面 的 例 程 展 示 了 一 些 可 能 的 控 件 和 基 于 内 部 事 件 的 用 户 接 口 行 为. 在 下 列 的 例 程 中, 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) 那 个 特 性 值 用 双 引 号 (") 或 单 引 号 (') 限 定.通 过 给 出 这 些 语 法 限 定, 定 界 符 ('), ("), "&" 和 "&#" 无 法 直 接 地 出 现 于 特 性 值 中. 为 了 解 决 这 个 问 题, 我 们 建 议 脚 本 事 件 的 处 理 特 性 始 终 使 用 (") 定 界 符 而 出 现 在 事 件 处 理 特 性 中 的 定 界 如 下 表 示: '"'应 当 写 作 """ 或 """ '&'应 当 写 作 "&"或 "&" 因 此 举 例 来 看 应 当 写 作:
<INPUT name="num" value="0"
onChange="if (compare(this.value, "help")) {gethelp()}">
SGML 允 许 (') 被 包 含 于 用 双 引 号 (") 的 特 性 字 符 串 中, 或 相
反. 因 此 下 列 是 正 确 的:
"this is 'fine'"
在 下 面 的 例 程 中, 一 个 用 户 代 理 器 激 活 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 中注释脚本
<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") 或 使 用 基 于脚 本 语 言 的 转 义 ">" 字 符.
|