JavaScript在Notes中的使用

我为什么写JavaScript呢?有多方面的原因。首先,它是Web应用中使用最广泛的脚本语言,随着越来越多的Notes应用要求Web功能,JavaScript就越来越重要。虽然Java可以处理许多复杂的事情,但是JavaScript总是能做更多的事情。其次,Notes 6.0使你在Notes客户端使用JavaScript和在浏览器里一样。最后,许多Notes开发者仍然没有学JavaScript,而且还有许多人没有认识到当Notes与JavaScript关联使用的时候能提供的强大而灵活的功能。

在文章中,我将直接从JavaScript入手,而不过多地涉及Notes编程的内容。我将让你从这个核心语言的基础入手。接下来,就像是你的技术课程一样,我将介绍许多高级定义,这些定义能很方便地使Notes和JavaScript相关联从而完成一些复杂的任务。所以,虽然该系列文章是关于JavaScript的,但是它实际讲述的是在Notes环境下的JavaScript。因此,我还将提及HTML、DHTML和大家知道的一些别的东西。

像先前的要求一样,我假设你是一个Notes程序员并且对LotuScript有一些基本的了解。我将用许多例子对LotusScript和JavaScript进行比较。虽然这两种语言不是很相似,但是我总认为我在JavaScript和LotusScript中怎么做的想法和观点是一样的。我希望,像我一样通过比较这两种语言能使你更容易地学习这种语言。我想这些对你来说应该都没有什么问题。假如你不懂LotusScript,那么你也可以从这些JavaScript文章中了解一些LotusScript,但是有些参数可能还是会陌生的。

JavaScript还是Java?


你可能听说过Javascript和Java被相互交换着使用。你自己可能甚至也这样使用过(我就曾经这样做过)。我不知道是谁认为把两个完全不同的语言命名成几乎同一个名字是一个好主意,但是这里我们认为,JavaScript和Java不是同一个东西。甚至不是一个相近的东西。

像C++一样,Java是一个大周期(big-time)的编程环境。它是一个复杂的很难学习的软件,坦白地说,我难以将更多的精力放在这方面。Java可以在服务器上(Servlet)运行或在当地的浏览器上(Applets)运行,Servlet可以处理一些像连接到外部数据源之类的操作(这通常在后台发生而且用户也不用知道),Applets则总是处理一些用户的事情。

假如你已经使用过这些Applets,你就会知道你总是必须等待他们载入。换句话说,除非你已经连接到了你的服务器,否则你将不得不坐着看一个空白的灰色矩形框,直到所有的代码都下到浏览器里才行。这是Java Applets的一个问题:它们总是缓慢地载入。但是,在它们载入以后,请注意:这时它们就变得足够快并且实际上可以做任何事情了(只要你的代码写的足够好)。但是总的来说,浏览器中加入Java Applets并不是个好主意,至少我这么认为。除非你让它完成的任务极为重要或者难以置信的复杂,否则我不认为牺牲系统的性能来增加这个功能是有价值的。

而在你运行Java Servlets的服务器上,这就完全是另外一回事了,这正是Java强大功能的体现。不像其他语言,包括LotusScript,Java是多线程的,这意味着它可以同时做许多事情。Java可以很好的分配资源,只要服务器有足够的能力,根本不用担心到底是几百个用户还是几十万个用户同时点击你的应用程序。在这样的保证下,大多数复杂的Web应用是建立在大量的Java之上的。因此,它是为杰出的应用设计的杰出的编程环境。

但很遗憾,以上并不是我要在这里讨论的。

在此,我们要讨论的是JavaScript,它虽然看上去很像Java。与Java应用在后台服务器不同的是,JavaScript是应用在客户端的。JavaScript非常的精简和快速,并且它可以使网页实现交互功能。我们这样来看:最初,网页是静态的。它们是HTML或者其他类似的标记性语言。通过HTML,你可以修改你网页的字体、并变为粗体或者斜体,插入图片或者连接到其他的网页,其他就几乎没有什么了(当然,它还能做的比这更多,但请先听我说)。HTML之所以重要,是由于它是网页的基础。它就像汽车的底盘。

