Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何提供ECMAScript 5(ES 5)-垫片?_Javascript_Html_Browser_Ecmascript 5_Es5 Shim - Fatal编程技术网

Javascript 如何提供ECMAScript 5(ES 5)-垫片?

Javascript 如何提供ECMAScript 5(ES 5)-垫片?,javascript,html,browser,ecmascript-5,es5-shim,Javascript,Html,Browser,Ecmascript 5,Es5 Shim,ECMAScript第五版(2009年12月发布)介绍了一系列新方法(有关详细信息,请参阅)。然而,仍然有一些旧的浏览器没有实现这些新方法 幸运的是,存在一个方便的脚本(用JavaScript编写)——它可以在不存在这些方法的环境中手动实现这些方法 然而,我不知道如何提供ES5垫片。。。我是否应该将其“提供”给所有浏览器,如: <script src="es5-shim.js"></scipt> <script> if ( !Function.pro

ECMAScript第五版(2009年12月发布)介绍了一系列新方法(有关详细信息,请参阅)。然而,仍然有一些旧的浏览器没有实现这些新方法

幸运的是,存在一个方便的脚本(用JavaScript编写)——它可以在不存在这些方法的环境中手动实现这些方法

然而,我不知道如何提供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>

或者我应该包括一个检查,以便只“打扰”那些真正需要它的浏览器,比如:

<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>

if(!Function.prototype.hasOwnProperty('bind')){
(功能(){
var shim=document.createElement('script');
shim.src='es5 shim.js';
var script=document.getElementsByTagName('script')[0];
script.parentNode.insertBefore(垫片,脚本);
}());
}
(我正在使用
Function.prototype.bind
检查浏览器是否实现了所有新的ECMAScript 5方法。根据我上面链接的兼容性表,
bind
是实现ECMAScript 5方法的“最后堡垒”。)

当然,为了使这个垫片有效,它必须在所有其他脚本之前执行,这意味着我们希望在页面的早期(在头部,在所有其他脚本元素之前)包含上述脚本元素


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

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


但是,在某些情况下,请注意垫片不能正常工作时所列的注意事项。我在过去曾经遇到过这样的问题,它会带来很多痛苦,直到你意识到答案非常简单…

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


这就是说,有一个开放的机会来创建结合功能检测、代理指纹识别和动态绑定的系统,以自动生成和交付目标垫片子集。问题的范围远远超出了ES5垫片的范围,并且可以应用于各种垫片。

这似乎适用于我:

<!--[if lt IE 9]><script src="java/es5-shim.min.js"></script><![endif]-->


但这将迫使兼容ES5的浏览器(最新的IE、Chrome、Firefox、soon Opera)下载并执行垫片,从而不必要地降低网页速度。如果我可以通过一点JavaScript检查来避免这种情况,我很乐意这样做。@ŠimeVidas:它是8kB。有了适当的缓存,这没什么好担心的。正如@You所说的,它是8kb(在gzip压缩之前),并且很容易缓存。如果额外的HTTP请求确实有问题,请将其与主脚本结合使用。@epascarello您是对的。现代浏览器比这更好。但是如果你想支持年长的浏览者,你必须做点什么。问题是Chrome、Safari、Firefox和IE9都对ES5功能集有不同的支持,所以除了测试所有功能之外(这将增加1k的大小,你必须进行用户代理和版本检测,并保持这一点,以跟踪疯狂的Chrome和Firefox发布计划。如果额外的HTTP命中真的令人烦恼,请将其内联并保存命中率。你的移动网络仍然比9600波特的调制解调器快得多。如果你担心额外的HTTP请求,只需将您的JS脚本压缩并组合成一个(或几个)文件。在生产系统中,您无论如何都应该这样做,以最小化HTTP调用。不支持ES5的非IE浏览器呢?@Bergi:我认为它们实际上不存在。@RocketHazmat:我想您的意思是“它们很少使用”,但它们确实存在。以流行浏览器的ES5之前版本,或一些嵌入式或移动浏览器为例。@silversky:为什么它在“java”文件夹中:)?