为什么JavaScript在浏览器中不一致?

时间:2010-08-06 19:02:48

标签: javascript cross-browser

这是我在无数个小时修复JS与跨浏览器兼容(主要是IE)后一直在思考的问题:为什么不是Javascript 一致的在浏览器中?< / p>

我的意思是,为什么JS不能像Java和Flash一样好看?相反,我们必须采用像jQuery这样的框架。不要误会我的意思,他们让我的生活更轻松 - 但为什么他们甚至首先存在?

这有历史原因吗?推出浏览器的公司是否只运送自己的JS引擎?使标准化如此困难的政治是什么?

(注意:我知道问题的很大一部分与DOM有关,但问题仍然存在)。

4 个答案:

答案 0 :(得分:16)

Javascript核心语言大部分 一致(参考1999年发布的ECMAScript第3版)。

这是导致头痛的DOM实现。部分原因是因为在某一点上没有DOM规范,因此浏览器可以在编写访问和操作网页中的html元素的规则方面做任何他们想做的事情。

例如:

  • window.addEventListener用于DOM支持浏览器,而window.attachEvent用于IE。
  • textContent用于DOM支持浏览器,innerText用于IE。
  • IE中附加事件处理程序的内存泄漏,因此您必须手动卸载它们
  • getElementById在IE和Opera中是错误的,因为它按名称返回元素
  • getAttribute('href')返回不一致的值

还存在与浏览器的CSS支持相关的问题。

  • IE6不支持本机PNG,因此您不得不使用过滤器库
  • IE中处理过滤器不透明度的Buggy动画

语言核心不一致就像是

  • 正则表达式引擎之间的不一致

但是,是的,简而言之就是之前,没有标准。从那以后,w3提出了标准,但每个浏览器供应商都有自己的方式来实现它。没有管理机构强制供应商完全应用规范。

答案 1 :(得分:7)

  

推出浏览器的公司是否只发布了自己的JS引擎?

是的,这可能是主要原因。没有统一的JS引擎;有ECMAScript的各种实现。

答案 2 :(得分:2)

浏览器推出自己的实现,简单明了。这与渲染和CSS以及浏览器中所有不同的原因相同。的Java /闪光灯/等。更通用,因为它们被抽象出浏览器并通过某种插件访问。但是他们的实际核心实现与浏览器是分开的,并由单个供应商控制。

答案 3 :(得分:2)

要添加到其他答案: 是的历史原因。我可以自己写这个,但引用Wikipedia更容易:

  

JavaScript最初是由开发的   Netscape的Brendan Eich   名称Mocha,后来改名为   LiveScript,最后是JavaScript。   LiveScript是官方名称   首次发货的语言   Netscape Navigator的测试版   在1995年9月的2.0,但它被联合重命名为JavaScript   Sun Microsystems发布公告   1995年12月4日部署时   在Netscape浏览器版本2.0B3中。

     

[...]

     

JavaScript很快就获得了   作为客户端的广泛成功   用于网页的脚本语言。作为一个   结果,微软开发了一个   兼容的语言方言,   将其命名为JScript以避免商标   的问题。 JScript添加了新的日期方法   修复非Y2K友好的方法   JavaScript,基于   java.util.Date。包含了JScript   在Internet Explorer 3.0中,发布于   1996年8月。方言是   被认为是如此相似   术语“JavaScript”和“JScript”是   经常互换使用。微软,   但是,注意到了几十种方式   JScript不符合ECMA。

     

1996年11月,Netscape宣布   它已经提交了JavaScript   Ecma International考虑   作为行业标准,和   随后的工作导致了   标准化版本名为ECMAScript。

正如您所看到的,标准ECMAScript的开发时间晚于原始语言。这只是在当前的Web浏览器实现中调整此标准的问题,这一点仍在继续,ECMAScript本身的开发也是如此(例如,参见2009年12月发布的ECMAScript 5规范)。