ECMAScript第五版(2009年12月发布)引入了一系列新方法(有关详细信息,请参阅此表)。然而,仍然有一些旧的浏览器没有实现这些新方法。
幸运的是,有一个方便的脚本(用JavaScript编写)ES5填充程序,它可以在不存在这些方法的环境中手动实现这些方法。
然而,我不确定如何提供ES5垫片。。。我应该把它"给"所有的浏览器吗,比如:
<script src="es5-shim.js"></scipt>
或者我应该包括一个检查,以便只"打扰"那些真正需要它的浏览器,比如:
<script>
if ( !Function.prototype.hasOwnProperty( 'bind' ) ) {
(function () {
var shim = document.createElement( 'script' );
shim.src = 'es5-shim.js';
var script = document.getElementsByTagName( 'script' )[0];
script.parentNode.insertBefore( shim, script );
}());
}
</script>
(我用Function.prototype.bind
来检查浏览器是否实现了所有新的ECMAScript 5方法。根据我上面链接的兼容性表,bind
是实现ECMAScript5方法的"最后堡垒"。)
当然,为了使这个填充程序有效,它必须在所有其他脚本之前执行,这意味着我们希望在页面的早期(在HEAD中,在所有其他脚本元素之前)包括上述脚本元素。
那么,第二个示例是否是向浏览器提供ECMAScript 5-him的好方法呢?有更好的方法吗?
ES5 Shim只填充浏览器未实现的部分,所以只将其提供给所有浏览器即可。它将处理检测哪些需要填隙,哪些不需要填隙。
但请注意在某些情况下列出的垫片不能正常工作的注意事项。我过去也有过这样的问题,它会引起很多痛苦,直到你意识到答案非常简单。。。
这似乎对我有用:
<!--[if lt IE 9]><script src="java/es5-shim.min.js"></script><![endif]-->
目前,最适合ES5 Shim的解决方案是在所有环境中使用该库,并允许它在运行时检测需要修补的功能。最好是从社区CDN交付,以最大限度地提高跨站点缓存命中率。
也就是说,有一个开放的机会来创建将特征检测、代理指纹识别和动态绑定相结合的系统,以自动生成和交付目标垫片子集。问题的范围远远超出了ES5垫片的范围,可以应用于各种垫片。