JavaScript 教程



第 1 集

 




JavaScript 是什麽?

  JavaScript 是一种新的描述语言,此一语言可以被箝入 HTML 的文件之中。

透过 JavaScript 可以做到回应使用者的需求事件 (如: form 的输入) 而不用任何的网路

来回传输资料,所以当一位使用者输入一项资料时,它不用经过传给伺服端 (server)

处理,再传回来的过程,而直接可以被客户端 (client) 的应用程式所处理。你也可

以想像成有一个可执行程式在你的客端上执行一样!目前已有一些写好的程式在

Internet 上你可以连过去看看,以下有一些计算器的例子,在 Nescape 上。


JavaScript 和 Java 很类似,但到底并不一样! Java 是一种比 JavaScript 更复杂

许多的程式语言,而 JavaScript 则是相当容易了解的语言。JavaScript 创作者

可以不那麽注重程式技巧,所以许多 Java 的特性在 Java Script 中并不支援。

 

如需相关的更多资讯,可以去读读 Netscape 的有关 Netscape JavaScript 之介绍。





如何执行 JaveScript? 范例 1:

JavaScript 如何执行呢?

Netscape 2.0 beta 3 版以上,就可以执行 JavaScript 的功能了,我们测试过至少

beta 3 版以上可以,其他种类的 WWW 浏览器如:Internet Expore 3.0也有此一功能。


 




以下我们就以一些例子来告诉你如何将 JavaScript 写在 HTML 文件中,并且体会

一下新语言的特性,我们从第一个例子开始:如何用 JavaScript 印出一串文字至

HTML 文件中:

<html>
<head>
My first JavaScript!
</head>
<body>
<br>
This is a normal HTML document.
<br>
  <script language="LiveScript">
    document.write("这是以 JavaScript 印出的!")
  </script>
<br>
Back in HTML again.
</body>
</html>

如果你使用的 WWW 浏览器是 Netscape 2.0 beta 3 以上版本的话,那你就可以

看到相关的结果,而如果你的浏览器并非是可以支援 JavaScript 的话,那看起

来就会有一些怪怪的了,以上范例的结果如下:

This is a normal HTML document.
<script language="LiveScript" type="text/javascript"> </script> 这是以 JavaScript 印出的!
Back in HTML again.
此一范例并没有太大的用处,它只是要告诉你如何使用<script>的标签,并

 

如何将它置於 HTML 的文件之中而已,这个新的标签你可以特它放在文件

中的任何地方。

 




范例 2:

接下来下一个例子所要介绍的是有关函数 (function) 的使用。请放心,函数并

非很难懂的东西,但它却相当有用。函数通常是在 HTML 文件中 <body >的

部份被呼叫,而理所当然地,它最好事先被宣告并放在 HTML 文件中 <body>

的部份。好让在 <body> 部分中使用到函数时,它已确定被读取住来。另外,

<script> 标签的有关描述语法剖份,你可以用注解的符号将它括起来,以免旧

版或无法读取 JavaScript 的浏览器读到,而误会了意思!

<html>
<head>
  <script language="LiveScript">
     function pushbutton() {
       alert("嗨! 你好");
  }
 </script>
</head>
<body>
<form>
  <input type="button" name="Button1" value="Push me" οnclick="pushbutton()">
  </form>
</body>
</html>

如果你是使用 Netscape 2.0 beta 3 以上的浏览器,那以上 JavaScript 语法部份

的结果如下,你可以试着按按钮看看有何结果产生!

在范例 2 中,将会产生一个按钮,当你用滑鼠去按它的时候,应该会出现

一个视窗上面有“嗨! 你好”的字串,如何?不错吧!这个结果是如何产生

的呢?首先,在 <head>内的函数会被载入并存於内存中,接着一个新

的 <form>标签 <input type ="button".....>将产生一个接钮。然後,你可以

在後面看到 'onClick' 的指令,这就是告诉浏览器,当该按钮被按时,应会执行

onClick 後的函数 'pushbutton()',而这个函数在刚刚程式被载入时就已安放在

记忆体中了!请注意,在这个函数中我们用到了个新东西- alert 的 method,

是 JavaScript 事先定义好的,它会以对话视窗产生内涵的讯息,并有一"确定"

(OK)的按钮。 JavaScript 定义了许多的 method,你可以连至 Netscape 公司去

获取较完整的讯息。我想这些 method 在不久的将来会有长长的一串可以够你

学的,不过目前的 method 也已经可以做出相当多东西了!

接着下个例子将告诉你如何由一个输入型表格中读入使用者的输入资料,

事实上,这也是加入个函数就可以达成的。

 




范例 3:

 

<html>
<head>
<script language="LiveScript">
<!--  hide script from old browsers
  function getname(str) {
    alert("哈罗! "+ str+"!");
  }
// end hiding contents -->
</script>
</head>
<body>
Please enter your name:
<form>
  <input type="text" name="name" onBlur="getname(this.value)" value="">
</form>
</body>
</html>

现在你可以试试结果如何:

请输入你的名字:

 

(<!- ... ->) 此部分即我们之前所提到的它可以避免旧版本或是不支援 JavaScript

的 WWW 浏览器因为不认识这些函数而产生错误。它的顺序应 该为 <script>

先,接着为注解的开头 <!-,然後是内容,注解尾 ->, 最後是 </script>。

另外要注意的一点是,语解尾那一行的开头双斜线 "//" ,不可以省略,它代表了

JavaScript 的注解,若省略了的话, ->之前的字会被误认为是 JavaScript 的指令。


这个例子可以让使用者输入一段文字,然後再输入完毕後经由 <input>标签中的

"onBlur" 事件函数侦知,於是呼叫 Getname(Str)这个函数来加以取得输入字串,

并将它显示在对话视窗上!函数 Getname(this.value) 中的 "this.value" 是你在文

字输入格式中所输入的值。

 




范例 4:

这个范例更是帅了!我们在 HTML 文件档完成了以後,常会加上一行文件

最後修改的日期,现在你可不用担心每次都要去改或是忘了改了。你可以

很简单的写一个如下的描述语法程式,就可以自动的为你每次产生最後修

改的日期了:

<html>
<body>
This is a simple HTML- page.
<br>
Last changes:
  <script language="LiveScript">
  <!--  hide script from old browsers
    document.write(document.lastModified)
  // end hiding contents -->
  </script>
</body>
</html>
以上的 document.lastModified 叁数在 Netscape 2.0 beta 2 版时是被写成

