37

ECMAScript 第五版(2009 年 12 月发布)引入了一系列新方法(详见此表)。但是,仍然有一些较旧的浏览器没有实现这些新方法。

幸运的是,有一个方便的脚本(用 JavaScript 编写) - ES5-shim - 在不存在这些方法的环境中手动实现这些方法。

但是,我不确定如何提供 ES5-shim ......我是否应该将其“提供”给所有浏览器,如下所示:

<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它是实现 ECMAScript 5 方法的“最后堡垒”。)

当然,要使这个 shim 生效,它必须在所有其他脚本之前执行,这意味着我们希望在页面的早期包含上述 SCRIPT 元素(在 HEAD 中,在所有其他 SCRIPT 元素之前)。

那么,第二个示例是否是向浏览器提供 ECMAScript 5-shim 的好方法?有更好的方法吗?

4

3 回答 3

23

ES5-Shim 只会填充浏览器未实现的部分,因此只需将其提供给所有浏览器即可。它将处理需要填充和不需要填充的检测。

但请注意在某些情况下垫片无法正常工作的注意事项。过去我遇到过这个问题,它会引起很多痛苦,直到你意识到答案非常简单......

于 2012-01-04T19:34:48.587 回答
14

这似乎对我有用:

<!--[if lt IE 9]><script src="java/es5-shim.min.js"></script><![endif]-->
于 2013-08-31T01:52:55.883 回答
8

目前,最适合 ES5-Shim 的解决方案是在所有环境中使用该库,并允许它检测需要在运行时修补哪些功能。最好从社区 CDN 交付,以最大限度地提高跨站点缓存命中率。

话虽如此,创建结合特征检测、代理指纹识别和动态捆绑以自动生成和交付目标垫片子集的系统是一个开放的机会。问题的范围远远超出了 ES5-Shim,可以应用于各种 shim。

于 2012-01-04T19:49:01.450 回答