无论设计和制造得多么漂亮,一辆车的卖点通常不在于底盘,而是车体、内装、导航系统以及其他你可以使用或者欣赏的东西。无论是什么,总之不是底盘(赛车可能是个例外)。因此,对于今天的网页或者Web应用也是一样。HTML当然很重要,但用户真正关心的是这个网页到底是干什么的,并且,无论它是RollOvers(当鼠标落在上面时会变化的图片或者按钮)还是像对话框(Dialog)或者日期输入框这样的交互式部件,许多都是由JavaScript写的。

对用户来说,JavaScript的一个极大的好处是它通常在浏览器中处理所有的数据。换句话说,它在处理过程中根本不需要服务器提供更多的信息,这就是它运行速度快的原因。你是不是曾经遇到过在浏览器中打开一个Notes的视图,在每次点击Twistie的时候总要等待一段时间?你是不是感觉很烦?我也是的。这就是一个每次都要回到服务器处理的例子。你每次点击Twistie时,你的浏览器都要连接服务器,服务器计算出下一步要显示的内容,并把它发给浏览器,浏览器接到后将它输出给你。等待这种慢速的连接,就像看一幅画逐渐变干一样的慢。因此,重复连接服务器会变得很慢,而变慢怎么说都是不好的事情。

JavaScript并不重复地连接服务器,因此,一旦你第一次装载了你的网页,你通过JavaScript做的每件事都很快,从而使你用得更加愉快。

这就是JavaScript,这就是我这里要讨论的问题。

总的来说,Java是一个针对相对繁重任务的编程环境,它可以在后台处理极为复杂的任务。JavaScript就像HTML的交互部分,而它只在客户端运行。它们并不是完全相同的,无论名字如何的相似。明白了?非常好,让我们继续。


开学写JavaScript代码吗?那先为自己找本《圣经》吧


如果你现在开始写JavaScript代码,那你首先需要一本《圣经》。我并不是要在这里祈祷。如果你真的打算学习JavaScript(而不是仅仅利用本文作为消遣),在你能熟练使用之前,你一定想买本书。关于这门语言有很多书,并且时常变化。它不像LotusScript是为一个稳定单一的平台设计的。不幸的是,JavaScript在每个浏览器上以不同的方式运行,它甚至在同一个浏览器的不同版本上运行时,也是不同的。实际上,JavaScript的主要问题在于挑战了浏览器的不兼容性。

我将教给你足够的JavaScript知识迅速入门,但你还需要一本好的参考书。如果你只打算买一本书,就购买Danny Goodman和Brendan Eich写的《The JavaScript Bible》(John Wiley & Sons出版社2001年出版)。现在它已经是第四版了,价格是49.99美金,厚1200页,比较重,随身携带是件痛苦的事情。但它几乎是世界上最好的关于JavaScript的书了。即使是一般的人也可以看懂这本书。但我并没有得到任何回扣(非常不幸)。但要记住我的话:一切以最后的版本为准,JavaScript变化太快了,因此打折的旧版本是不能使用的。


现在,找个地方输入你的代码


JavaScript就像HTML一样,你不需要什么特别的工具就可以编辑。你并不需要No stinkin' Server or nothin'。如果你希望别人看到你的成果,那你需要一个服务器。否则,如果只是为了学习、测试,就像现在,你只需要一个浏览器和写字板(或者记事本等文字编辑工具)。已经说过了,我是用Notes的,并且这是一系列关于在Notes中使用JavaScript的文章,因此我在例子中使用Notes的数据库。如果你现在还没有一个用于测试代码的数据库,那么建一个空的数据库吧,在本地或者服务器上都可以。


要保证你的浏览器不是来自冰河世纪的

最后,看一眼你的浏览器。我曾经指出(你还将多次看到这句话),浏览器是因它们能实现的和将要实现的功能的不同而完全不同的。大多数JavaScript的书在开始的时候,总是描述不同浏览器的不兼容性,以及为了让你的代码能正确地运行在每个浏览器上而必须做的大量工作。他们用整页,有时甚至是整章的代码和描述来帮助你的应用可以适应每个浏览器甚至每个版本,并且通过各种各样的努力来确定你当前采用的是哪个浏览器。