documeut.lastmodified 的,然而,之後的版本就改为 document.lastModified

所以注意一下 ;JavaScript 本身是会区分大小写的, lastmodifiedlastModified

在它看来是不同的结果。

最後,在这一部分结束之前,要提醒你一点,像范例 4 ,的用法并非每一部

机器都是一样的,例如:PC 上跑得很正确的,在工作站上不一定会有相同的

结果,所以,或许你仍得测一测不同机器的结果才会有所定论。当然,这一切

是因为 JavaScript 还正在发展的原因,最新的讯息还是得去拜访一下Netscape

公司才知道。也许你也不用奇怪,当你隔周再来访时,JavaScript 可能又作了

相当大的改变了呢!

 

 

第 2 集

 




范 例 5:

在 这 一 部 分 首 先 要 为 你 展 示 的 JavaScript 特 性 是 将 你 的 滑 鼠 移 到 这 个 不 同 颜 色

连 结上 面, 此 时 看 看 浏 览 器 下 的 状 态 列 有 何 结 果。 然 後 这 样 的 功 能 我 们 可 以

与 JavaScript 的 功 能 相 结 合。 好, 现 在 再 将 你 的 滑 鼠 移 到 本 处 不 同 颜 色 的连 结

面, 你 应 该 会 发 现 有 一 个 视 窗 出 现, 是 吧?! 如 何! 怎 麽 做 到 的 呢? 以 下 就 是

这 一 个 连 结 的 作 法:

<a href="tpage.htm" onMouseOver="window.status='Just another stupid link...'; return true">

在 这 儿 你 只 要 在 传 统 <a> 的 标 签 中 加 入 onMouseOver 的 method, 就 可 达 成 你 要 的

效 果 了。 这 里 的 window.status 是 用 来 让 你 可 以 在 WWW 浏 览 器 的 状 态 列 上 显 示

一 些 讯 息 用 的。 在 语 法 中, 你 可 以 看 到 讯 息 部 分 是 用 ' 括 起 来 的 部 分, 而 非 以 " 括

起 来, 在 讯 息 部 分 结 束 之 後, 必 须 加 上 ; return true

好 了, 利 用 以 上 的 特 性 可 以 很 简 单 的 完 成 第 二 个 连 结 的 例 子! 相 当 简 单, 以

onMouseOver 的 method 然 後 配 合 事 件 发 生 时 去 呼 叫 函 数 hello() 就 行 了, 不 再

多 加 解 释 了, 作 法 如 下:

<html>
<head>
<script language="LiveScript">
<!-- Hiding
     function hello() {
       alert("哈 罗!");
     }
</script>
</head>
<body>
<a href="" onMouseOver="hello()">link</a>
</body>
</html>

 


范 例 6:

接 下 来 我 们 要 告 诉 你 一 个 使 用 日 期 和 时 间 的 例 子。 在 第 一 部 分 中, 你 已 看 过 了

lastModified 的 用 法 和 作 法。 现 在 要 告 诉 你 的 并 非 是 印 出 网 路 上 伺 服 器 或 文 件

修 改 日 期, 而 是 你 个 人 客 户 端 机 器 的 日 期 和 时 间。 以 下 就 是 执 行 结 果:

<script language="LiveScript" type="text/javascript"> </script> 现 在 时 间 是: 16:44
今 天 日 期 为: 6/8/2006

做 法 如 下:

<script language="LiveScript">
<!-- Hiding
  today = new Date()
  document.write("现 在 时 间 是: ",today.getHours(),":",today.getMinutes())
  document.write("<br>今 天 日 期 为: ", today.getMonth()+1,"/",today.getDate(),"/",today.getYear());
// end hiding contents -->
</script>

在 本 例 中, 我 们 必 需 首 先 建 立 一 个 日 期 变 数, 这 可 以 由 today= new Date()来 完 成。

如 果 没 有 特 别 指 定 时 间 与 日 期 的 话, 浏 览 器 将 会 采 用 本 地 客 户 端 机 器 的 时 间, 若 将

它 放 入 变 数 today 中。 这 儿 要 注 意 的 是: 我 们 并 没 有 宣 告 today 这 个 变 数 的 型 态,

这 和 Java 或 其 他 的 程 式 语 言 在 用 到 变 数 之 前 必 需 先 加 以 宣 告 的 方 式 有 相 当 大 的 不

同。 在 完 成 today 的 日 期 变 数 後, 我 们 等 於 建 立 了 一 个 具 有 本 地 时 间 与 日 期 的 物 件

(object)。 接 着 就 可 以 使 用 get... 的 method 以 取 得 today 这 个 物 件 的 时 间 和 日 期。

请 注 意 getMonth 这 个 method 所 取 得 的 月 份 范 围 是 由 0~11, 所 以 必 须 加 1 以 代

表 真 正 的 1 月 至 12 月。 看 完 以 上 的 例 子 後, 想 想 你 可 以 使 你 的 文 件 变 得 有 点

智 慧, 例 如: 某 个 文 件 有 时 效 限 制 的 话, 你 可 以 利 用 我 们 在 上 一 部 份 的范 例 4

中 所 提 到 的 功 能 和 这 一 个 范 例 中 所 学 习 到 的 功 能, 设 计 一 个 让 你 的 文 件 在 第10天

以 後 读 到 的 话 就 会 告 诉 读 者:"喂! 这 篇 已 过 时 了!"的 程 式, 试 试 看, 并 不 难!


除 以 上 功 能 外, 在 建 立 日 期 物 件 时 你 也 可 以 事 先 设 定 日 期 如 下:

 

docStarted= new Date(96,0,13)

首 先 是 年(西 元), 接 着 是 月(但 记 得 减 1), 再 接 着 是 日。 同 样 的 方 法 也 可 以

加 上 时 间 的 设 定, 如 下:

 

docStarted = new Date(96,0,13,10,50,0)

前 三 个 是 日 期 的 年、 月、 日, 接 着 是 时、 分、 秒。 最 後, 我 们 必 须 提 醒 你,

JavaScript 并 没 有 实 际 的 日 期 型 态, 但 是 它 却 能 毫 不 费 力 地 显 示 出 日 期 和 时 间,

原 因 是 它 是 从 1 / 1 / 1970 0:0h 开 始 以 ms(milli seconds) 来 计 算 目 前 的 时 间 的,

这 听 起 来 似   有 些 复 杂, 但 你 倒 不 用 担 心, 它 有 标 准 的 共 用 函 数 可 以 计 算,

你 只 要 知 道 如 何 用 就 可 以 了!

 


