1.2 JavaScript的限制
JavaScript通常被作为一种客户端语言使用,这里所说的客户端,一般是指终端用户的Web浏览器。在浏览器中,JavaScript代码被解释并被执行,这一点和服务端语言截然不同。所谓的服务端语言需要运行在服务器,并发送一些静态数据给客户端,例如PHP、ASP等。
由于JavaScript根本无法和服务器的环境打交道,很多任务是通过PHP实现的,例如读写数据库,或者创建一个文本文件等。不过因为JavaScript可以与客户端环境交互,所以它能够根据客户端信息来做一些判断或操作,例如鼠标位置、元素的尺寸等,而这是服务端语言无法做到的。
什么是ActiveX?
如果您对微软的JScript已经很熟悉了,那么可能会想到“JavaScript也许可以通过ActiveX做些什么事”。没错,确实可以,不过ActiveX并不是ECMAScript的一个组成部分。ActiveX只是Windows操作系统的一种特别机制,以便Internet Explorer可以访问COM对象,而且通常ActiveX是运行于受信任的环境中的,例如Intranet。我们会很快遇到几个例外:InternetExplore中没有专门的安全设置的ActiveX控件(例如Flash插件,还有XMLHttpRequest)。但绝大多数情况下,对ActiveX的讨论不在本书范畴之内。
通常,在任何一台计算机上运行的客户端的能力总是没有服务器端强大,所以,JavaScript并不适合用来进行大量数据的处理。但是它对少量数据的即时处理能力对于客户端而言却有着莫大的吸引力,例如接受响应、验证表单等,这使得它成为一个完成此类任务的最佳选择。
但是,试图评价服务器端语言和客户端语言的优劣却是不必要的。这两种语言不具有可比性,它们只是针对不同任务的工具而已,两者的交集也并不多。然而,对于客户端脚本和服务器脚本的交互能力的需求却导致新一代Web脚本语言的产生,这种新脚本语言使用XmlHttpRequest来请求服务器数据,运行服务器端的脚本,同时在客户端处理结果。第18章将深入探讨这种技术。
安全性限制
正因为JavaScript可用于操作那些非常敏感的数据和程序,所以它的能力被严格地限制,以防止被人恶意使用。因此,JavaScript被禁止去做很多的事情。例如,它不能读取计算机的系统设置,不能操作硬件,也不能启动别的程序。
一些本来在JavaScript中被禁止的特殊的交互在特定的页面元素中也可以被允许。例如,修改< input>的值通常是没什么问题的,除非是一个文件上传区(例如,< input type="file">),往里面写入是被禁止的,因为这可以阻止恶意代码偷偷地让用户上传他本来不希望上传的文件。
还有很多类似的限制,本书将通过大量的例子和应用一一展示。但这里还是可以简单地总结一下,下面列出了JavaScript中由于安全问题而被禁止的操作:
- 不能打开和读取文件(除非在特别的环境之下,相关内容会在第18章讨论);
- 不能在用户的计算机上创建和编辑文件(除了cookie,相关内容在第8章讨论);
- 不能读取HTTP post数据;
- 不能读取系统设置,或者用户计算机上的任何其他数据,除非是语言本身提供的数据或者是环境提供的宿主对象(host object)1;
- 不能修改文本输入区域的值;
- 不能修改从其他域载入的document的显示方式;
- 不能关闭和修改工具栏或者其他任何没有向脚本开放的窗口元素。
结果,JavaScript好像被禁止了太多的功能。
另外,还有一点值得注意。很多浏览器提供了更加精细的权限控制,而不仅仅是一个允许或禁止的选项。例如,Opera可以禁止脚本关闭窗口,禁止移动窗口,禁止状态栏写入,禁止接收鼠标右键消息……这个列表还可以列得更长。加上了这些限制,您能做的事情就更少了,不过通常不需要关心那些选项,在大多数情况下,那些选项是为了对付一些烦人的代码(走马灯式的滚动状态栏、禁止右键的脚本等)而准备的,所以如果不想写那些让人讨厌的脚本,这些限制完全不用放在心上。