2000年左右的翻滚按钮 在那不久,JavaScript就被大量使用,用来做世界上最不重要的工作:每次鼠标从图像上面经过时交换一张图像。尽管认为开发人员会使用代码来自动化闪光按钮,然后将代码与网页一起分发,似乎是个疯狂的想法,但我们每个人都这样做过,而且做了一遍又一遍(今天,CSS提供了这种折叠效果,它使用样式设置和动画「而不是预先生成的图像文件」以更易于维护的方式提供这种折叠效果)。很少有人希望JavaScript能走得更远。许多编码人员更乐意使用服务器端编程语言,这种语言可以在命令中生成正确的JavaScript代码。在那个时候,Javascript可以为应用程序中的业务逻辑提供动力的想法,和想象用Excel宏替换数据库存储过程一样荒谬。 沙箱(Sandbox)囚徒 今天,当人们批评JavaScript时,通常是基于其语言本身的局限性:打了补丁的OOP特性,弱类型安全性,笨重的DOM模型,对“==”和“===”的困惑,等等。但这些并不是JavaScript在其早期被看作一门糟糕的编程工具的原因。毕竟,有许多丑陋的编程语言(包括BASIC,COBOL,SQL和 php),因为它们出现在正确的时间和正确的地点,而变得至关重要。JavaScript作为所有Web浏览器原生本机支持的唯一语言,出现在整个世界都被网站接管的时间点,它绝对属于在正确的时间出现在正确的位置的情形。JavaScript的真正局限性是沙箱:一种可以将代码固定到合适位置的严格控制的环境——沙箱将JavaScript与桌面世界隔离。例如,JavaScript代码无法直接访问文件系统、显示器或任何硬件资源。更严重的是,它隔离了JavaScript和Web服务器上的所有资源,比如存储客户列表和产品目录的数据库,以及运行业务逻辑的服务器端代码。被完全孤立的JavaScript,除了在页面上摆弄按钮之外,几乎没有什么其它能做,这一点也不令人奇怪。 使用XMLHttpRequest打开管道 奇怪的是,有确实的证据表明确实是微软拯救了JavaScript。但不是今天的这个在每个操作系统上都拥抱开源开发的微软,而是那个赤裸裸的反开源的斗士,和以“拥抱,扩展和消灭”的理念消灭其竞争对手的微软。事情是这样发生的。大约就在全世界都在疯狂使用滚动按钮的同时,微软的一个团队正在研究一种使Outlook的Web前端更具响应性的方法。他们正在构建一个名为Outlook Web Access的产品,其外观如下:
2000年的Outlook Web Access 微软团队的目标相对温和。他们想构建一个比在浏览器中运行更高效的电子邮件阅读器,最重要的是,他们不想每隔几秒钟刷新整个页面。因此,他们正在研究一种让网页在后台悄悄地检查新邮件的技术。这一目标可能看起来并不惊天动地,但请记住,Gmail在那时候还没有发明出来。而事实上,那时的整个谷歌公司也才只有几年的历史。微软团队用一个名为XMLHttpRequest的ActiveX组件创建了一个小的管道系统。XMLHttpRequest的基本思想很简单,它为JavaScript代码提供了一种生成Web请求的方法。就像一个Web浏览器可以联系一个Web服务器并发出一个请求一样(例如,“嘿,请把那个页面给我!”),JavaScript代码可以使用XMLHttpRequest对象发出自己的请求(例如,“嘿,请再给我发些邮件”)。突然间,一个网页就可以使用Web服务器的所有资源了。需要数据库中的一些数据吗?请呼叫服务器并请求它发送。需要服务器执行一个计算,一个安全测试,一个超级机密验证检查吗?请呼叫服务器并请求它执行。最重要的是,这些“呼叫”都发生在后台,前台页面保持不变。XMLHttpRequest并非没有奇怪之处。首先,它的命名很奇怪,大小写不一致,在像JavaScript这样的区分大小写的语言中,这是一件令人头痛的事。其次,这个名称表明你的代码发送和接收的是XML格式的消息。然而事实上,消息几乎可以是任何格式:普通文本、html块或序列化为JSON的JavaScript对象。但是,最大的问题可能是XMLHttpRequest对象是使用ActiveX构建的,这意味着它只能用于Windows计算机,而且只能在Internet Explorer中工作。但是这些奇怪之处都没有阻止它前进。在短短的几年内,其他浏览器都提供了自己的XMLHttpRequest实现:同样的对象,但没有任何ActiveX的难题。尽管创建了XMLHttpRequest对象,但微软在他们自己的Web开发中迟迟没有充分使用它。他们不愿将它用于基于Web的公共电子邮件系统Hotmail,相反,他们一直等待,直到谷歌首先在2004年的Gmail,然后在2005年的谷歌地图中使用XMLHttpRequest并震惊了Web开发世界。这是一个真正的圣杯:基于Web的程序,具备了桌面应用程序的响应能力。