【问题标题】:I keep getting the wrong output我不断得到错误的输出
【发布时间】:2012-09-27 04:52:03
【问题描述】:

我创建了一个 userAgent 嗅探 javascript 应用程序(用于实验/学习目的),我快完成了。但是,对于 $browser.version,我得到了整个 userAgent 字符串。我已经 google'd 和 google'd 并找不到答案。这是我的代码:

// contemplate new $browser module
var $browser, versionOffset, ua = navigator.userAgent;

if(ua.toLowerCase().indexOf('opera') > -1) {
    $browser = {
        name: "Opera",
        engine: "Presto",
        prefix: "-o-",
        publisher: "Opera Software ASA",
        version: ua.substring(versionOffset + 6)
    }
}

else if(ua.toLowerCase().indexOf('msie') > -1) {
        $browser = {
        name: "Internet Explorer",
        engine: "Trident",
        prefix: "-ms-",
        publisher: "Microsoft",
        version: ua.substring(versionOffset + 5)
    }
}

else if(ua.toLowerCase().indexOf('chrome') > -1) {
    $browser = {
        name: "Chrome",
        engine: "WebKit",
        prefix: "-webkit-",
        publisher: "Google Inc.",
        version: ua.substring(versionOffset + 7)
    }
}

else if(ua.toLowerCase().indexOf('safari') > -1) {
    $browser = {
        name: "Safari",
        engine: "WebKit",
        prefix: "-webkit-",
        publisher: "Apple Computer Inc.",
        version: ua.substring(versionOffset + 8)
    }
}

else if(ua.toLowerCase().indexOf('firefox') > -1) {
    $browser = {
        name: "Firefox",
        engine: "Gecko",
        prefix: "-moz-",
        publisher: "Mozilla",
        version: ua.substring(versionOffset + 8)
    }
}

所以在我的 HTML 中,我正在做:

<script>
    alert($browser.name + " " + $browser.version);
</script>

但我在 chrome 中的输出是:

[JavaScript 警报]:

Chrome ($browser.name)
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.91 Safari/537.4 ($browser.version)

但我想要,显然是“Chrome 22”或“Chrome 22.0.1229.91”

【问题讨论】:

  • 什么是versionOffset,你永远不会在任何地方设置它。
  • 好吧,经过研究,似乎我应该使用一个占位符变量来作为基础,所以我将它命名为 versionOffset,我应该不这样做吗?

标签: javascript html google-chrome browser user-agent


【解决方案1】:

这修复了它 - 返回 2 位版本号。

如前所述,您需要设置 versionOffset。

else if(ua.toLowerCase().indexOf('chrome') > -1) 
{
    versionOffset = ua.toLowerCase().indexOf('chrome');

    $browser = {
        name: "Chrome",
        engine: "WebKit",
        prefix: "-webkit-",
        publisher: "Google Inc.",
        version: ua.substr(versionOffset+7, 2)
    }
}

【讨论】:

    【解决方案2】:

    您的代码对我来说没有多大意义。您必须使用诸如 versionOFFset 之类的东西。另外,请注意执行以下操作:ua.substring(versionOffset + 8) 将返回从 versionOffset+8 开始的整个字符串。因此,由于您实际上从未设置过 versionOffset,因此它是未定义的,因此这样做: versionOffset+8 返回 NaN,JS 会帮助忽略它并决定仅用零替换 NaN(基本上),因此您最终会得到整个 ua 字符串回来。这是一个可能更接近您正在寻找的小提琴:

    http://jsfiddle.net/WFEZW/

    else if((versionOffset = ua.toLowerCase().indexOf('chrome')) > -1) {
        $browser = {
            name: "Chrome",
            engine: "WebKit",
            prefix: "-webkit-",
            publisher: "Google Inc.",
            version: ua.substring(versionOffset + 7).substring(0, ua.indexOf(" "))
        }
    }
    

    看看我是如何在 if 语句中设置 versionOffset 的,然后在版本之后寻找第一个“”。这并不意味着在现实世界中使用,但就像你说的,你只是想学习。

    【讨论】:

    • 是的,我看到了它是如何返回用户代理的其余部分的,当我看到这个时,我正处于寻找解决方法的边缘。谢谢!是的,我知道这根本不可靠或根本不可信,但我一直在使用 jQuery,而且我现在才刚刚开始学习 Javascript 的基础。谢谢!
    • 嗯,但在 Opera (9) 中它返回 Opera 9.80 (Wind 。即使它应该用空格 (" ") 修剪它
    • 当然。这就是浏览器嗅探没有完成的原因。 jQuery 甚至不再这样做了:api.jquery.com/jQuery.browser
    • 啊,是的。这太糟糕了。一开始似乎是个好主意。嗯,那是晚上进入 JavaScript 世界的一次有趣的小冒险。哈哈。也许下次我会尝试分解特征检测。感谢您的回答!
    猜你喜欢
    • 2012-04-26
    • 2012-01-24
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2021-08-30
    • 2013-12-25
    相关资源
    最近更新 更多