可能重复:
浏览器检测与特征检测
我一直在阅读有关特征检测的内容(使用 Google/Wikipedia/Docs),但不太了解它。弹出一些问题
- 为什么需要特征检测。我们不能只检测浏览器并为其编写代码吗?
- 进行特征检测的不同方法。最好的?
- 你能给我一个实用的真实世界例子,其中特征检测起作用。我们如何处理旧浏览器以及如何在其中复制相同的功能>
可能重复:
浏览器检测与特征检测
我一直在阅读有关特征检测的内容(使用 Google/Wikipedia/Docs),但不太了解它。弹出一些问题
为什么需要特征检测。我们不能只检测浏览器并为其编写代码吗?
不,很快你的每个浏览器所做的事情的列表就会过时,而且它本质上是不完整的。(三年前的黑莓浏览器是否支持输入中的占位符文本?我不知道,我也不需要关心。)例如,它曾经是 IE 没有addEventListener
. 现在确实如此。如果你开始一直检测到浏览器版本级别,那么当新版本出现时你会怎么做?这是维护的噩梦。
进行特征检测的不同方法。最好的?
没有单一的特征检测,它取决于特征。您可以在此页面上找到大量功能检测列表。还有像Modernizr这样的库可以为您进行特征检测。
你能给我一个实用的真实世界例子,其中特征检测起作用。我们如何处理旧浏览器以及如何在其中复制相同的功能>
当然。我在上面给了你两个,让我们深入研究一下(以相反的顺序)。
addEventListener
:这在不使用 jQuery、YUI 等库的代码中很常见:
if (elm.addEventListener) {
// Standard
elm.addEventListener("click", myClickHandler, false);
}
else if (elm.attachEvent) {
// IE fallback
elm.attachEvent("onclick", myClickHandler);
}
上面代码的好处在于,当 IE9 出现并拥有addEventListener
(在标准模式下)时,代码就可以工作了。无需更新数据库即可说“IE9 现在拥有它”。
或者输入字段中有占位符文本,例如:
<input type="text" name="firstName" placeholder="First name">
当浏览器不支持占位符文本时,它们就没有placeholder
元素的属性;当他们这样做时,他们会这样做。所以这个特性——检测浏览器是否支持占位符:
if ('placeholder' in document.createElement('input')) {
// Supports the placeholders
}
else {
// Doesn't, need to do something
}
如果没有,你可能会连接代码来自己做。我在我的 place5 插件中执行此操作,该插件是此功能的 polyfill。
一些答案,但像往常一样开放讨论:)
1)要回答这个问题,只需想想你有多少不同的浏览器及其版本......如果你想支持尽可能多的浏览器,你需要为每个浏览器编写不同的代码......并且使用移动浏览,数字加起来。具有“检测”功能的能力将只允许您编写两段代码,一段用于启用该功能的浏览器,另一段用于其他。
2)这当然是主观的。我使用Modernizr
3) 查看 Modernizr 可以检测到的功能,您会看到。例如,如果您想启用地理定位客户端,最好的方法是使用功能检测库,而不是保留您自己的浏览器特定代码数据库(这与问题 1 相关)。通常,为了覆盖未实现的功能,您可以在 if-then-else 中编写自己的代码或使用所谓的 poly-fill,您可以在此处阅读有关它的信息。基本上,它们是实现旧浏览器中不存在的功能的代码片段。美妙之处在于它们是完全透明的,您只需使用它们,而不关心它们是使用真正的实现还是回退到变通方法。sessionStorage的示例值得一读。
if (window.XMLHttpRequest) { alert('it supports the XML HTTP requests!'); }
. 不同的功能可能需要不同的方法来检查它们。false
,您将退回创建 ActiveX 对象(如果支持 - 它在旧 IE 版本上)。或者您可能会向用户显示一条消息,说明他们将无法在您的应用程序中执行某些操作。