检测浏览器对 Polymer 的支持

Detect browser support fo Polymer

我在网站上使用 Polymer(版本 0.5,可能会在某个时候升级到 1.0)。显然,许多旧版浏览器不能很好地使用 Polyfills。

有没有办法测试 polyfill 在特定浏览器中是否成功?那么,在 polyfill 完成后,是否有一些函数、对象、变量或任何我可以检查 polyfill 是否有效的东西?

我希望能够检测到故障,然后重定向到带有 "please upgrade" 消息的页面。

对我来说,唯一的选择是在我的后端实现某种浏览器检测中间件,由于各种内部原因,我现在宁愿避免这种情况(并且因为它具体意味着 whitelisting/blacklisting浏览器列表,很快就会变得乏味)。

提前致谢。

简答:

快速测试:Firefox 38.0.5 警报 "No",而 Chrome 44.0.2403.130 m 警报 "Yes"

function supportsPolymer() {
  return 'content' in document.createElement('template') && 'import' in document.createElement('link') && 'registerElement' in document && document.head.createShadowRoot;
}

if(supportsPolymer()) {
  
  //Good to go
  alert("Yes");
  
} else {
  
  //Is not supported
  alert("No");
  
}

详细答案:

您必须在 Polymer 的网站上查看 this list

  • Template
  • HTML Imports
  • Custom Elements
  • Shadow DOM

必须支持这些功能:

function supportsTemplate() {
  return 'content' in document.createElement('template');
}

if (supportsTemplate()) {
  // Good to go!
} else {
  // Use old templating techniques or libraries.
}

function supportsImports() {
  return 'import' in document.createElement('link');
}

if (supportsImports()) {
  // Good to go!
} else {
  // Use other libraries/require systems to load files.
}

function supportsCustomElements() {
  return 'registerElement' in document;
}

if (supportsCustomElements()) {
  // Good to go!
} else {
  // Use other libraries to create components.
}

if(document.head.createShadowRoot) {
    // I can shadow DOM
} else {
    // I can't
}

在函数中:

 function supportsShadowDom() {
   return document.head.createShadowRoot;
 }

以前片段样式的未测试版本:

 function supportsShadowDom() {
   return 'createShadowRoot' in document;
 }

好的,在你实现了每个功能之后,你可以做这样的事情:

 if (supportsCustomElements() && supportsTemplate() && supportsImports() && supportsShadowDom()) {
   // Good to go!
 } else {
   // Use other libraries to create components.
 }

这是来自https://github.com/WebComponents/webcomponentsjs#browser-support的当前矩阵:

<table><thead>
<tr>
<th>Polyfill</th>
<th align="center">IE10</th>
<th align="center">IE11+</th>
<th align="center">Chrome*</th>
<th align="center">Firefox*</th>
<th align="center">Safari 7+*</th>
<th align="center">Chrome Android*</th>
<th align="center">Mobile Safari*</th>
</tr>
</thead><tbody>
<tr>
<td>Custom Elements</td>
<td align="center">~</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
</tr>
<tr>
<td>HTML Imports</td>
<td align="center">~</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
</tr>
<tr>
<td>Shadow DOM</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
</tr>
<tr>
<td>Templates</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
<td align="center">✓</td>
</tr>
</tbody></table>

这可能也很有趣: https://github.com/webcomponents/webcomponentsjs/issues/26