ModernDesigner
ModernDesigner

Reputation: 7707

I keep getting the wrong output

I've created a userAgent sniffing javascript application (for experimental/learning purposes only) and I'm almost finished. But, for the $browser.version, I'm getting the whole userAgent string. I've google'd and google'd and cannot find the answer. Here's my code:

// 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)
    }
}

So in my HTML, I'm doing:

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

But my output in chrome is:

[JavaScript Alert]:

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)

But I want, obviously "Chrome 22" or "Chrome 22.0.1229.91"

Upvotes: 0

Views: 140

Answers (2)

aquinas
aquinas

Reputation: 23796

Your code doesn't make much sense to me as it stands. You have to use things like versionOFfset, etc. Also, note that doing something like this: ua.substring(versionOffset + 8) will return the entire string starting from versionOffset+8. So, since you never actually SET versionOffset, it it is undefined, so doing: versionOffset+8 returns NaN, JS helpfully ignores that and decides to just substitute a zero for NaN (basically), so you end up with the entire ua string being returned. Here's a fiddle that may be closer to what you're looking for:

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(" "))
    }
}

See how I set versionOffset in the if statement, and then I look for the first " " after the version. This is NOT meant to be used in the real world, but like you said, you're just trying to learn.

Upvotes: 0

enhzflep
enhzflep

Reputation: 13099

This fixes it - 2digit version number returned.

You need to set the versionOffset, as has already been mentioned.

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)
    }
}

Upvotes: 1

Related Questions