这固然是很重要的信息,并且如果你正在做的应用程序是针对一般大众的话就更加重要,但有时候太多的信息是件很麻烦的事情。在我看来,首先学会采用一种方法做一件事,然后再考虑所有的情况,要比同时学习两个、三个、五个甚至许多方法来做同一件事情要容易得多。当前,我在这篇文章中教你的方法至少是最基础的并且可以在任何一个比较新的浏览器中是可以运行的。

什么是"比较新"?问得好。对于MicroSoft IE浏览器,你可能正在使用4.0版本,最好能找到5.0或者更高的版本。为了保持与我的一部分客户的兼容性,我现在使用的是IE 5.5,因此,我这里的所有代码都可以在这个版本(甚至是以后的所有版本)上正常运行。如果是Netscape Navigator的用户,请至少使用4.0版本(或者有可能的话6.0或7.0版本)。如果你在使用Mozilla,请尽量使用高版本,当前Mozilla的1.2 Beta版已经发行了。

我们已经说过,如果你正使用IE 5.0或其他的什么浏览器,那么好,在大多数情况下,我可以直接为你演示JavaScript,对不同的浏览器并没有多少不同。当你通过DHTML开始你的设计想法时,在我看来,IE是更好的选择:它可以更容易地实现更多的任务。

因此,找到一个新版本的浏览器,或者找到多个更好。我已经说过了,不同的浏览器有着不同的工作方式,有时甚至大不相同。通常,IE比Netscape具有更加冗长的代码并可以让你完成许多Netscape完成不了的功能。但如果你的某些(甚至全部)用户使用Netscape甚至停留在更加古老的浏览器上怎么办呢?因此,针对IE 6.0将你所有功能写进去是不明智的。这样你还需要写出其他浏览器的版本。

当前许多基于Notes的Web应用程序是单位内部使用的。通常,你可以奢望用户使用的是相对较新的浏览器(尽管并非全部是这样),并且他们经常使用相同类型的浏览器(IE或Netscape)。但无论你是针对单一的用户群还是针对广大互联网用户,都有必要对以前版本的浏览器进行测试,从而至少可以使那些潜在用户避免发生主要错误。

这是伴随Web发展产生的一个实际问题。现在有太多的浏览器的太多版本,它们具有太多不同的功能,因此很难确定你到底需要测试多少版本的浏览器。逐渐地,除了IE的最近版本,看来IBM自己也已经放弃了使Lotus应用程序与其他浏览器相兼容的努力。我想它们的逻辑就是针对一种单一的平台进行努力要比使它们的应用程序适应所有的平台要高效得多。

对于你来说怎么样呢?这个问题恐怕只有你(或者你的老板)可以回答,但一定注意不要太急于升级你的浏览器。你要与你单位使用旧浏览器的用户保持一致(或者至少保留一个他们在使用的浏览器备份作为测试)。一定注意。


现在,至少让我们来干点儿什么


你很可能要说,在Web上写任何东西都不会象在单一的Notes环境下那么直接。这很麻烦,但你必须习惯它。

当我开始学习并第一次看到JavaScript代码的时候,几乎吓得我要放弃学习。我感觉它们全部是由弯弯曲曲的括号构成的。满眼都是@公式和LotusScript的括号,看上去很可怕。但是,经过一段时间我得到这样的感受:它并不难。如果你像我一样看到满眼弯曲的括号,那么你可以这样来安慰自己:全世界的JavaScript和LotusScript程序员都为大块的@公式而惊慌。哈哈!

下面我就快要开始接触"弯曲的括号"了,但现在,我们先来做些简单的事情。首先,在你的数据库中创建一个新的页,并在上面放置一个按钮。看一下按钮的选项,你将发现有好几种选择。你可以写一个公式,使用简单操作,使用LotusScript或者使用JavaScript,哦,你来选择吧。

在对象窗口(在代码窗口的左侧),你将看到一个在LotusScript中看不到的事件列表:

