|
前页|后页| 目录|元素| 特性 脚本脚本提供作者一个扩展HTML文档活跃和交互的方法.例 如:
注意:这份说明书在脚本宏
章节中包含了一些更细节化的关于脚本信息.
为提供脚本的用户代理器设计文档下面的章节讨论与提供脚本的用户代理器有关的发行问 是.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 -->开始标记:需要,结束标记:需要 特性定义
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'" 文档的动态修改当文档被调入时运行的脚本可以动态地
修改文档的内容.如此做的能力取决于脚本语言自身(例
如由某些卖主提供的HTML物件模板中的"document.write"语句).
文档的动态修改可如下建模:
下面的例程举例说明了脚本是如何动态
修改文档的.下面的脚本:
<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 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") 或 使 用 基 于脚 本 语 言 的 转 义 ">"字符.
|