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

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

脚本

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

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

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

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

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

SCRIPT元素

<!ELEMENTSCRIPT - - CDATA -- script statements -->
<!ATTLIST SCRIPT
typeCDATA#IMPLIED--Internet content type for script language --
languageCDATA#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元素

<!ELEMENTNOSCRIPT - - (%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") 或 使 用 基 于脚 本 语 言 的 转 义 ">"字符.

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