onBlur
onClick
onFocus
onHelp
onKeyDown
onKeyPress
onKeyUp
onMouseDown
onMouseMove
onMouseOut
onMouseOver
onMouseUP

这是JavaScript的事件。事件就是发生某些事情时产生的。大多数是自解释的(self-explanatory,即无需说明的),例如onClick或onKeyDown;其他一些就不那么明显了,如onFocus,它发生于你通过TAB键或者鼠标点击使该按钮得到焦点;onBlur正好相反,它发生于鼠标点击了其他位置或通过TAB键使该按钮失去焦点的时候。你会发现,发生在Web页上几乎所有的事件都可以按照JavaScript进行分类,并且它们的许多事件具有相同的名字。

选择onClick事件并且输入如下代码:

alert("This is the onClick event.");

现在通过浏览器观察你的网页〔设计>在Web浏览器中预览>选择你使用的浏览器,如IE或Netscape〕点击该按钮,将出现一个对话框,如图1所示。



图 1

很容易吧。但是,等一下,你是不是出现问题了?是不是遇到了错误?如果是这样,我打赌你输入了如下代码:

Alert("This is the onClick event.");

你就像在学校一样习惯地使用大写字母开头,不是吗?JavaScript是大小写敏感的,丝毫不能马虎。无论是函数还是变量名或者其他的任何东西,JavaScript是区分大小写的,严格区分。对于JavaScript来说,alert和Alert是完全不同的。

如果你是个遵循规则的人而没有出现错误信息,你可以将你按钮中的alert变成Alert,再来试一下,看到错误崾玖寺穑ㄈ缤?)?在以下的一些事件中,你将看到许多这样的提示。欢迎使用JavaScript。



图 2

但除了大小写敏感的问题,它很容易,不是吗?并且没有"弯曲的括号",看见吗?有希望了。对于多个事件的叠加,这里还有一些实际的细节问题,但我并不想在此花费大量的时间。让我再给出一个例子。回到你的窗体并且添加一个可编辑域(Editable Field),命名为"ActionText"。你需要将它变大,因此在域属性的HTML选项卡中,在"Other"行输入:

size="100"

现在,选择按钮的onBlur事件并输入以下代码:

document.forms[0].ActionText.value=document.forms[0].ActionText.value+"onBlur "

注意在"onBlur "后面有一个空格。然后在相应的位置对每个事件键入相同的代码(但要改变引用的部分为相应的事件名,如onClick):

onBlur
onClick
onFocus
onMouseDown
onMouseOut
onMouseOver
onMouseUp

用新的代码替换onClick中的原有代码。现在再在浏览器中测试你的代码,点击按钮一次。你可以在ActionText中看到发生了什么,并且可以看到事件发生的顺序。正如你看到的,仅仅一次点击就触发了许多事件。

以下是发生的事件:

  1. 当你移动鼠标到按钮上时,发生了onMouseOver事件。
  2. 当你按下鼠标时,发生了两个事件。首先,是onMouseDown,紧跟着在按钮被选中时发生onFocus事件。注意,你如果保持鼠标的按下,那么你还没有完成一次完整的点击动作。一个Click事件发生于鼠标在同一个对象上按下并抬起的动作,因此如果此时你保持鼠标按下,并将其移走,将会发生onMouseOut事件而不是Click事件。
  3. 假设你在该按钮上释放鼠标从而完成了Click过程,那么将会发生一个onMouseUp和Click事件。
  4. 当你移动鼠标离开按钮时,发生onMouseOut事件。
  5. 当你点击了其他位置,因而该按钮失去焦点的时候,触发了onBlur事件。你还可以通过按下TAB键来触发onBlur事件。

对你来说这些又意味着什么呢?通常如果你对JavaScript有了一点适应,那么你将对你的环境有更多的控制。


是啊,环境!


你的代码在一个按钮里面,按钮存在于一个窗口,窗口又是一个文档的一部分,而文档又是……好吧,就像LotusScript,JavaScript也存在对象层次。但与LotusScript不同的是,它不是同时存在两个对象树分别代表前台类(front-end classes)和后台类(back-end classes),它只有一个对象树。在JavaScript中,所有的都是前端类。在浏览器中,不存在像后端类这样的东西……至少在JavaScript中不存在。