范 例 7:

接 下 来 我 们 要 为 你 介 绍 一 个 可 以 产 生 乱 数 的 函 数, 也 是 以 JavaScript 所 写 的。

这 个 函 数 只 是 利 用 了 一 点 小 技 巧 而 已, 而 这 种 技 巧 在 大 部 分 的 编 译 器(compiler)中,

大 都 是 如 此(或 类 似) 计 算 出 乱 数 来 的。 我 相 信 JavaScript 最 後 应 也 会 以 相 似 的 方

法 来 产 生 这 样 的 method , 如 果 它 会 提 供 这 样 功 能 的 话。 以 下 是 此 函 数 的 结 果:

这 是 一 个 计 算 产 生 的 乱 数: <script language="LiveScript" type="text/javascript"> </script> 0.37723601770451265

以 下 是 这 个 作 法 的 写 法:

<html>
<head>
<script language="LiveScript">
function RandomNumber() {
  today = new Date();
  num = Math.abs(Math.sin(today.getTime()));
  return num;  
}
</script>
</head>
<body>
<script language="LiveScript">
<!--
  document.write("This is a random number:", RandomNumber());
// -->
</script>
</body>
</html>

我 们 的 做 法 是 以 上 一 个 范 例 中 的 时 间 函 数; 它 会 出 现 一 个 很 大 的 数,

利 用 这 个 数 再 加 以 运 算 即 可! 例 如: 将 它 拿 来 做 正 弦 函 数(sin) 的 运

算, 得 到 的 数 再 做 绝 对 值 的 运 算, 结 果 可 以 得 到 一 个 介 於 0 与 1 间 的

实 数。 因 为 时 间 的 改 变 是 ms 为 单 位, 而 且 你 绝 不 会 获 得 相 同 的 数 字。

不 过 这 个 做 法 并 不 适 合 拿 来 快 速 的 连 续 产 生 一 系 列 的 乱 数, 但 如 果 你

是 不 定 时, 久 久 的 用 一 次, 那 效 果 就 不 错 了!

 


范 例 8:

JavaScript 的 一 个 重 要 特 点 是 它 可 以 制 作 视 窗。 你 可 以 产 生 一 个 的 视 窗, 并 且

在 此 视 窗 中 载 入 HTML 文 件, 完 全 以 JavaScript 来 航 游 网 际 网 路(Internet )。

接 下 来 的 范 例 就 是 告 诉 你 如 何 开 启 一 个 视 窗 并 且 写 点 东 西 进 去, 你 可 先 试 试

按 一 下 范 中 之 接 钮 看 看!

原 始 程 式 如 下:

<html>
<head>
<script language="LiveScript">
function WinOpen() {
   msg=open("","DisplayWindow","toolbar=no,directories=no,menubar=no");
   msg.document.write("<HEAD><TITLE>哈 罗!</TITLE></HEAD>");
   msg.document.write("<CENTER><H1>酷 毙 了!</H1><h2>这 是<B>JavaScript</B>所 开 的 视 窗!</h2></CENTER>");
}
</script>
</head>
<body>
<form>
<input type="button" name="Button1" value="Push me" οnclick="WinOpen()">
</form>
</body>
</html>

这 儿 你 又 看 到 用 按 钮 来 启 动 函 数。 这 次 的 函 数 WinOpen()是 藉 着 一 个 open

的 method 来 产 生 一 个 新 的 视 窗。 第 一 对 双 引 号("")是 用 来 描 述 欲 载 入 至 视 窗

中 的 文 件 URL 位 置。 如 果 留 者 空 白 的 话, 那 就 会 呈 现 一 个 空 白 视 窗, 并 可 以

透 过 JavaScript 写 入 东 西! 下 一 对 双 引 号 内 的 内 容 是 这 个 新 开 启 视 窗 的 名 字,

你 可 以 喜 欢 给 它 任 意 一 个 名 字, 但 不 可 加 入 空 白, 如 用 Display Window 的 话 便

会 出 现 错 误 讯 息, 请 注 意。 接 下 来 的 一 连 串 双 引 号 内 所 指 定 的 是 该 视 窗

的 相 关 性 质(properties), 这 些 蛮 有 趣 的, 你 可 以 指 定 要 不 要 有 工 具 棒(toolbar) 、

卷 轴(scrollbar), 等 等, 例 如: 如 果 你 写 toolbar = yes, 那 就 会 在 你 所 产 生 出

来 的 视 窗 中 出 现 一 排 工 具 列。 以 下 有 许 多 你 可 以 改 变 的 视 窗 特 性, 请 注 意 它 们

字 中 间 不 可 以 有 空 白:

toolbar
location
directories
status
menubar
scrollbars
resizable
copyhistory
width=pixels
height=pixels

以 上 的 pixels 部 分, 你 可 以 填 入 点 数 的 数 值, 这 数 值 是 告 诉 浏 览 器 这 个 视 窗 的

大 小。 在 开 启 视 窗, 并 且 将 它 称 为 msg 以 後, 就 可 以 开 始 写 些 东 西 到 视 窗 中 了。

你 可 以 写 入 一 般 正 规 的 HTML 语 法 文 字。 哇! 这 可 不 得 了 了, 也 就 是 说, 你 可 以

利 用 先 前 使 用 者 在 form 表 格 中 输 入 给 你 的 文 章 直 接 将 它 回 应 至 浏 览 器 上 来 了! 这 些

功 能 在 几 个 月 前 大 概 还 只 能 用 CGI 才 能 达 到 喔! 现 在 你 不 用 CGI 也 可 以 做 了!

 

 

 

 



第 三 集

 




曾 有 许 多 网 友 问 我 有 关JavaScript与 框 架(为 求 方 便, 以 下 均 用frame表 示)合 用 的 问 题。 事 实 上,若 您 同 时 想 用frames和JavaScript的 功 能, 首 先 您 必 需 拥 有Netscape Navigator 2.0 (或 以 上)浏 览 器( 至 少 目 前 是 如 此)。 当 然 也 有 某 些 浏 览 器 支 援frames的 功 能--如:Oracle开 发 的PowerBrowser, 但 此浏 览 器 还 只 是Beta版, 目 前 尚 不 支 援JavaScript。

首 先, 我 稍 微 解 释 一 下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, 而 且 将 它 们 分 别 命 名 为 fr1fr2。 所 以 我 用 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消 除。

 


 





第四集

 




