【问题标题】:Why is JavaScript inconsistent across browsers?为什么 JavaScript 跨浏览器不一致?
【发布时间】:2011-06-30 18:14:08
【问题描述】:

在将 JS 修复为跨浏览器兼容(主要是 IE)之后,我一直在思考以下问题:为什么 Javascript 在浏览器中不一致

我的意思是,为什么 JS 不能像 Java 和 Flash 一样好?相反,我们不得不求助于像 jQuery 这样的框架。不要误会我的意思,它们让我的生活更轻松 - 但为什么它们一开始就存在呢?

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

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

【问题讨论】:

  • 鉴于您在 Javascript 中编写代码的大部分原因都与 DOM 相关,恕我直言,可以将两者混为一谈

标签: javascript cross-browser


【解决方案1】:

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 中处理过滤器不透明度的错误动画

语言核心不一致会是这样的

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

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

【讨论】:

  • +1 这是真实的并且需要注意。语言核心可靠的。 DOM 是 jQuery 等框架的用武之地(并且有很多好处。)
  • “核心语言大部分是一致的。”不完全是:例如,Array.prototype.sort 的稳定性不一致,Array.prototype.indexOfFunction.prototype.bind 等函数的可用性差异很大,使用 for (… in …) 迭代对象的所有属性不是(或不是,我不确定)是否一致,你需要hasOwnProperty
  • Array.prototype.indexOf 不是 ECMAScript v3 的一部分。 Mozilla 在 2004/2005 年刚刚将其投入 Gecko。 IE6是99-00开发的,01发布的,如果不是语言怎么实现呢?
  • for..in 是一致的。 hasOwnProperty 是一致的。如果你扩展Object.prototype,它会在不使用hasOwnProperty 的情况下出现,但行为应该是一致的。
  • Function.prototype.bind 没有在 Firefox 或 Chrome 中定义,也没有在 IE 中定义。我认为您混淆了自然不一致的用户定义函数并认为它们是内置的?
【解决方案2】:

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

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

【讨论】:

  • 就像带有渲染的浏览器一样,有不同的方式来解释规范,有不同的方式来实现它们,甚至更糟糕的是:用不同的方式来填补规范留下的空白!
  • 您可以放心地省略“可能”。 ;)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    补充其他答案: 有一个历史原因。我可以自己写,但引用 Wikipedia 更容易:

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

    […]

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      相关资源
      最近更新 更多