对象的最高层是窗口(window)。请注意"window"在这里是小写的。JavaScript的所有对象(以及事件和函数)都是以小写字母开始。JavaScript的惯例之一就是几乎所有的内容在JavaScript里面都是以小写字母开始的。而当一个变量、事件名称或其他的什么,由两个或更多的字母组成的时候,后面单词的首字母往往要大写,如:

onBlur
indexOf
charAt

当你使用的形式是JavaScript语言的一部分的时候,你必须保证大小写的正确性。当你定义你自己的变量或者函数名的时候,你不必非要遵循这种惯例,但大多数程序员是这么做的。以下所有的形式都是正确的变量或者函数名称:

CompanyName
Contactname
StreetAddressOne
CITY
Convertnumbertotext

我们已经说过,在大多数情况下,JavaScript编码倾向于使用这种书写格式:

companyName
contactName
streetAddressOne
city
convertNumberToText

这些写法有什么问题吗?除了考虑书写格式的好坏,没有任何问题。但是无论你采用什么名字,请一定将它记清楚,因为我们已经说过,在JavaScript中"CompanyName"和companyName"是完全不同的两个变量。因此你怎样为变量命名无所谓,无论你采用什么方法,只要你每次引用的时候能够方便地使用你常用的方式就可以。我习惯于使用小写字母开头的方法,因此在本文中你看到的形式都将是这样的。

我刚才提到的窗口就是你的浏览器。如果你打开的网页是一个帧结构(Frameset)的一部分,将会同时存在几个窗口,但这是我们以后要讨论的课题。就像其他语言中的对象一样,在JavaScript中窗口也具有属性,如定位属性(Location,窗口的URL),历史属性(History,你在同一个窗口中曾访问过的其他URL),文档属性(Document,当前显示在该窗口中的页面),开启窗口(Opener,打开你当前窗口的那个窗口,就像对话框,如果存在的话),状态属性(Status,在你的浏览器最下面一行的文字)等等。你可以通过以下形式来引用这些属性,例如:

window.location
window.document
window.history

这些属性中的一些值是你可以操作的,就像定位属性(Location)。另外一些,如文档属性,只是简单地依次指向其他具有属性的对象。例如,你可以马上写一个用于显示当前页URL的消息提示(alert)语句,像这样:

alert(window.location);

在这个语句中"window"是可选项。因为它假设窗口是这个对象层的最高层,因此以下形式可以得到相同的结果:

alert(location);

注意,在JavaScript中通常实现同一个功能可以有好几种形式。这样你可以精简你的代码,但你的代码越是需要在不同的浏览器上正确地运行,就越是要求你采用尽量"常规"的代码来书写。当然如果有其他人要阅读或者与你共同开发你的代码也是一样的要求。

在JavaScript中经常是通过一长串对象的连接进行引用的。例如,要在JavaScript中设定一个叫做"CompanyName"的域的值,你可以按以下方式操作:

var coName=window.document.forms[0].Companyname.value;

或者,简化为:

var coName=document.forms[0].CompanyName.value;

我将在下一篇文章中着重讨论这类代码的细节问题。现在,我希望你感受一下这些语法看上去像什么。以上任何一个表达方式都是一种(形式的)简化,因为你不必像使用LotusScript那样将每个对象都实例化。在LotusScript中,要得到相同的结果你需要写以下代码:

Dim w as New NotesUIWorkspace
Dim udioc as NotesUIDocument
Dim doc as NotesDocument
Dim coName as String
Set uidoc=w.CurrentDocument
Set doc=uidoc.Document
coName=doc.CompanyName

像上面的例子中将所有变量实例化的好处是,一旦你将它们实例化一次,你就可以重复使用所有这些变量(而不需要再做重复的工作)。因此,在LotusScript中,一旦你将这些变量初始化定义并赋值以后,你就可以方便地在同一个文档中返回多个域的值:

coName=doc.CompanyName
coAddr=doc.Address
coCity=doc.City

