2012-11-06 39 views
3

可能重复:
Browser detection versus feature detection支持没有这样的浏览器新功能

我一直在阅读有关(使用谷歌/维基/文档)功能检测,但不完全得到它的一个抓地力。弹出一些问题

  1. 为什么需要特征检测。我们不能只检测浏览器并为其编写代码吗?
  2. 不同的特征检测方法。最好的都是?
  3. 你可以给我一个实际的现实世界的例子,特征检测的作品。我们如何处理旧浏览器以及如何在其中复制相同的功能>
+0

** 2:**没有多种方法可以进行功能检测。只有一个:'if(featureExists){/ * use feature * /} else {/ * fallback solution * /}'。 –

+0

http://msdn.microsoft.com/en-us/magazine/hh475813.aspx –

+0

@ŠimeVidas - 有。您无法通过这种方式真正检查CSS功能。 –

回答

4

为什么需要Feature Detection。我们不能只检测浏览器并为其编写代码吗?

不,很快你的列表显示每个浏览器所做的更新都会过时,而且它的本质也是不完整的。 (三年前的黑莓浏览器是否支持占位符文本输入?我不知道,也不需要关心。)例如,它曾经是IE没有addEventListener。现在确实如此。如果您开始一直检测到浏览器版本级别,那么当新版本发布时,您会做什么?这是一个维护噩梦。

不同的特征检测方法。最好的都是?

有没有单一的功能检测,它取决于功能。你可以找到一个伟大的功能检测列表on this page。还有像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。

+0

谢谢你这个真棒回答! –

+0

@TomHodder:很高兴!很高兴这有帮助。 –

+0

如果你很难与JSLint抱怨使用'in'进行属性检查,你可以使用'eval()'(如果你已经告诉JSLint允许它)或者'new函数(...)'。 –

0
  1. 因为浏览器可能伪造自己的身份。另外,因为你不可能知道所有可能的浏览器的功能。
  2. 取决于功能。如果它是一种JavaScript方法,通常只需像这样检查它:if (window.XMLHttpRequest) { alert('it supports the XML HTTP requests!'); }。不同的功能可能需要不同的方法来检查它们。
  3. 使用与之前相同的示例 - 如果检查返回false,您将回退创建ActiveX对象(如果支持 - 它位于较旧的IE版本上)。或者您可能会向用户显示一条消息,说明他们无法在应用程序中执行某些操作。
0

一些答案,但公开讨论像往常一样:)

1)要回答这个问题,只是想想你有多少个不同的浏览器及其版本在野外......你需要写如果你想支持尽可能多的浏览器,每个代码都有一个不同的代码片段......并且通过移动浏览,这些数字会加起来。具有“检测”功能的功能将允许您只写入两段代码,一段用于启用该功能的浏览器,另一段用于其他页面。

2)这当然是主观的。我用Modernizr

3)看看Modernizr可以检测到的功能,你会看到。例如,如果要启用地理定位客户端,最好的方法是使用功能检测库,而不是保留自己的浏览器特定代码数据库(这与问题1相关)。通常,为了涵盖未实现的功能,您可以在if-then-else中编写自己的代码或使用所谓的多填充,您可以阅读它here。基本上它们是实现旧版浏览器中不存在功能的代码片断。美丽之处在于它们是完全透明的,你只需使用它们,并不在乎它们是使用真正的实现还是回到解决方法。 sessionStorage的示例值得一读。