功能检测,功能推断和使用UA字符串之间的区别是什么

时间:2013-11-20 19:17:44

标签: javascript user-agent browser-feature-detection

我最近在求职面试中被问到这个问题,特别是围绕Javascript。我想知道正确的回应。

feature detectionfeature inference与使用User agent字符串之间究竟有什么区别?

3 个答案:

答案 0 :(得分:35)

Feature detection检查某个功能是否存在,例如:

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

功能inference检查功能就像功能检测一样,但是使用另一个功能,因为假设它也会存在,例如:

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

检查UA string是一种古老的做法,不应再使用了。您不断更改UA检查,并且永远不会受益于新实现的功能,例如:

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

答案 1 :(得分:5)

特征检测:实际检查特征是否存在

if('localStorage' in window)

特征推断:如果x存在,我们可以假设y存在

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

如果您依赖用户代理,那么您必须拥有浏览器X支持功能Y

的地图

答案 2 :(得分:1)

功能检测正在尝试确定某个功能是否存在。例如,如果用户的浏览器支持LocalStorage或地理位置API。

if (navigator.geolocation) { 
    // geolocation possible.. do some stuff
}

功能推断假设因为您检测到一个可以使用其他功能的功能。例如,如果您检测到地理定位API,则可能假设您的用户位于现代浏览器上,因此现在可以使用LocalStorage。 假设通常很糟糕,因此您只想对要利用的每项功能使用功能检测,并且在功能不可用时采用后备策略,这样做会更好。即使用户拥有带有地理位置的现代浏览器,也不意味着他们会允许您的应用使用它,因此请进行相应的规划。

用户代理字符串只是读取每个浏览器发送的愚蠢的小字符串,然后您可以将该字符串与您要定位的某些已知浏览器进行比较。一般来说,这是一种超级旧的做事方式,很容易被欺骗,所以你必须有一个非常具体的理由想要走这条路(可能在负载测试环境或其他东西)。请参阅主题http://en.wikipedia.org/wiki/User_agent

的Wiki

您可以使用类似于:

的javascript访问它
navigator.userAgent