【问题标题】:Browser sniffing浏览器嗅探
【发布时间】:2011-09-02 08:06:01
【问题描述】:

我知道浏览器嗅探不是为多个浏览器设计网站的正确方法。然而,我的问题与设计一个对每个浏览器都表现良好的网站无关。

如果浏览器是 Google Chrome 或 Firefox 4+,我想为用户提供将网站安装为 web 应用程序的能力,如果是 Opera,则作为小部件,如果是 Safari,则作为扩展程序......等等

基本上,我想通过提供这种安装的按钮滑入一个 div。如果浏览器是 Safari,则显示 webapp 解决方案是没有用的,因为 Safari 不支持它。

那么我该如何以一种好的方式做到这一点呢?

我发现这是基于功能而不是用户代理

Safe feature-based way for detecting Google Chrome with Javascript?

var is = {
  ff: window.globalStorage,
  ie: document.all && !window.opera,
  ie6: !window.XMLHttpRequest,
  ie7: document.all && window.XMLHttpRequest && !XDomainRequest && !window.opera,
  ie8: document.documentMode==8,
  opera: Boolean(window.opera),
  chrome: Boolean(window.chrome),
  safari: window.getComputedStyle && !window.globalStorage && !window.opera
}

它似乎可以满足我的需求,而且很短,不笨重,或多或少是安全的

【问题讨论】:

  • is.safari == true 在 Chrome 中(或者我需要 Chrome 升级)。
  • 你为什么要保证欺骗安全?你真的考虑过吗?人为什么会造谣?我从来不需要,但如果有人想在 Firefox 中下载你的 Opera 小部件,让他们吧,他们可能有正当理由。如果实际上是他们自己做的事情不起作用,我认为欺骗者不会抱怨。
  • 那段代码有几个错误。你能更明确一点吗?您希望定位哪些浏览器版本?
  • Opera、Safari、Firefox、Chrome(最新版本)
  • 下次使用@knu 我会回答你的问题。

标签: javascript browser browser-detection


【解决方案1】:

您可以尝试:BrowserHawk, (http://www.cyscape.com/showbrow.asp) 浏览器在服务器端检查哪个。理论上,这将在确定向最终用户显示什么时减少浏览器端的处理。但是,我不认为这是免费的。他们的特色客户包括雅虎、美国在线、思科、微软和 Sun。因此,这仅适用于大量期望最终用户访问该站点的生产用途。

【讨论】:

    【解决方案2】:

    我从不理解仅使用导航器对象之外的属性的问题:

    <script>
        for(var item in navigator)
        {
            document.write('navigator.' + item + ': ' + navigator[item] + '<br>');
        }
    </script>
    

    他们navigator.userAgent不可靠,但你研究一下,我认为它可以与navigator.appNamenavigator.vendor结合使用,可靠性很高。


    更新:2013 年 3 月

    你必须直接测试你想知道的东西,如果你试图推断它,你做错了。

    例如。如果你想使用一个特性,直接测试它,不要假设如果document.all那么你可以使用document.uniqueID。直接测试document.uniqueID

    每个人都知道使用navigator.userAgent 来确定是否可以使用window.localStorage 很疯狂,但他们没有意识到ie7: document.all &amp;&amp; window.XMLHttpRequest &amp;&amp; !XDomainRequest &amp;&amp; !window.opera 也在反方向做同样的事情。

    如果您真的想知道用户代理是什么,那么不幸的是,您只能使用navigator 对象。

    用户代理字符串欺骗不是问题,反正不是你的问题。

    【讨论】:

    • 这可以被欺骗,这也是它不可靠的部分原因
    • @Stofke:一切都可以被篡改。你只需要一个像样的十六进制编辑器就可以了。您的所有检测机制都可能被破坏。我的建议是在这种情况下不要担心少数人。
    • 问题本身中当前说明的方法,它们是否可篡改?我的意思是,它们不依赖于用户代理或其他东西,它们依赖于特定浏览器支持的内置功能。它们如何被篡改?
    • @Cupidvogel:好的,让我们忽略浏览器内置功能支持可能会发生变化的事实。我们以window.globalStorage 为例。可以编写一个浏览器扩展来为任何浏览器中的所有页面定义它,所以如果定义了window.globalStorage,那并不一定保证浏览器是 Firefox。
    • 什么?用户可以为他的浏览器的所有页面添加 JS 扩展吗?太可怕了!
    【解决方案3】:

    不要担心什么是正确的。做有效的事;在这种情况下,也许浏览器嗅探是最好的或唯一的好选择。

    【讨论】:

    • 这就是我所说的好 ;-) 有效且面向未来的东西。
    • 你是对的,其他浏览器可能支持某些功能,从而使基于功能的解决方案也不可靠。但这是我现在能想到的最好的了
    【解决方案4】:

    看看jQuery.browser:http://api.jquery.com/jQuery.browser/

    $.browser 属性提供 有关 Web 浏览器的信息 正在访问该页面,由 浏览器本身。它包含标志 对于四个最流行的 浏览器类(Internet Explorer、 Mozilla、Webkit 和 Opera)以及 版本信息。

    可用的标志是:

    webkit(从 jQuery 1.4 开始)safari (已弃用)opera msie mozilla This 财产立即可用。它 因此使用它是安全的 判断是否调用 $(文档).ready()。 $.browser 属性在 jQuery 1.3 中被弃用, 其功能可能会移至 未来团队支持的插件 jQuery的发布。

    因为 $.browser 使用 navigator.userAgent 来确定 平台,容易受到欺骗 由用户或虚假陈述 浏览器本身。它总是最好的 避免特定于浏览器的代码 尽可能完全。 $.support 属性可用于检测 支持特定功能而不是 而不是依赖 $.browser。

    【讨论】:

    • 很好,因为我已经使用了 Jquery,但它很容易被欺骗