这章我将告诉您如何在状态列 (statusbar) (也就是您浏览器最下方显示 URLs 的那一行) 显示文字,并且将教您 '跑马灯' (以下简称 scroller ) 的工作原理。虽然以 JavaScript 完成的 scroller 目前仍有些问题 (稍後会提到问题在哪儿?),但我还是告诉您它是如何写成的。

首先,如何将文字填入 statusbar 呢?下述语法将告诉您如何做到这项功能: (按下按钮後请注视 statusbar 的变化)

很新奇吧! 请看看原始码 :

 

<html>
<head>
<script language="JavaScript">
<!-- Hide
function statbar(txt) {
   window.status = txt;
}
// -->
</script>
</head>
<body>
<form>
<input type="button" name="look" value="写入文字" οnclick="statbar('嗨 ! 这就是状态
列 (statusbar) !');">
<input type="button" name="erase" value="清除文字" οnclick="statbar('');">
</form>
</body>
</html>

我制作了两个都会呼叫 statbar(txt) 函式 (function) 的按钮。当此函式被呼叫後,字串经由括弧中的变数 txt 传给 statbar(txt)。 (不一定要用 txt,用别的变数名也可以)。当电脑执行到 <form> tag 时, 一旦按下按钮就会呼叫 statbar(txt)。但是电脑并没有马上将 txt 的内容写在 statusbar,只是将欲显示的字串存入 txt。换句话说,藉由呼叫函式,只是让变数 txt 得到一个值。因此当您按下 '写入文字' 这个按钮後,会呼叫 statbar(txt) 而且 '嗨 ! 这就是状态列 (statusbar) !' 这个字串会存入 txt 中。咻 ! 讲了这麽多只是想告诉您这种写法可预留一些弹性。什麽弹性呢?就是您可重复使用 txt 这个变数。您看看第二个按钮,它也是呼叫相同的函式。若您不利用一个变数来传递字串的话,就必须写两个不同的函式了。

那麽 statbar(txt) 到底做了些什麽?其实没什麽,只是将 txt 的内容写入变数 window.status中。这是由 window.status = txt; 做的。另外若想消除文字,只需送一个空字串 ('') 给 statusbar。请注意,因为在 onClick 中我们已经使用双引号 " ,所以这里必须用单引号 ' 。这是为了让浏览器辨认哪两个引号是一对的,因此您必需双引号和单引号交替使用。

由此份简介文件第二章您已学过 onMouseOver 的特性了 :
<a href="tpage.html" onMouseOver="window.status='Just another stupid link...'; return true">
您可能会对一件事感到厌烦。那就是当 mouse 的指标已从 link 移开了,但是 statusbar 中的文字还留在那 !没关系,我教您一个解决的办法。利用上面教您如何消除 statusbar 中文字的方法,我们来写一个小函式。但是如何侦测出 mouse 的指标已从 link 移开并进而呼叫消除文字的函式呢?侦测 mouse指标是否已从 link 移出的功能目前还无法达到,但可用 "计时器" 来暂时解决此问题。

试试将 mouse 移到此 link 上看看 statusbar 的变化,但请不要按它。

怎麽样?很棒吧!看看下面的原始码您就知到这东西很简单。

 

<html>
<head>
<script language="JavaScript">
<!-- Hide
function moveover(txt) {
   window.status = txt;
   setTimeout("erase()",1000);
}
function erase() {
   window.status="";
}
// -->
</script>
</head>
<body>
<a href="dontclck.html" onMouseOver="moveover('瞬间即逝 !');return true;">
link</a>
</body>
</html>

这 script 的许多部份相信您已了解。 moveover(txt) 其实和先前的 statbar(txt) 差不多。erase()也和先前所讨论的相同。在 HTML 网页中的 <body> tag 里我们加入一个具有 onMouseOver 功能之 link。当 mouse 指标移至 "link" 上就会呼叫 moveover(txt),并且利用 txt 变数传递字串 '瞬间即逝 !'。接下来的步骤就和 statbar(txt) 一样, window.status 收到 txt 的值後将之显示在 statusbar 上。而 setTimeout(...)这项新函式是用来作为一个 "定时器"。setTimeout(...)能作些什麽事呢?它的主要特性是当某段设定的时间 "跑" 完了之後,便执行某函式。在这个例子中,於 1000 毫秒後 (也就是 1 秒後) 就会执行 erase()。换句话说,当 1 秒结束後 moveover(txt) 的功能就会因 erase()的自动执行而停止。
虽然规定时间 "跑" 完後定时器并不会重新启动,但您可以在 erase() 中再用一次setTimeout(...) ,使其循还不断,看起来就像一个跑马灯 (scroller)。

 


您已学到了 setTimeout 的功能和如何在 statusbar 中显示文字,接下我将教您如何制作一个在 statusbar 显示的 "跑马灯" (scroller)。

请按下方的按钮看看我做的 scroller。由於 script 需由 server 载入到您的电脑中,因此这要花一点时间,请耐心等一下。

以下是原始码 :

 

<html>
<head>
<script language="JavaScript">
<!-- Hide

var scrtxt="怎麽样 ! 很酷吧 ! 您也可以试试."+"Here goes your message the visitors 
to your page will "+
"look at for hours in pure fascination...";
var lentxt=scrtxt.length;
var width=100;
var pos=1-width;

function scroll() {
  pos++;
  var scroller="";
  if (pos==lentxt) {
    pos=1-width;
  }
  if (pos<0) {
    for (var i=1; i<=Math.abs(pos); i++) {
      scroller=scroller+" ";}
    scroller=scroller+scrtxt.substring(0,width-i+1);
  }
  else {
    scroller=scroller+scrtxt.substring(pos,width+pos);
  }
  window.status = scroller;
  setTimeout("scroll()",150);
  }
//-->
</script>
</head>
<body onLoad="scroll();return true;">
这里可显示您的网页 !
</body>
</html>

上面 script 用的语法相信大部份您已经懂了。 setTimeout(...) "告诉" 计时器当时间到了就呼叫 scroll()。 如此一来 scroller便会向前移动一步。在 script 的开头有许多计算式,那是用来决定文字开始显示的位置,了不了解并不重要。一旦决定了文字的启始位置,就必需加些空格 (space) 以使文字能显示在正确位置。

