JavaScript兼容性一直是Web开发中面临的一个主要问题。在正式规范、实施标准及各种实现之间的现实差异让很多开发者十分迷茫。这种差异的结果就是很多网页不能在各种浏览器上呈现一致的行为或效果,甚至根本不能跨浏览器。
为了实现浏览器解析的一致性,首先需要找出不同引擎的分歧点在哪里。为此,开发人员必须清楚浏览器实现的分歧在哪里,不同JavaScript引擎在哪个地方把规范解读错了,或者习惯性定义了哪些怪异的私自标准。本章不仅挖掘IE的JScript解析的歧义,还囊括了来自Firefox、Opera和Safari的JavaScript实现,逐一比较标准的规定和实际的情形。
建议158:比较主流浏览器内核解析
浏览器可以分为两部分:外壳(shell)和内核(core),其中外壳的种类相对较多,内核则较少。浏览器的外壳包括菜单、工具栏等,主要向用户提供界面操作、参数设置等。它是调用内核来实现各种功能的。内核才是浏览器的核心。内核是基于标记语言显示内容的程序或模块。也有一些浏览器并不区分外壳和内核。Mozilla在将Gecko独立出来后,才有了外壳和内核的明确划分。目前主流的浏览器有IE、Firefox、Opera、Safari、Chrome、Netscape等。
浏览器内核又可以分成两部分:渲染引擎和JavaScript引擎。浏览器内核负责取得网页的内容(HTML、XML、图像等)、整理信息(如加入CSS等),以及计算网页的显示方式,然后将结果输出至显示器或打印机。由于不同浏览器内核对网页的语法解释会有不同,因此渲染的效果也不相同。所有网页浏览器、电子邮件客户端,以及其他需要编辑、显示网络内容的应用程序都需要内核。JavaScript引擎则是解析、执行JavaScript语言来实现网页的动态效果。最开始渲染引擎和JavaScript引擎并没有明确区分,后来JavaScript引擎越来越独立,内核就倾向于只指渲染引擎。有一个网页标准计划小组制作了一个ACID来测试引擎的兼容性和其他性能。内核的种类很多,包括免费内核大约有十多种,但常见的浏览器内核可以分为4种:Trident、Gecko、Presto、Webkit。
❑Trident又称MSHTML,是微软公司开发的渲染引擎,包含了JavaScript引擎JScript,它已经深入到Windows操作系统中,如Windows Media Player、Windows Explorer、Outlook Express等都使用它。目前很多浏览器都使用这个引擎,如IE、Maxthon(最新版已经不使用)等。
❑Gecko是使用C++语言开发的开源渲染引擎(Mozilla开源项目),包括了SpiderMonkey(Rhino)。主要的使用者有Firefox。
❑Presto是由Opera公司开发、用于Opera的渲染引擎。Macromedia Dreamweaver(MX版本及以上)和Adobe Creative Suite也使用了Presto的内核。
❑Webkit是苹果公司基于KHTML开发的,包括Webcore和JavaScriptCore(SquirrelFish、V8)两个引擎。主要的使用者有Safari和Chrome。
下面是主流浏览器所使用的内核的简单分类。
❑Trident内核:IE、Maxthon、腾讯浏览器、The World、360、搜狗浏览器等。
❑Gecko内核:Netscape 6及以上版本、Firefox、MozillaSuite/SeaMonkey等。
❑Presto内核:Opera 7及以上版本。
❑Webkit内核:Safari、Chrome等。
随着互联网十多年的高速发展,近几年市场上也推出了很多新的浏览器,但由于它们采用的并不是自主开发的内核,所以浏览器内核本身没有实质上的突破。下面对主流浏览器内核的优缺点进行比较。
❑Trident:这种浏览器内核是IE使用的内核,因为在早期IE占有大量的市场份额,所以这种内核比较流行,以前有很多网页都是根据这个内核的标准来编写的。实际上这个内核对真正的网页标准支持得不是很好,甚至在2005年,与网页标准制定组织(W3C)所制定的标准发生了脱节。同时Trident内核本身的Bug比较多,对一些符合W3C标准的网页代码支持得不是很好,这在早期的IE版本中比较明显。微软公司从IE 9版本开始全面升级了IE内核,使其完全符合标准设计要求。
❑Gecko:这是Firefox和Flock所采用的内核,这个内核的优点就是功能强大、丰富,可以支持很多复杂网页效果和浏览器扩展接口,但会消耗很多的资源,如内存。
❑Presto:这是Opera采用的内核。Presto内核被公认为目前浏览网页速度最快的内核,这得益于它在开发时的优势,在处理JavaScript等脚本语言时,会比其他的内核快3倍左右,缺点就是为了达到很快的速度而丢掉了一部分网页兼容性。
❑Webkit:这是Safari采用的内核,属于苹果系统下的浏览器。优点是网页浏览速度较快,虽然不及Presto但也胜于Gecko和Trident;缺点是对于网页代码的容错性不高,也就是说,对网页代码的兼容性较低,会使一些编写不标准的网页无法正确显示。
不同JavaScript引擎在解析相同JavaScript代码时的实现逻辑和算法可能存在分歧,当然运行的结果也会不同,最明显的就是DOM实现部分。常用JavaScript引擎说明见表8.1。