JavaScript语言精髓与编程实践(第3版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 网页中的代码

1.1.1 新鲜的玩意儿

1996年年末,公司老板P&J找我去帮他的一个朋友做一些网页。那时事实上还没有说要做成网站。在那个时代,中国的IT人中可能还有2/3的触网者在玩一种叫“电子公告板(BBS,Bulletin Board System)”的东西—这与现在的BBS不一样,它是一种利用当时的有线电话网组成的PC-BBS系统,使用基于Telnet的终端登入操作。而另外1/3的触网者可能已经开始了互联网之旅,知道了主页(Homepages)、超链接(Hyperlink)这样的一些东西。

我最开始做的网页只用于展示信息,是一个个单纯的、静态的网页,并通过一些超链接连接起来。当时的网页开发环境并不好,因此我只能用Windows中的记事本来写HTML代码。当时显示这些HTML文件的浏览器,就是Netscape Navigator 3。

我很快就遇到了麻烦,因为P&J的朋友说希望让浏览网页的用户能做更多的事,例如搜索什么的。我笑着说:“如果是在电子公告板(PC-BBS)上,那么写段脚本就可以了;但在互联网上,却要做很多的工作。”

事实上我并不知道要做多少工作。我随后查阅的资料表明:不但要在网页中放一些表单让浏览者提交信息,还要在网站的服务器上写一些代码来响应这些提交。我向那位先生摊开双手,说:“如果你真的想要这样做,那么我们可能需要三个月,或者更久。因为我还必须学习一些新鲜的玩意儿才行。”

那时的触网者,对这些“新鲜的玩意儿”的了解还几乎是零。因此,这个想法很自然地被搁置了。而我在后来被调到成都,终于有更多的机会接触Internet网络,时值1997年,浏览器环境也已经换成了Internet Explorer 4.0。

那是一个美好的时代。通过互联网,大量的新东西被很快传送进来。我终于有机会了解一些新的技术名词了,例如CSS和JavaScript。HTML 4.0的标准已经确定(1997年12月),浏览器的兼容性开始变得更好,Internet Explorer(以下简称IE)也越来越有取代Netscape Navigator(以下简称NN)而一统天下的形势。除了这些,我还对用Delphi进行ISAPI CGI和ISAPI Filter开发的技术展开了深入的学习。

1.1.2 写在网页中的第一段代码

1998年,我调回到河南郑州,成为一名专职程序员,任职于当时的一家反病毒软件公司经纬软件(Keenvim software),后来被并购,更名为豫能信息技术有限公司,P&J(彭杰)是该公司CEO。当时的主要产品是CTO周辉与刘杰共同研发的AV95杀毒软件,在1995—1998年间是杀毒软件市场的主要竞争者之一。,主要的工作是用Delphi做Windows环境下的开发。而当时我的个人兴趣之一,就是“做一个个人网站”。那时大家都对“做主页”很感兴趣,我的老朋友傅贵在中国互联网技术论坛发展的早期,傅贵创建了著名的“Delphi/C++Builder论坛”,他也是“中国开发网ORG(cndev.org)”的创建者。就专门写了一套代码,以方便普通互联网用户将自己的主页放到“个人空间”里。同时,他还为这些个人用户提供了公共的BBS程序和其他的一些服务器端代码。但我并不满足于这些,满脑子想的就是做一个“自己的网站”。我争取到了一台使用IIS 4.0的服务器,由于有ISAPI CGI这样的服务器端技术,因此一年前的那个“如何让浏览者提交信息”的问题已经迎刃而解。而当时更先进的浏览器端开发技术也已经出现,例如,Java Applet。我当时便选择了一个Java Applet来做“网页菜单”。

但是在当时,在IE中显示Java Applet之前需要装载整个JVM(Java Virtual Machine,Java虚拟机)。这对于现在的CPU来说,已经不是什么大不了的负担了,但当时这个安装过程却非常漫长。在这个“漫长的过程”中,网页显示一片空白,因此浏览者可能在看到一个“漂亮的菜单”之前就跑掉了。

为此我不得不像做Windows桌面应用程序一样弄一个“闪屏窗口”放在前面。这个窗口只用于显示“Loading...”这样的文字(或图片)。而同时,我在网页中加入一个<APPLET>标签,使得JVM能偷偷地载入浏览器。然而,接下来的问题是:这个过程怎么结束呢?

我当时能找到的所有Java Applet都没有“在JVM载入后自动链接到其他网页”的能力,但其中有一个可以支持一种状态查询,它能在一个名为isInited的属性中返回状态True或False。而我需要在浏览器中查询到这种状态,如果是True,就可以结束Loading过程,进入真正的主页。由于JVM已经偷偷地载入过了,因此“漂亮的菜单”很快就能显示出来。因为我无法获得Java Applet的Java源代码以便重写这个Applet去切换网址,因此这个“访问Java Applet的属性”的功能就需要用一种在浏览器中的技术来实现了。

这时跳到我面前的东西,就是JavaScript。我为此而写出的代码如下:

1.1.3 最初的价值

JavaScript最初被开发人员接受,其实是一种无可奈何的选择。

首先,网景公司(Netscape Communications Corporation)很早就意识到:网络需要一种集成的、统一的、客户端到服务端的解决方案。为此,Netscape提出了LiveWire的概念LiveWire是Netscape公司的一个通用的Web开发环境,仅支持Netscape Enterprise Server和Netscape FastTrack Server,而不支持其他的Web服务器。这种技术在服务器端通过内嵌于网页的LiveScript代码,使用名为database、DbPool、Cursor等的一组对象来存取LiveWire Database。作为整套的解决方案,Netscape在客户端网页上也提供对LiveScript脚本语言的支持,除了访问Array、String等这些内置对象之外,还可以访问window等浏览器对象。LiveScript后来发展为JavaScript,而LiveWire架构也成为所有Web服务器提供SP(Server Page)技术的蓝本。例如,IIS中的ASP,以及更早期的IDC(Internet Database Connect)。,并打算用一种语言来在服务器上创建类似CGI的应用程序;与此同时,网景公司也意识到它们的浏览器Netscape Navigator中需要一种脚本语言的支持,解决类似“在向服务器提交数据之前进行验证”的问题。1995年4月,网景公司招募了Brendan Eich,希望Brendan Eich来实现这样的一种语言,以“使网页活动起来(Making Web Pages Come Alive)”。到了1995年9月,在发布NN 2.0 Beta时,LiveScript最早作为一种“浏览器上的脚本语言”被推到网页制作人员的面前;随后,在同年9月18日,网景公司宣布在其服务器端产品“LiveWire Server Extension Engine”中将包含一个该语言的服务器端(Server-side)版本该产品即是后来在1996年3月发布的Netscape Enterprise Server 2.0。

而在这时,Sun公司的Java语言大行其道。Netscape决定在服务器端与Sun进行合作,这种合作后来扩展到浏览器,推出了名为Java Applet的“小应用”。而Netscape也借势将LiveScript改名,于1995年12月4日,在与Sun公司共同发布的一份声明中首次使用了“JavaScript”这个名字,将之称为一种“面向企业网络和互联网的、开放的、跨平台的对象脚本语言”。从这种定位来看,最初的JavaScript在一定程度上是为了解决浏览器与服务器之间统一开发而实现的一种语言。

微软在浏览器方面是一个后来者。因此,它不得不在自己的浏览器中加入对JavaScript的支持。但JavaScript是Sun注册并授权给Netscape使用的商标,为了避免这一冲突,微软只得使用了JScript这个名字。微软在1996年8月发布IE 3时,提供了相当于NN 3的对JavaScript脚本的语言支持,但同时也提供了自己的VBScript。

当IE与NN进行那场著名的“浏览器大战”的时候,没有人能够看到结局。因此要想做一个“可以看的网页”,只能选择一个在两种浏览器上都能运行的脚本语言。这就使得JavaScript成为唯一可能正确的答案。当时,几乎所有的书籍都向读者宣导“兼容浏览器是一件天大的事”。为了这种兼容,一些书籍甚至要求网页制作人员最好不要用JavaScript,“让所有的事,在服务器上使用Perl或CGI去做好了”。

然而随着IE 4.0的推出以及缘于DHTML带来的诱惑,一切都发生了改变。