【问题标题】:What's the difference between feature detection, feature inference, and using the UA string [closed]特征检测、特征推断和使用UA字符串有什么区别[关闭]
【发布时间】:2013-11-20 19:17:43
【问题描述】:

我最近在一次工作面试中被问到这个问题,特别是关于 Javascript。我想知道正确的反应。

feature detectionfeature inference 和使用User agent 字符串之间到底有什么区别?

【问题讨论】:

  • 所有这些都可以在互联网上轻松查找,不是吗?这应该是第一步,不清楚的然后可能会成为一个很好的堆栈溢出问题。
  • 谷歌搜索时还有很多资源feature detection vs. user agent,比如Browser detection versus feature detection

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


【解决方案1】:

Feature detection 检查特征是否存在,例如:

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

Feature inference 像特征检测一样检查特征,但使用另一个函数,因为它假设它也将存在,例如:

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

检查UA string 是一种古老的做法,不应再使用。您不断更改 UA 检查,但从未从新实现的功能中受益,例如:

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

【讨论】:

    【解决方案2】:

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

    if('localStorage' in window)

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

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

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

    【讨论】:

      【解决方案3】:

      特征检测试图确定一个特征是否存在。例如,如果用户的浏览器支持 LocalStorage 或地理定位 API。

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

      特征推断假设因为您检测到了一项特征,您就可以使用其他特征。例如,如果您检测到地理定位 API,您可能会假设您的用户使用的是现代浏览器,因此现在 LocalStorage 可用。 假设通常是不好的,因此您最好对要利用的每个功能都使用功能检测,并在某个功能不可用时制定后备策略。即使用户拥有带有地理定位功能的现代浏览器,也不意味着他们会允许您的应用使用它,因此请相应地进行规划。

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

      你可以在 javascript 中访问它,类似于:

      navigator.userAgent
      

      【讨论】:

        猜你喜欢
        • 2017-01-01
        • 2011-06-03
        • 2017-04-15
        • 2011-10-13
        • 1970-01-01
        • 2011-11-28
        • 2018-05-08
        • 1970-01-01
        • 2021-01-12
        相关资源
        最近更新 更多