在这个LotusScript的例子中,我所使用的doc,是我从NotesUIWorkspace中得到的NotesUIDocument的实例化的NotesDocument。虽然这在LotusScript中不常见,但这样你可以像在JavaScript中那样写出指向对象的多文档。在LocusScript中,可以这么写:

Dim w as New NotesUIWorkspace
coName=w.CurrentDocument.Document.CompanyName
coAddr=w.CurrentDocument.Document.Address
coCity=w.CurrentDocument.Document.City

请注意除了w(对于NotesUIWorkspace),我用到的都是属性(就像CurrentDocument),而不是其他变量。

除了多数使用LotusScript的人不知道的原因以外,你极少看到这样的注意事项,主要是由于这种写法比较难读并且输入起来也很烦琐(还容易拼错)。在JavaScript中,你将遇到同样的问题,甚至更糟的是它还是大小写敏感的。然而幸运的是,在JavaScript中你同样可以创建能够重复使用的中间对象淞俊R虼耍旅娴拇耄?

coName=document.forms[0]CompanyName.value;
coAddr=document.forms[0].Address.value;
coCity=document.forms[0].CityName.value;

你可以简化为:

var doc=document.form[0];
coName=doc.CompanyName.value;
coAddr=doc.Address.value;
coCity=doc.cityname.value;

我不知道你怎么看,反正对我来说感觉它非常像LotusScript,并且更加容易阅读。如果你的代码很长(JavaScript通常看上去很长),创建中间变量不仅比冗长的格式具有更好的可读性,而且易于操作。

你注意到我例子中的"var"了吗?小写的var在JavaScript中相当于LotusScript中的Dim和Set。var的意思是变量,这是你定义变量所需要做的所有的操作。不同于LotusScript,JavaScript不必考虑变量的类型。换句话说,在JavaScript中没有定义变量类型为NotesDocument或者NotesDatabase的相应语句。在这里,变量就是变量,它将根据你的需要变为任何类型。

像在LotusScript中一样,许多JavaScript的变量不需要通过var来定义。但对变量进行声明还是可取的,即使不为其他原因,仅仅为了能使你的代码具有更好的可读性。


JavaScript的函数


在结束这篇文章前,我将跟你讨论一些关于"弯曲的括号"的内容,也就是大括号(花括号),从而使你开始克服这个难点。像其他任何一种语言一样,JavaScript也是由函数构成的。这些函数之间通过相互调用完成你所需要的操作。函数就是被调用的时候执行的一段代码块。JavaScript的函数使用大括号。

大括号仅仅是容器,在JavaScript被好多地方使用,如函数、if语句等等。这也是你可以到处看到它的原因所在。一个简单的JavaScript函数就像以下形式:

function doAlert() {
   alert("This is from the doAlert function!");
}

它相当于LotusScript中的以下语句:

Sub doAlert
   Messagebox("This is from the doAlert subroutine!")
End Sub

在这个例子中你可以看到,大括号定义了函数的起始和结束。仅此而已。由于在JavaScript中没有End Function这样的语句,因此大括号用于标注函数代码的结束。

现在我还不想进入语法细节的讨论。但让我给你另外一个例子:if语句。在LotusScript中的一个if语句形式如下:

If doc.CompanyName(0)<>"" then
   Msgbox("There is a company name.")
Else
   Msgbox("Thsre is no company name.")
End if
    在JavaScript中是这样的:
if(doc.CompanyName.value !=""){
   alert("There is a company name.");
} else {
   alert("There is No company name."):
}

在JavaScript中有很多大括号,而没有End If,因此大括号只是if语句的容器而已。如果你将alert语句去掉,那么无论你在if模块中做什么,都会具有如下形式:

if (doc.CompanyName.value !="") {
} else {
}

通过这种方法,你可以很容易地理解JavaScript语法中的容器部分。实际上,这也是我写JavaScript的方法。当创建一个函数、一个if语句或者其他需要容器的语句之前,我总是先将它们的容器(大括号)写上。在LotusScript中,Notes自动替我们加上了结束的语句,如End Function。但由于JavaScript不会自动添加这些代码,即使是在Notes的客户端,因此我总是在做其他任何操作前将它们加上。否则,我将无法确定我到底需要多少大括号以及它们都应该放在哪儿。