在此章一开始我曾提到,此种 scroller 并不是很受欢迎。即使是,也不会持续很久。为什麽呢? 下面我列出几个主要原因:
当第一次看到 scroller 或许您会觉得很新奇,但久而久之便会觉得索然无味。当然,这是所有 "酷玩意儿" (cool trick) 皆有的现象。
其实这还不是主要原因,更严重的问题还在後头呢 ! 当您移动 mouse 时,您可以发现 scroller 的速度改变了 (至少在我的机器上是如此)。尤其当您更改 setTimeout 的值为使 scroller 跑快一点时,这种情况更严重。不过这问题或许还有解决方法。更糟的是若让 scroller 跑久一点,会出现 Out of memory error的问题 ! 天呀 ! 这是 Netscape Navigator 2.0 的一个 "臭虫" (bug)。我们期待新的版本能更正此 bug (译按 : Netscape Navigator Atlas Preview Release 已更正此 bug)。

在网路上有许多这方面的应用,您可以试着找找。我曾经看过有人将 scroller 放在 Homepage 中,这应该不会太难。(译按 : 有兴趣的人可叁考目录中本人所制做的 scroller)

 


 

 
 



第 五 集

 




阵 列(arrays)的 运 用 是 程 式 设 计 中 一 项 种 要 的 技 术。 每 一 种 程 式 语 言 均 以 某 种 特 定 方 式 来 表 示 阵列。 或 许 您 已 了 解 阵 列 在 程 式 设 计 中 的 好 处, 但 翻 遍Netscape所 提 供 的 文 件, 并 没 有 提 及 如 何 使用 阵 列。 这 是 因 为JavaScript并 不 支 援 阵 列。 但 是 现 在 我 将 教 您 如 何 在JavaScript中 使 用 阵 列。

首 先, 阵 列 是 干   用 的?您 可 以 把 它 看 成 一 长 串 的 变 数(variables)。 假 设 您 现 在 需 要 宣 告10个 变 数, 您 可 以 一 个 个 将10个 变 数 宣 告 为 a, b, c ..., 但 当 您 需 要100个 或 更 多 的 变 数 时, 这 种 方 法 将 会变 得 很 麻 烦。 若 您 使 用 一 个 拥 有10个 元 素(elements)的 阵 列(暂 且 命 名 为 'MyArray')来 表 示 这10个变 数, 则 可 以 用 MyArray[1], MyArray[2], MyArray[3]...分 别 代 表 第 一,二,三....个 变 数(很 多 程式 语 言 是 从0开 始 当 作 第 一 个 元 素, 但 在JavaScript语 法 中 是 从1开 始)。 因 此 若 您 想 将 第 一 个 元 素 (或 称 变 数)的 值 指 定 为17, 您 只 要 写 成 MyArray[1]=17即 可。 由 此 可 看 出 阵 列 的 功 用 和 一 般 变数 是 相 同 的。 不 光 如 此, 若 您 想 将 所 有 元 素 的 值 均 指 定 为17, 您 只 要 写 一 个 简 单 的   圈(loop)即可:
for (var i=1;i<11;i++) MyArray[i]=17
for- 这 个 指 令 是 告 诉 电 脑 其 後 的 指 令 总 共 要 执 行 几 次。for-   圈 是 从1开 使, 也 就 是 电 脑 会 先 执行MyArray[1]=17。 然 後 i 会 增 加1并 接 着 执 行MyArray[2]=17。 i 每 次 递 增1直 到 i=10为 止。

接 下 来 教 您 如 何 做 阵 列 的 初 始 化(initialization)。 这 个 问 题 曾 在 JavaScript Mailing list中 讨 论 过。 (如 果 您 想 订 阅 mailing list, 您 只 要 在e-mail中 填 入 subscribe javascript-digest 并 寄 到 majordomo @obscure.org 即 可。 接 着 您 每 天 就 会 收 到 一 到 二 个 约20-30kB的 大 档 案, 这 些 档 案 包 括 所 有 来 自 JavaScript- list的 信 件)。

 

function initArray() {
      this.length = initArray.arguments.length
      for (var i = 0; i < this.length; i++)
      this[i+1] = initArray.arguments[i]
   }

您 不 需 要 了 解 这 个 函 式(function)的 意 义, 您 只 要 知 道 怎 麽 用 就 好。 如 果 您 要 宣 告 一 个 拥 有 三 个 元素 的 阵 列, 且 其 值 分 别 指 定 为 17,18,19, 您 只 要 写 成 : var MyArray= new initArray(17,18,19)。 您也 可 以 用 字 串(strings)当 作 元 素 的 值 : var heyho= new initArray("This","is","酷")。 因 此 您 不 必 管 元素 值 的 型 式(type), 即 使 混 着 用 也 行 : var Mixedup= new initArray(17,"yo",103)

下 面 我 将 对 一 个 阵 列 'Mixedup' 作 初 始 化, 并 显 示 阵 列 的 内 容 :

<script language="JavaScript" type="text/javascript"> </script> Element No. 1: 17
Element No. 2: yo
Element No. 3: 103

其 原 始 码 如 下:

 

<script language="JavaScript">
<!-- Hide
  var Mixedup= new initArray(17,"yo",103);
  document.write("Element No. 1: "+Mixedup[1]+"<br>");
  document.write("Element No. 2: "+Mixedup[2]+"<br>");
  document.write("Element No. 3: "+Mixedup[3]+"<br>");
// -->  
</script>

 


当 我 昨 天 写 一 个 小 游 戏 时, 我 遇 到 一 个 您 也 可 能 会 碰 到 的 问 题。 当 您 想 清 除 视 窗 或frame中 的 内容 时,Netscape文 件 中 提 到 了 一 个 函 式 可 用-- 'document.clear()'。 但 当 您 将 此 函 式 写 入 网 页 中,它 并 不 会 如 预 期 的 清 除 视 窗 或frame中 的 内 容。 而 且 document.clear()在 各 种 平 台(platform)上 似  都 无 效。Gordon McComb告 诉 我 一 个 清 除 视 窗 或frame中 内 容 的 好 方 法, 您 可 以 试 试 :

 

     document.close();
     document.open();
     document.write("<P>");

您 不 一 定 要 写 最 後 一 行 document.write("<P>");, 只 有 当 您 想 在 视 窗 中 写 入 某 些 东 西 时 才 需 要 加入 此 行。 上 述 方 法 对frame亦 有 效。

 


接 下 来 我 们 谈 一 个 可 以 让 您 在 不 同 文 件 之 间 穿 梭 的 语 法-- back() 和 forward() 两 个 函 式。 通 常我 们 在 网 页 中 加 的 back- link和 Netscape- Navigator中 的 "Back键" 功 能 上 并 不 相 同。Netscape- Navigator中 的 "Back键" 是 回 到 您history list中 的 上 一 页。 您 现 在 也 可 利 用JavaScript做 到 相 同 的功 能。 只 要按 下 此 link , 您 可 以 再 度 回 到 此 页。JavaScript语 法 的 原 始 码如 下 :

 

