确认ES5支持
Confirming ES5 support
在Javascript(CoffeeScript)前端应用程序中,有什么最好和最简单的方法来通知用户他们的浏览器不受支持,而不是让它在用户随机命中不受支持的ES5功能时故障切换?比方说,我正在为现代浏览器编写一些东西,我想避免旧浏览器在我的代码使用ES5引入的功能时会遇到的无数故障。。。阻止不兼容的ES5浏览器?
ES5引入了一些语法功能,我相信CoffeeScript依赖其中的一些功能,如果浏览器不支持ES5,我希望我的代码从一开始就避免执行,而不是调整垫片、使用Modernizr或检查每个CoffeeSript语法子集,以确定它支持的向后程度。只有ES5和一个干净的"很抱歉你的浏览器太旧了"页面,适用于世界其他地方。
我不希望编写测试每个ES5功能的代码,也不一定依赖于诸如http://kangax.github.io/es5-compat-table/用于检查浏览器类型和版本(尽管,如果没有更好的替代方案,我会求助于更晚的版本…)。
这里没有神奇的解决方案。
对于每个仅限ES5的功能(无论是Object.*
方法还是String.prototype.*
方法,或者是新语法——getter、setter等),您都有3个选项:
- 填隙
- 在执行之前测试它是否得到支持,如果不支持则退出
- 让它失败(可能使用粗略的全局
try-catch
块)
为什么?
因为没有"ES5"浏览器这样的东西。
"ES5"不是可以计算的布尔值。正如你从同胞那里看到的。表,ES5是一组相当大的功能。这些功能是由不同的浏览器/平台分块实现的,在不同的时间实现的,并具有各种兼容性。
当然,你总是可以想出一些聪明的推理测试:
var isEngineES5Compliant = 'create' in Object &&
'isArray' in Array &&
'x'[0] === 'x';
但我相信你知道这有多脆弱。
如果浏览器支持一个方法,而你试图调用另一个方法——可能可用,也可能不可用——那么,它通常不会带来什么好结果。会有误报/漏报,也会有失败。
你说你只为现代浏览器写作,但你到底是如何定义现代浏览器的?它是否完全支持ES5?或者至少是您的代码正在使用的ES5的子集?在这种情况下,你需要确切地知道那是什么子集
话虽如此,如果我们绝对必须提出推理测试来确定完全符合ES5,我会选择:
(function () {
"use strict";
return Function.prototype.bind && !this;
}());
这检查了对"严格模式"的支持(实际上只是严格模式的一部分,但很可能就足够了)和Function.prototype.bind
的存在。
这两项功能都是最后一批由浏览器实现的功能,因此我们将关注IE10+、Firefox 4+、Safari 6+、Chrome 13+和Opera 12+。
请注意,甚至其中一些浏览器并不完全符合ES5标准(但这种标准主要是关于模糊的ish功能)。
现在,如果你想要真正现代浏览器。。。测试ES6功能怎么样?:)
我正在考虑使用下面的try-catch来测试es6的某个子集。
在铬现在工作:
try {
eval(`
'use strict';
class hello {
get hello() { return 123; }
}
`);
} catch(e) {
console.log('es6 classes are disabled :(')
}
将其转换为es5以测试getter可能看起来像:
try {
(function() {
eval('var dfojdfoj12 = { get hello() { return 123; } }');
})();
} catch(e) {
console.log('es5 getters do not exist')
}
为了"优雅地"失败(比如显示正确的解释,而不是白色页面或混乱的混乱),我们选择使用不支持的浏览器对话框中描述的方法删除样式和内容
测试CSS动画支持和Function.prototype.bind
(在加载任何脚本(如es5填充程序)之前)运行良好。注意,如果你想在PhantomJS 中测试你的东西,你需要加载这个垫片
- jQuery-2.1.1.min.js或最新版本jQuery-2.13.min.js不会't支持'@
- jQuery检测浏览器是否支持Zoom
- 错误:对象没有't支持'自动完成'
- EmberJS中支持单字母单词模型
- javascript中的命名空间,IDE中支持代码完成/内容辅助's
- Internet Explorer缺少占位符支持,特别是密码字段
- 为什么我得到错误IE修剪方法是't支持
- 任何浏览器都不支持javascript函数
- GTK百老汇支持同时连接
- JQuery示例不起作用-“;对象没有't支持属性或方法'按钮'&”;
- 对象不支持属性或方法“自动完成”
- 对象没有'不支持set_viewXML
- Javascript Q库浏览器支持
- Unexpected Transpile ES6>ES5
- 您的平台不支持RxJS-Array.observe
- React Native当前是否支持访问用户'的通讯簿
- 将HTML(支持文件)中的令牌(字符串、数字等)传递给LogiXML
- 确认ES5支持
- 扩展常规对象以支持ES5 Array功能的问题
- 无法在IE8中使用underscore.js或es5-shim获得indexOf支持