mat*_*ter 7 javascript coffeescript ecmascript-5
在Javascript(CoffeeScript)前端应用程序中,哪些是最好和最简单的方法,用于通知用户他们的浏览器不受支持,而不是让用户随机点击不受支持的ES5功能时对其进行故障转移?说,我正在为现代浏览器编写一些东西,而且我想避免在我的代码使用ES5引入的功能的任何地方,旧的浏览器会遇到无数的失败......阻止不兼容的ES5浏览器?
ES5引入了一些语法功能,其中一些我相信CoffeeScript依赖,我希望我的代码以某种方式避免执行开始,如果浏览器不支持ES5,而不是调整填充程序,使用Modernizr,或检查每个CoffeeScript语法子集,以确定它是如何支持倒退.只是ES5和一个干净的"我们很遗憾你的浏览器太旧了"页面为世界其他地方.
我不希望编写测试每个ES5功能的代码,也不一定依赖http://kangax.github.io/es5-compat-table/之类的合规性表来检查浏览器类型和版本(尽管我会求助到后来,如果没有更好的选择......).
kan*_*gax 17
这里没有神奇的解决方案.
对于每个仅ES5功能(无论是Object.*方法或String.prototype.*方法还是新语法 - getter,setter等),您有3个选项:
try-catch块).为什么?
因为没有"ES5"浏览器这样的东西.
"ES5"不是可以评估的布尔值.正如你从compat中看到的那样.表,ES5是一个非常大的功能集.并且这些功能由不同的浏览器/平台以块的形式,在不同的时间以及各种合规性实现.
当然,你总能想出一些聪明的推理测试:
var isEngineES5Compliant = 'create' in Object &&
'isArray' in Array &&
'x'[0] === 'x';
Run Code Online (Sandbox Code Playgroud)
但我相信你明白它是多么脆弱.
如果浏览器支持一种方法,并且您尝试调用另一种方法 - 可能会也可能不会 - 通常,通常没有任何好处.会有误报/否定,并且会有失败.
你说你只是为现代浏览器写作,但你究竟如何定义现代浏览器?它是完全支持ES5的吗?或者至少是您的代码使用的ES5子集?在这种情况下,您需要确切知道它是什么子集.
话虽如此,如果我们绝对不得不提出推理测试以确定完整的ES5合规性,我会选择:
(function () {
"use strict";
return Function.prototype.bind && !this;
}());
Run Code Online (Sandbox Code Playgroud)
这检查支持"严格模式"(实际上只是严格模式的一部分,但它可能就足够了)和存在Function.prototype.bind.
这两个功能都是最后一个由浏览器实现的功能,所以我们正在寻找IE10 +,Firefox 4 +,Safari 6 +,Chrome 13+和Opera 12+.
请注意,即使其中一些浏览器也不完全符合ES5标准(但合规性主要与隐藏的功能有关).
现在,如果你想要真正的现代浏览器......那么测试ES6功能呢?:)