<html>
<body>
<FORM NAME="buttonbar">
     <INPUT TYPE="button" VALUE="Back" onClick="history.back()">
     <INPUT TYPE="button" VALUE="JS- Home" onClick="location='script.html'">
     <INPUT TYPE="button" VALUE="Next" onCLick="history.forward()">
</FORM>
</body>
</html>
您 也 可 以 用 history.go(-1)history.go(1) 代 替.

 


 

 



第 六 集

 




许 多 网 友 问 我 一 个 有 趣 的 问 题 : 如 何 用 mouse 按 一 下 便 可 同 时 载 入 两 页 文 件。 基 本 上 有 三 种 方法 可 以 达 到 这 种 功 能。 第 一 种 方 法 是 制 作 一 个 按 钮, 让 使 用 者 按 下 後 去 启 动 一 个 能 同 时 将 两 份文 件 载 入 不 同frames或 新 视 窗 的 函 式 (function)。 若 您 曾 经 看 过 此 份 简 介 文 件 的 其 它 章 节 的 话,我 相 信 您 可 以 很 轻 易 写 出 这 种 语 法:

我 们 制 作 了 三 个 frame , 第 一 个 frame 中 包 含 了 一 个 按 钮。 请 注 意, 第 一 个 HTML 档 案 只 是 用来 打 开 frame 和 给 予 每 个 frame 一 个 名 字。 若 您 还 不 清 楚 JavaScript 和 frame 的 关 系, 可 以 先 阅读 第 三 章。 不 过 在 此 还 是 照 例 让 您 瞧 瞧 原 始 码 (不 知 您 是 否 在 很 多 电 脑 书 籍 中 遇 到 一 个 相 同 的困 扰, 那 就 是 作 者 常 把 一 些 自 认 很 简 单 的 东 西 忽 略 不 提, 结 果 那 些 东 西 正 是 读 者 搞 不 懂 的 地 方 ! 所 以, 若 您 对 我 提 的 东 西 已 很 了 解, 请 发 挥 一 下 您 的 耐 性 :-)

 

frames2.html

 

<HTML>
<HEAD>
<title>Frames</title>
</HEAD>
    <FRAMESET COLS="295,*"> 
  <FRAMESET ROWS="100%,*"> 
    <FRAME SRC="loadtwo.html" NAME="fr1"> 
      </FRAMESET> 
  <FRAMESET ROWS="75%,25%"> 
    <FRAME SRC="cell.html" NAME="fr2"> 
    <FRAME SRC="cell.html" NAME="fr3"> 
      </FRAMESET> 
</FRAMESET> 
</HTML>
第 一 个 frame 会 载 入 loadtwo.html 并 产 生 一 个 按 钮 :

 

loadtwo.html

<HTML>
<HEAD>
<script language="JavaScript">
<!-- Hiding
  function loadtwo(page2, page3) {
     parent.fr2.location.href=page2;
     parent.fr3.location.href=page3;
}
// -->
</script>
</HEAD>
<BODY>
<FORM NAME="buttons">
     <INPUT TYPE="button" VALUE="同 时 载 入 两 份 文 件" onClick="loadtwo('frtest1.html',
     'frtest2.html')">
</FORM>
</BODY>
</HTML>

按 下 按 钮 後, 电 脑 会 传 递 两 个 字 串 给 loadtwo() 并 将 之 启 动。 由 loadtwo() 中 可 以 看 出, 第 一 个字 串 是 用 来 定 义 第 二 个 frame fr2所 载 入 文 件 的 位 址 和 档 案 名。 若 您 想 定 义 另 外 的 按 钮 来 载 入 不同 的 文 件, 您 可 以 重 复 使 用 此 函 式。 只 要 将 文 件 的 URLs (addresses) 传 给 loadtwo()即 可。


接 下 来 谈 谈 用 hyperlinks 同 时 载 入 两 页 文 件 的 第 二 种 方 法。 在 Internet 上 您 可 以 发 现 许 多 网 页 使用 <a href="yourlink.html" onCLick="yourfunction()">来 达 到 上 述 提 及 的 功 能。 但 此 语 法 并 不 能在 所 有 平 台 上 均 正 常 执 行, 因 此 最 好 不 要 用 此 语 法。 现 在 我 告 诉 您 另 一 种 写 法 : 我 们 可 改 用 下述 JavaScript 语 法:

<a href="javascript:myfunction()">My Link</a>
此 种 方 式 非 常 简 单 而 且 在 所 有 浏 览 器 中 均 能 正 常 执 行。 您 只 要 写 上 javascript: 并 加 上 您 想 联 结的 函 式 名 即 可。 若 此 函 式 名 称 设 为 'loadtwo()' , 那 您 就 可 藉 由 按 下 此 hyperlink 来 达 到 同 时 载 入两 份 文 件 的 目 的 了。


再 接 着 谈 谈 用 mouse 按 一 下 便 可 同 时 载 入 两 页 文 件 的 第 三 种 方 法, 此 方 法 可 以 以 hyperlinks 或按 钮 来 执 行。 您 可 先 在 第 二 个frame 中 载 入 一 个 HTML 文 件 :
<a href="getfr2.html" target="fr2">请 按 这 里 !</a>
然 後 在 此 文 件 中 (getfr2.html) 加 入 onLoad 这 项 指 令, 用 来 触 发 第 三 个 frame 载 入 另 一 份 文 件。如 此 一 来 便 可 同 时 载 入 两 份 文 件。getfr2.html 档 的 原 始 码 如 下 :

 

<HTML>
<BODY onLoad="parent.fr3.location.href='getfr3.html'; return true;">
文 件 内 容.....。
</body>
</html>

当 然, 您 必 须 在 所 有 会 被 载 入 到 第 二 个 frame 的 文 件 中 加 入 onLoad 这 项 指 令。

 


另 一 个 常 遇 见 的 问 题 是 如 何 开 一 个 新 视 窗 并 载 入 文 件?我 们 想 达 到 的 效 果 是 当 使 用 者 按 一 下 mouse 便 会 '弹' 出 一 个 新 视 窗。 很 简 单, 只 要 在 <a href...> 中 利 用 target 这 项 特 性 就 可 达 到 此 效果。例 如 :
<a href="goanywhere.html" target="Resource Window">Go!</a>

 


