特征检测、特征推断和使用UA字符串有何区别?

23

最近在一次工作面试中,我被问到了这个问题,具体是关于Javascript的。我想知道正确的回答。

特性检测特性推断和使用User agent字符串之间到底有什么区别?


这些都可以在互联网上轻松查找,不是吗?这应该是第一步,如果仍然不清楚,那么可能会成为一个很好的Stack Overflow问题。 - Pekka
当在谷歌搜索“特性检测 vs. 用户代理”时,会有很多资源,例如浏览器检测 vs. 特性检测 - Pekka
3个回答

44

功能检测检查一个功能是否存在,例如:

if (window.XMLHttpRequest) {
    new XMLHttpRequest();
}

特性inference检查与特性检测类似,但使用另一个函数,因为它假设该特性也将存在,例如:

if (document.getElementsByTagName) {
    element = document.getElementById(id);
}

检查UA字符串是一种过时的做法,不应再使用。您不断更改UA检查,并且从新实施的功能中永远不会受益,例如:

if (navigator.userAgent.indexOf("MSIE 7") > -1){
    //do something
}

6

功能检测:实际上是检查功能是否存在

if('localStorage' in window)

功能推断:如果x存在,则我们可以假设y也存在

if('localStorage' in window){
   window.sessionStorage.setItem("this-should-exist-too", 1);
}

如果你依赖于用户代理,那么你需要拥有一个地图,列出浏览器 X 支持的功能 Y。

1
特征检测是尝试确定一个功能是否存在。例如,如果用户的浏览器支持LocalStorage或地理位置API。
if (navigator.geolocation) { 
    // geolocation possible.. do some stuff
}

特性推断是假设因为您检测到了一个特性,您就可以使用其他特性。例如,如果您检测到地理位置API,您可能会假设您的用户正在使用现代浏览器,因此现在可以使用LocalStorage。通常情况下这样做是不好的,因此您最好为要利用的每个功能使用特性检测,并在某些功能不可用时设置备用策略。即使用户有支持地理位置的现代浏览器,也并不意味着他们会允许您的应用程序使用它,因此请做好计划。
用户代理字符串只是读取每个浏览器发送的愚蠢的小字符串,然后将该字符串与一些已知的目标浏览器进行比较。通常,这是一种非常旧的方法,很容易伪造,因此您必须有一个非常特定的原因才能想要采用这种方法(可能在负载测试环境或其他方面)。请参阅有关此主题的维基百科http://en.wikipedia.org/wiki/User_agent 您可以通过类似以下javascript代码访问它:
navigator.userAgent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接