我想用 JavaScript/JScript/ECMAScript 构建一个库...无论你想怎么调用它,它将针对现代标准(HTML5、CSS3、ESv5),并记住任何支持该标准的浏览器!现在我知道已经有很多有用的库了,例如 jQuery 和 MooTools。当然它们很棒,而且我已经在必要的地方使用它们,但我不应该仅仅因为它很流行而被迫与其他开发人员一样追赶潮流!
因此,为了解决以下问题,我们不要关心 jQuery 和 MooTools 等第三方库。让我们开始讨论 JavaScript/JScript/ECMAScript 的本质。
首先,我在此之前问过一个问题( What's the difference between JavaScript, JScript & ECMAScript? ),因为我不知道有什么区别。
幸运的是,我得出了以下结论:
ECMAScript 是语言规范。 JavaScript 和 JScript 是 ECMAScript 的方言。
JavaScript 是 Mozilla 对 ECMAScript 的实现。
JScript 是 Microsoft 对 ECMAScript 的实现。
好吧,这是一个很好的简单答案,不是吗?但以下是由此产生的一些问题:
- 非 Mozilla 浏览器是否支持“JavaScript”,支持程度如何?
- 非 Microsoft 浏览器是否支持“JScript”,支持程度如何?
基于这两个问题,我做了一些挖掘,并在 IE9、FF14 和 GC19 上进行了简单的测试。
这是测试代码:
<!DOCTYPE html>
<html>
<head>
<title>HTML 5 Template</title>
<script language="JavaScript1.3">
jsver = "1.3";
</script>
<script language="JavaScript1.4">
jsver = "1.4";
</script>
<script language="JavaScript1.5">
jsver = "1.5";
</script>
<script language="JavaScript1.6">
jsver = "1.6";
</script>
<script language="JavaScript1.7">
jsver = "1.7";
</script>
<script language="JavaScript1.8">
jsver = "1.8";
</script>
<script type="text/javascript">
document.write("<B>Your browser supports JavaScript version " + jsver + ".</B>")
</script>
</head>
<body>
</body>
</html>
结果为:IE9 = JSv1.3、FF14 = JSv1.8、GC19 = JSv1.7
好的,然后我运行了这个测试,测试 ECMAScript 版本 5 支持: http://kangax.github.com/es5-compat-table/#showold
再次使用相同的浏览器(IE9、FF14、GC19),ESv5 似乎得到了很好的支持!
现在棘手的事情来了!我有微软背景,使用 C#、ASP.NET 等语言编写软件,所以自然地,我选择的 IDE 是 Visual Studio(目前是 2010 年)。当我查看 JavaScript 智能感知时,我会看到 ActiveXObject、Array、Object 等内容。
- 我应该信任 VS2010 的智能感知吗?
- 在哪里可以找到 ESv5 支持的对象和功能的引用?
- 如何检测浏览器是否支持特定对象或功能?
- 有没有比 VS2010 更好的工具可以帮助我编写兼容的 ESv5 代码?
- 重写现有对象(例如对象、数字、 bool 值等)的实现是否安全,或者我应该扩展现有的实现吗?
最后,关于 jQuery。假设我懒得自己编写核心合规性和功能,我可以只编写我的库来坐在 jQuery 之上...还是这只是一个逃避?
最佳答案
1) 不。当然,它不会仅限于有效的 ECMAScript。
2) http://kangax.github.com/es5-compat-table/总是有用的。
3) 您只需检查它是否已定义即可。例如
typeof(Array.isArray) === 'function'; // true in newer browsers, false in IE8
4) 最好的办法是阅读规范!在代码中使用 "use strict";
还会捕获某些类型的错误,这是一个很好的做法。有关严格模式的更多说明,请访问 http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
5)我当然不会替换原来的对象。如果您要扩展属性,我首先会仔细检查是否尚不存在兼容的实现。例如。 PrototypeJS 添加了(在浏览器实现它之前)一个 document.getElementsByClassName
。当浏览器开始原生实现它时,他们发现使用 Prototype 的网站仍在使用基于 JS 的缓慢版本。修复方法只是将 Prototype 的定义包装在 if (document.getElementsByClassName == undefined) { }
关于javascript - 编写 ECMAScript5 兼容代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12053831/