现 在 我 将 谈 谈 在 JavaScript 中 几 种 常 用 的 运 算 子 (operator)。 运 算 子 可 以 使 您 的 JavaScript 语 法 更精 简。 假 设 您 想 测 试 变 数 x 是 否 大 於 3 且 小 於 10, 您 可 写 成 :

 

if (x>3) 
  if (x<10)
    doanything();

当 满 足 x>3 x<10 时, 就 会 执 行 doanything()。 还 有 一 种 更 精 简 的 写 法 :

 

if (x>3 && x<10) doanything();
' &&' 称 为 AND- 运 算 子。 还 有 另 一 种 被 称 为 OR- 运 算 子 的 东 东 可 让 您 用 来 检 视 是 否 变 数 x 等於 5 或 变 数 y 等 於 17 :

 

if (x==5 || y==17) doanything();
当 满 足 x==3 y==17 时, 就 会 执 行 doanything()。 当 然, 当 两 者 皆 成 立 时 也 会 执 行 doanything()。
在 JavaScript 中 是 利 用 == 来 做 比 较 的 工 作 (其 它 尚 有 <,>,<= 和 >=), 这 些 都 和 C/C++ 的 语法 相 同。 另 外 单 一 '=' 是 用 来 将 数 值 存 入 变 数 用 的。 (在 Pascal 语 法 中 将 数 值 指 定 给 变 数 是 用 :=, 而 做 比 较 是 用 单 一 的 '=', 这 和 JavaScript 语 法 有 点 不 同)

若 您 想 利 用 '不 等 於' 这 项 特 性, 您 可 以 用 !=。 例 如 : x != 17.

尚 有 许 多 可 以 精 简 您 的 JavaScript 语 法 的 运 算 子, 去 翻 翻 Netscape 的 文 件 吧 !


 


 


第 七 集

 




输 入 表 单 (form) 对 某 些 Internet 上 的 网 页 而 言 是 很 重 要 的。 通 常 form 的 输 入 内 容 会 被 送 回 server 中 做 处 理。 JavaScript 具 有 确 认 输 入 值 的 功 能, 可 以 事 先 确 保 这 些 值 是 属 於 "合 法 的",进 而 避 免 将 错 误 的 输 入 值 送 回 server。 首 先 我 将 告 诉 您 如 何 对 form 的 输 入 做 确 认 的 工 作, 再 来我 将 会 提 到 用 JavaScript 将 资 料 送 回 server 的 可 能 性。


 





咱 们 开 始 吧 ! 我 先 写 一 个 简 单 的 语 法。 在 下 面 我 加 了 两 个 text- 元 件 (element), 请 将 您 的 大 名 写入 第 一 个 空 格, 并 将 您 的 e-mail address 写 入 第 二 个 空 格。 您 可 在 这 两 个 空 格 中 任 意 输 入 并 按 下按 钮。 您 也 可 以 不 输 入 任 何 东 西 就 按 下 按 钮 试 试 !

请 输 入 您 的 大 名 :
对 第 一 个 空 格 而 言, 若 您 没 有 键 入 任 何 东 西, 电 脑 便 会 出 现 一 个 错 误 讯 息, 并 请 您 再 输 入 一 次。当 然, 此 空 格 会 把 任 何 输 入 的 字 串 都 视 为 "合 法 的" 输 入, 它 无 法 辨 认 出 您 输 入 的 名 字 是 正 确 的或 是 胡   的。 即 始 您 输 入 的 是 数 字, 它 也 会 把 此 数 字 当 成 您 的 大 名。 例 如 您 输 入 '17', 它 将 会显 示 '嗨 ! 17'。
第 二 个 空 格 就 设 计 得 稍 微 复 杂 一 点 了。 您 可 试 着 输 入 一 个 简 单 的 字 串 - 例 如 您 的 大 名, 它 将 会显 示 错 误 讯 息, 并 请 您 再 输 入 一 次 (除 非 您 输 入 的 字 串 含 有 @ ...)。 这 个 空 格 的 确 认 标 准 是 检 视您 输 入 的 字 串 中 是 否 含 有 @ 。 即 使 只 输 入 一 个 @, 它 也 会 被 视 为 合 法 的 输 入 --- 虽 然 这 也 不 是正 确 的 e-mail address。 所 有 Internet 的 e-mail address 皆 含 有 @ , 因 此 对 e-mail address 输 入 值做 此 种 确 认 工 作 是 很 适 合 的。

请 输 入 您 的 e-mail address :

 

接 下 来 看 看 上 述 功 能 的 原 始 码 吧 :

 

<html>
<head>
<script language="JavaScript">
<!-- Hide

function test1(form) {
  if (form.text1.value == "")
    alert("您 没 写 上 任 何 东 西, 请 再 输 入 一 次 !")
  else { 
   alert("嗨 "+form.text1.value+"! 您 已 输 入 完 成 !");
  }
}

function test2(form) {
  if (form.text2.value == "" || 
      form.text2.value.indexOf('@', 0) == -1) 
        alert("这 不 是 正 确 的 e-mail address! 请 再 输 入 一 次 !");
  else alert("您 已 输 入 完 成 !");
}
// -->
</script>
</head>

<body>
<form name="first">
Enter your name:<br>
<input type="text" name="text1">
<input type="button" name="button1" value="输 入 测 试" onClick="test1(this.form)">
<P>
Enter your e-mail address:<br>
<input type="text" name="text2">
<input type="button" name="button2" value="输 入 测 试" onClick="test2(this.form)">
</body>