在JavaScript中另一个容易混淆的问题是,不是所有的人都采用同样的方式添加括号。有些人喜欢让括号单独占一行,像这样:

if(doc.CompanyName.value !="")
{
   alert("There is a company name.");
}
 else
{
   alert("There is No company name."):
}

我个人认为,这样的形式难以阅读,但另外一些人显然喜欢合在一起的写法:

if(doc.CompanyName.value !=""){
   alert("There is a company name."); }
else {
   alert("There is No company name."): }

或者写成:

if(doc.CompanyName.value !="")
   { alert("There is a company name.");
} else 
   { alert("There is No company name."): 
}

还有很多其他的形式。我发现这些形式大多都难以阅读。问题是当你调用它的时候,JavaScript不会关心你如何放置你的括号,至少不会关心你把它放在哪一行。实际上,如果你喜欢,你甚至可以将它写成这样:

if(doc.CompanyName.value !="")
{ alert("There is a company name.");} else{ alert("There is No company name."): }

如果你看过了足够多奇怪的形式(有些人出于某些原因使用它们),就会发现我在开始提到的简单的加括号的方法是非常好的。


OK,现在你……


你可以在你的JS Header中创建一个简单的函数。JS Header是一种对象,它是窗体的一部分,就像PostOpen、QuerySave等其他对象和事件(见图3)。这就是你输入大量JavaScript代码供Notes应用程序使用的地方。这多多少少像一个JavaScript的全局区。你放在JS Header中的任何东西都可以被该窗体中的所有对象所用,因此这是你输入需要重复使用的代码的好地方。还有许多位置允许你输入JavaScript到Notes,我们将在以后的文章中讨论这些内容,现在首先让我们来看JS Header。



图 3

在JS Header中输入如下代码:

function doAlert (messageText) {
   alert (messageText);
}

这是我以前曾经使用过的一个例子,但不同的是,在此我通过一个叫做messageText的参数将显示信息传递给函数。

现在,在不同的地方调用doAlert函数。首先,在你的窗体上创建一个按钮并在onClick事件中输入如下代码:

doAlert("This alert was called form the button.");

然后在onLoad事件中输入:

doAlert ("This alert is from the onLoad event.");

现在通过浏览器测试你的窗体。你将发现onLoad事件首先在窗体装载的时候发生。在JavaScript中onLoad事件相当于LotusScript中的PostOpen事件,只有一点不同:LotusScript的PostOpen事件在每次会话中(session)只发生一次。你打开该窗体后可以试试多次刷新页面,而PostOpen事件就不再发生了。同样的试验中,你每次刷新onLoad事件都要重新发生。如果你试一下按钮,就会发现正如你所预期的,它仅仅在你点击它的时候才工作。

注意,在以上两个例子中,我调用函数所需要做的只是使用它的名字。LotusScript中的函数也是通过同样的方式调用;但你必须在调用子程序的时候使用"Call"。在JavaScript中没有"Calling"的语法,也不存在函数和子程序的分别。它们都是JavaScript的函数。


参考资料

  • 本文摘自 2003.6 《Lotus Magazine 简体中文版》:《Lotus Magazine 简体中文版》作为国内第一个专注于IBM Lotus技术的刊物,其内容主要源自美国Lotus方面的相关顶级技术刊物,面向广大Lotus管理及开发人员,向您展示最新最前沿的Lotus相关技术。欢迎 申请赠阅



  • Lotus相关专题:如果您是对Lotus感兴趣的开发人员,想进一步了解Lotus产品家族,熟悉Lotus产品是如何和IBM其他的产品一起协同工作的,Lotus是如何支持诸如XML、Web服务等等业界的开放标准的,如何用Lotus进行J2EE的开发,纯谭梦?IBM developerWorks 中国网站的 Lotus相关专题。在这里,我们为您精心收集了相关的文章、教程、红皮书,相信对您的开发会有所帮助。

关于作者

IBM has authored this article

posted @ 2010-12-08 08:02  hannover  阅读(1440)  评论(0编辑  收藏  举报