HTML5中的polyfill是什么意思?


387

HTML5中的polyfill是什么意思?我在许多有关HTML5的网站中都看到了这个词,例如HTML5-Cross-Browser-Polyfills。

因此,这里我们收集了所有的填充,后备和填充,以便将HTML5功能植入到本机不支持它们的浏览器中。

我实际上不了解polyfill的含义。

是新的HTML5技术还是JavaScript库?在HTML5之前我从未听说过这个词。

垫片,后备和填料之间有什么区别?


1
您可以检查更好地理解blogs.msdn.com/b/jennifer/archive/2011/08/04/...

@ user3400622感谢您的链接,链接中的解释非常清楚。
安德鲁·林

Answers:


377

polyfill是用JavaScript制作的浏览器后备,它允许您希望在现代浏览器中使用的功能可以在较旧的浏览器中使用,例如,在较旧的浏览器中支持画布(HTML5功能)。

这是一种HTML5技术,因为它与HTML5结合使用,但它不是HTML5的一部分,您可以在没有HTML5的情况下使用polyfill(例如,支持所需的CSS3技术)。

这是个好帖子:

http://remysharp.com/2010/10/08/what-is-a-polyfill/

这是Polyfills和Shims的完整列表:

https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills


6
所以这意味着ie7.js也是一个polyfill
Jitendra Vyas

1
是:“许多修复程序包括PNG透明度,CSS样式/选择器,渲染错误修复程序等。” 它通过浏览器尚不支持的javascript添加此功能。
2011年

1
我认为HTML5之后出现了Polyfills这个词。Shim与Polyfills不同吗?
Jitendra Vyas

16
匀场片更为笼统。填充胶是一种垫片。这里是解释它好一个问题:stackoverflow.com/questions/6599815/...
卡尔文Froedge

6
remysharp.com/2010/10/08/what-is-a-polyfill这个链接不仅仅是一个“好帖子”,它实际上是创造该词的人的完整定义和词源。摘录:“产品Polyfilla(在美国包装)是一种糊剂,可以粘贴到墙壁上以覆盖裂缝和孔洞。” 该帖子还涵盖了垫片过时的概念,并且与polyfill不同。这是一本必读的书,IMO。
aaron编码

64

首先,让我们澄清一下polyfil不是什么:polyfill不是HTML5标准的一部分。即使您经常看到在这些上下文中引用了polyfill,polyfill也不仅限于Javascript。

术语polyfill本身是指一些代码,这些代码“允许您具有某些期望的功能,这些功能在当前或“现代”浏览器中也可以在不支持该功能的其他浏览器中使用。”

这里的polyfill的来源和示例:

http://www.programmerinterview.com/index.php/html5/html5-polyfill/



16

填充填充是一种填充程序,它将原始调用替换为对填充程序的调用。

例如,假设您要使用navigator.mediaDevices对象,但并非所有浏览器都支持此对象。您可以想象一个提供了垫片的库,您可以像这样使用它:

<script src="js/MediaShim.js"></script>
<script>
    MediaShim.mediaDevices.getUserMedia(...);
</script>

在这种情况下,您将显式调用填充程序,而不是使用原始对象或方法。另一方面,polyfill会替换原始对象上的对象和方法。

例如:

<script src="js/adapter.js"></script>
<script>
    navigator.mediaDevices.getUserMedia(...);
</script>

在您的代码中,看起来好像您正在使用标准的navigator.mediaDevices对象。但是实际上,polyfill(示例中的adapter.js)已经用自己的对象替换了该对象。

用它代替的是垫片。这将检测该功能是否受本机支持,如果支持,则使用它;如果不支持,则将使用其他API解决该功能。

因此,polyfill是一种“透明”垫片。这就是雷米·夏普(Remy Sharp,他是该术语的创造者)所说的意思:“ 如果删除了polyfill脚本,即使删除了polyfill,代码也将继续运行,而无需进行任何更改 ”。


9
什么是垫片?
奥利弗·沃特金斯

3
@Oliver Watkins如果您熟悉适配器模式,那么您知道什么是垫片。Shims拦截API调用,并在调用者和目标之间创建一个抽象层。通常使用垫片来实现向后兼容性
Anurag Ratna

@AnuragRatna我不会使用'intercept'来避免混淆。.Intercept通常是指(透明地)拦截的代码,即在调用者不知道的情况下。垫片提供 API调用以实现向后兼容性
Qetesh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.