先 看 看 body- 之 後 的 HTML 语 法。 我 们 嵌 入 了 两 个 text 元 件 和 两 个 按 钮。 第 一 个 按 钮 呼 叫 test1(...), 第 二 个 按 钮 呼 叫 test2(...)。 this.form这 个 变 数 会 将 此 form 的 名 字 (在 此 例 中 就 是 first) 传 给 函 式 (function), 以 便 能 正 确 将 元 件 "定 址" (address)。
test1(form) 的 功 用 在 於 检 查 您 是 否 输 入 字 串 (亦 即 检 查 是 否 为 "空 字 串") ? 此 项 工 作 是 由 if(form.text1.value == "")... 所 执 行。 'form' 这 个 变 数 将 会 接 收 由 'this.form' 所 传 来 的 值。 但 我 们如 何 在 test1(...) 中 抓 取 我 们 所 输 入 的 字 串 呢?您 可 利 用 'value' 这 个 变 数 再 加 上 'form.text1' 来 抓 所输 入 的 字 串。 然 後 将 它 和 " " 比 较, 检 查 是 否 为 "空 字 串"。 若 是 "空 字 串" 则 表 示 并 无 输 入 任 何东 西, 那 麽 Netscape 将 会 出 现 警 告 并 要 求 您 再 输 入 一 次。 若 test1(...) 检 查 结 果 并 非 "空 字 串",则 会 出 现 "您 已 输 入 完 成 !" 的 讯 息。 请 注 意, 即 使 只 输 入 一 个 空 白 (space), test1(...)也 会 将 之视 为 合 法 输 入。 当 然, 您 也 可 以 略 施 小 技 来 排 除 上 述 可 能 性, 我 相 信 这 很 容 易。
现 在 请 看 test2(form)。 在 此 函 式 中 我 们 利 用 相 同 的 方 法 来 检 测 输 入 值 是 否 为 空 字 串, 但 是 我 在 if- 指 令 中 加 入 了 额 外 的 检 测 功 能。 || 这 个 符 号 代 表 OR 运 算 子 (operator), 您 可 在 第 六 章 中 学 习它 的 用 法。
if- 指 令 用 来 检 测 第 一 与 第 二 个 比 较 式 是 否 其 中 之 一 为 "真"?若 有 其 中 之 一 为 "真", 则 整 个 if- 指令 即 为 "真", 如 此 便 会 执 行 其 後 的 指 令。 换 句 话 说, 若 您 没 有 输 入 任 何 字 串 或 您 输 入 的 字 串 中没 有 包 含 '@', 均 会 被 视 为 "不 合 法" 输 入。

 



您 知 到 有 几 种 方 法 可 用 来 送 出 form 的 内 容 吗?最 简 单 的 方 法 就 是 利 用 e-mail 来 送 出 form 的 内容。 我 下 面 介 绍 的 方 法 就 是 属 於 这 一 种。 若 您 不 想 利 用 e-mail 来 送 出 form 的 内 容 且 想 让 server 能 自 动 处 理 form 的 输 入 值, 此 时 此 刻 只 有 CGI 能 做 得 到。 譬 如 您 想 做 一 个 类 似 Yahoo 可 以 让使 用 者 迅 速 得 到 结 果 的 搜 寻 引 擎 (search engine), 您 就 必 须 使 用 CGI。 如 此 一 来 使 用 者 才 不 需 等待 系 统 管 理 者 处 理 form 的 输 入 值, 而 可 由 server 自 动 处 理 并 迅 速 将 处 理 结 果 报 告 给 使 用 者。目 前 JavaScript 无 法 达 到 此 种 功 能。 即 使 您 想 制 做 一 个 "访 客 签 名 簿" (guestbook), 也 不 可 能 利用 JavaScript 来 叫 server 自 动 将 资 料 加 入 网 页 中。 目 前 只 有 CGI 能 做 到 如 此。 但 您 可 以 制 做 一个 利 用 e-mail 传 送 使 用 者 资 料 的 guestbook, 只 是 您 需 以 手 动 (manual) 方 式 来 处 理 使 用 者 所 传 来的 资 料。 若 您 一 天 不 是 收 到 很 多 使 用 者 送 来 的 资 料 的 话, 这 也 未 尝 不 可。
以 下 语 法 只 使 用 到 普 通 的 HTML 语 法, 并 不 需 用 到 JavaScript ! 只 有 当 您 想 在 资 料 送 出 前 做 一些 确 认 工 作 的 话, 才 需 用 到 JavaScript。 虽 然 目 前 有 些 浏 览 器 无 法 使 用 mailto- 这 项 指 令, 我 相信 较 新 版 的 浏 览 器 都 会 支 援 这 个 指 令。

 

<FORM METHOD=POST ACTION="mailto:your_email@goes.here">
<H3>您 喜 欢 我 的 网 页 吗 ?</H3>
  <INPUT NAME="choice" TYPE="RADIO" VALUE="1">一 点 也 不 喜 欢。<BR>
  <INPUT NAME="choice" TYPE="RADIO" VALUE="2" CHECKED>简 直 浪 费 我 的 时 间。<BR>
  <INPUT NAME="choice" TYPE="RADIO" VALUE="3">这 简 直 是 Net 上 最 烂 的 站 台。<BR>
  <INPUT NAME="submit" TYPE="SUBMIT" VALUE="Send">
</FORM>
上 述 语 法 可 藉 由 e-mail 收 到 使 用 者 对 您 网 页 的 观 感。 唯 一 的 困 扰 是 您 可 能 会 收 到 内 容 类 似 密 语 (cryptic) 的 mail。 mail 内 容 的 空 格 (space) 有 时 会 以 '+' 代 替, 有 时 会 以 '%20' 代 替。 看+起+来+ 就+像+这+样。 我 相 信 网 路 上 应 有 某 种 程 式 可 将 收 到 的 mail 转 换 成 "可 读" 的 语 句。

 

 



另 外 有 一 种 不 错 的 应 用 可 使 您 的 表 单 输 入 更 具 "亲 和 性" (user-friendly)。 您 可 以 指 定 一 开 始 先"定焦" (focus)於 哪 个 元 件 (element, 简 单 的 说 就 是 输 入 项)。 或 是 您 可 让 浏 览 器 "定 焦" 於 使 用 者 输入 错 误 的 表 单。 换 句 话 说, 浏 览 器 将 会 把 mouse 的 游 标 放 在 您 "定 焦" 的 元 件 上, 如 此 一 来 使 用者 便 不 需 在 输 入 字 串 之 前 按 一 下 mouse。 请 看 这 项 功 能 的 原 始 码 :

 

function setfocus() {
        document.first.text1.focus();
        return;
}

这 项 语 法 是 将 "定 焦" 放 在 第 一 个 text- 元 件 上 (以 本 章 为 例, 就 是 在 "请 输 入 您 的 大 名" 的 空 格 中有 游 标 在 闪 烁)。 您 必 需 在 语 法 中 指 定 您 想 "定 焦" 的 表 单 名 字 (以 本 章 为 例, 就 是 first) 和 元 件的 名 字 (以 本 章 为 例, 就 是 text1)。 若 您 在 一 开 始 载 入 网 页 时 就 想 "定 焦" 於 某 个 元 件 上, 只 要在 <body>- tag 中 利 用 onLoad- 即 可 :

 

<body onLoad="setfocus()">



在这个例子中又有新的东西了。首先,让我们注意一下,在语法中的注解部分
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值