【问题标题】:How to find the operating system details using JavaScript?如何使用 JavaScript 查找操作系统详细信息?
【发布时间】:2012-03-19 19:52:01
【问题描述】:

如何使用 JavaScript 找到操作系统名称和操作系统版本?

【问题讨论】:

    标签: javascript operating-system user-agent


    【解决方案1】:

    我开始编写一个脚本来读取可以在Fiddle 上测试的操作系统和浏览器版本。随意使用和扩展。
    重大变化:
    自 2020 年 9 月以来,新的 Edge 被检测到。所以“Microsoft Edge”是基于 Chromium 的新版本,而旧 Edge 现在被检测为“Microsoft Legacy Edge”!

    /**
     * JavaScript Client Detection
     * (C) viazenetti GmbH (Christian Ludwig)
     */
    (function (window) {
        {
            var unknown = '-';
    
            // screen
            var screenSize = '';
            if (screen.width) {
                width = (screen.width) ? screen.width : '';
                height = (screen.height) ? screen.height : '';
                screenSize += '' + width + " x " + height;
            }
    
            // browser
            var nVer = navigator.appVersion;
            var nAgt = navigator.userAgent;
            var browser = navigator.appName;
            var version = '' + parseFloat(navigator.appVersion);
            var majorVersion = parseInt(navigator.appVersion, 10);
            var nameOffset, verOffset, ix;
    
            // Opera
            if ((verOffset = nAgt.indexOf('Opera')) != -1) {
                browser = 'Opera';
                version = nAgt.substring(verOffset + 6);
                if ((verOffset = nAgt.indexOf('Version')) != -1) {
                    version = nAgt.substring(verOffset + 8);
                }
            }
            // Opera Next
            if ((verOffset = nAgt.indexOf('OPR')) != -1) {
                browser = 'Opera';
                version = nAgt.substring(verOffset + 4);
            }
            // Legacy Edge
            else if ((verOffset = nAgt.indexOf('Edge')) != -1) {
                browser = 'Microsoft Legacy Edge';
                version = nAgt.substring(verOffset + 5);
            } 
            // Edge (Chromium)
            else if ((verOffset = nAgt.indexOf('Edg')) != -1) {
                browser = 'Microsoft Edge';
                version = nAgt.substring(verOffset + 4);
            }
            // MSIE
            else if ((verOffset = nAgt.indexOf('MSIE')) != -1) {
                browser = 'Microsoft Internet Explorer';
                version = nAgt.substring(verOffset + 5);
            }
            // Chrome
            else if ((verOffset = nAgt.indexOf('Chrome')) != -1) {
                browser = 'Chrome';
                version = nAgt.substring(verOffset + 7);
            }
            // Safari
            else if ((verOffset = nAgt.indexOf('Safari')) != -1) {
                browser = 'Safari';
                version = nAgt.substring(verOffset + 7);
                if ((verOffset = nAgt.indexOf('Version')) != -1) {
                    version = nAgt.substring(verOffset + 8);
                }
            }
            // Firefox
            else if ((verOffset = nAgt.indexOf('Firefox')) != -1) {
                browser = 'Firefox';
                version = nAgt.substring(verOffset + 8);
            }
            // MSIE 11+
            else if (nAgt.indexOf('Trident/') != -1) {
                browser = 'Microsoft Internet Explorer';
                version = nAgt.substring(nAgt.indexOf('rv:') + 3);
            }
            // Other browsers
            else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
                browser = nAgt.substring(nameOffset, verOffset);
                version = nAgt.substring(verOffset + 1);
                if (browser.toLowerCase() == browser.toUpperCase()) {
                    browser = navigator.appName;
                }
            }
            // trim the version string
            if ((ix = version.indexOf(';')) != -1) version = version.substring(0, ix);
            if ((ix = version.indexOf(' ')) != -1) version = version.substring(0, ix);
            if ((ix = version.indexOf(')')) != -1) version = version.substring(0, ix);
    
            majorVersion = parseInt('' + version, 10);
            if (isNaN(majorVersion)) {
                version = '' + parseFloat(navigator.appVersion);
                majorVersion = parseInt(navigator.appVersion, 10);
            }
    
            // mobile version
            var mobile = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(nVer);
    
            // cookie
            var cookieEnabled = (navigator.cookieEnabled) ? true : false;
    
            if (typeof navigator.cookieEnabled == 'undefined' && !cookieEnabled) {
                document.cookie = 'testcookie';
                cookieEnabled = (document.cookie.indexOf('testcookie') != -1) ? true : false;
            }
    
            // system
            var os = unknown;
            var clientStrings = [
                {s:'Windows 10', r:/(Windows 10.0|Windows NT 10.0)/},
                {s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/},
                {s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/},
                {s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/},
                {s:'Windows Vista', r:/Windows NT 6.0/},
                {s:'Windows Server 2003', r:/Windows NT 5.2/},
                {s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/},
                {s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/},
                {s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/},
                {s:'Windows 98', r:/(Windows 98|Win98)/},
                {s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/},
                {s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},
                {s:'Windows CE', r:/Windows CE/},
                {s:'Windows 3.11', r:/Win16/},
                {s:'Android', r:/Android/},
                {s:'Open BSD', r:/OpenBSD/},
                {s:'Sun OS', r:/SunOS/},
                {s:'Chrome OS', r:/CrOS/},
                {s:'Linux', r:/(Linux|X11(?!.*CrOS))/},
                {s:'iOS', r:/(iPhone|iPad|iPod)/},
                {s:'Mac OS X', r:/Mac OS X/},
                {s:'Mac OS', r:/(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},
                {s:'QNX', r:/QNX/},
                {s:'UNIX', r:/UNIX/},
                {s:'BeOS', r:/BeOS/},
                {s:'OS/2', r:/OS\/2/},
                {s:'Search Bot', r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/}
            ];
            for (var id in clientStrings) {
                var cs = clientStrings[id];
                if (cs.r.test(nAgt)) {
                    os = cs.s;
                    break;
                }
            }
    
            var osVersion = unknown;
    
            if (/Windows/.test(os)) {
                osVersion = /Windows (.*)/.exec(os)[1];
                os = 'Windows';
            }
    
            switch (os) {
                case 'Mac OS':
                case 'Mac OS X':
                case 'Android':
                    osVersion = /(?:Android|Mac OS|Mac OS X|MacPPC|MacIntel|Mac_PowerPC|Macintosh) ([\.\_\d]+)/.exec(nAgt)[1];
                    break;
    
                case 'iOS':
                    osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
                    osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
                    break;
            }
            
            // flash (you'll need to include swfobject)
            /* script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js" */
            var flashVersion = 'no check';
            if (typeof swfobject != 'undefined') {
                var fv = swfobject.getFlashPlayerVersion();
                if (fv.major > 0) {
                    flashVersion = fv.major + '.' + fv.minor + ' r' + fv.release;
                }
                else  {
                    flashVersion = unknown;
                }
            }
        }
    
        window.jscd = {
            screen: screenSize,
            browser: browser,
            browserVersion: version,
            browserMajorVersion: majorVersion,
            mobile: mobile,
            os: os,
            osVersion: osVersion,
            cookies: cookieEnabled,
            flashVersion: flashVersion
        };
    }(this));
    
    alert(
        'OS: ' + jscd.os +' '+ jscd.osVersion + '\n' +
        'Browser: ' + jscd.browser +' '+ jscd.browserMajorVersion +
          ' (' + jscd.browserVersion + ')\n' + 
        'Mobile: ' + jscd.mobile + '\n' +
        'Flash: ' + jscd.flashVersion + '\n' +
        'Cookies: ' + jscd.cookies + '\n' +
        'Screen Size: ' + jscd.screen + '\n\n' +
        'Full User Agent: ' + navigator.userAgent
    );
    

    【讨论】:

    • @akapelko 不幸的是,微软对多个操作系统使用相同的版本号(请参阅msdn.microsoft.com/en-us/library/windows/desktop/…
    • 我受到@Ludwig 代码的启发,在 GitHub 上创建了一个开源项目。 github.com/keithws/browser-report
    • 添加了“边缘”检测
    • @skwidbreth 谢谢。添加了 Crome OS 并包含了强化的 Linux 检测(以防有人更改顺序)
    • 关于10这一行中的号码osVersion = /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];next macOS release11。所以应该更新代码。
    【解决方案2】:

    如果您使用

    列出window.navigator的所有属性

    console.log(navigator);

    你会看到这样的东西

    # platform = Win32
    # appCodeName = Mozilla
    # appName = Netscape
    # appVersion = 5.0 (Windows; en-US)
    # language = en-US
    # mimeTypes = [object MimeTypeArray]
    # oscpu = Windows NT 5.1
    # vendor = Firefox
    # vendorSub = 1.0.7
    # product = Gecko
    # productSub = 20050915
    # plugins = [object PluginArray]
    # securityPolicy =
    # userAgent = Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7
    # cookieEnabled = true
    # javaEnabled = function javaEnabled() { [native code] }
    # taintEnabled = function taintEnabled() { [native code] }
    # preference = function preference() { [native code] }
    

    请注意,oscpu 属性为您提供 Windows 版本。另外,你应该知道:

    'Windows 3.11' => 'Win16',
    'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)',
    'Windows 98' => '(Windows 98)|(Win98)',
    'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)',
    'Windows XP' => '(Windows NT 5.1)|(Windows XP)',
    'Windows Server 2003' => '(Windows NT 5.2)',
    'Windows Vista' => '(Windows NT 6.0)',
    'Windows 7' => '(Windows NT 6.1)',
    'Windows 8' => '(Windows NT 6.2)|(WOW64)',
    'Windows 10' => '(Windows 10.0)|(Windows NT 10.0)',
    'Windows NT 4.0' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)',
    'Windows ME' => 'Windows ME',
    'Open BSD' => 'OpenBSD',
    'Sun OS' => 'SunOS',
    'Linux' => '(Linux)|(X11)',
    'Mac OS' => '(Mac_PowerPC)|(Macintosh)',
    'QNX' => 'QNX',
    'BeOS' => 'BeOS',
    'OS/2' => 'OS/2',
    'Search Bot'=>'(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves/Teoma)|(ia_archiver)'
    

    【讨论】:

    • 当然(Windows NT 6.2)见此链接bitbucket.org/cat_in_136/configuration-mania/src/…
    • 当我在 Windows 7 上的 4 种主要浏览器上测试时,oscpu 对我的工作不一致。@Ludwig 的解决方案始终如一。
    • window.navigator.oscpu 在 chrome 中未定义
    • 我也在 Chrome 中观察 window.navigator.oscpu undefined,所以这个解决方案没有多大帮助。
    • window.navigator.platform 已经在 Chrome 中安装了操作系统。
    【解决方案3】:
    var OSName = "Unknown";
    if (window.navigator.userAgent.indexOf("Windows NT 10.0")!= -1) OSName="Windows 10";
    if (window.navigator.userAgent.indexOf("Windows NT 6.3") != -1) OSName="Windows 8.1";
    if (window.navigator.userAgent.indexOf("Windows NT 6.2") != -1) OSName="Windows 8";
    if (window.navigator.userAgent.indexOf("Windows NT 6.1") != -1) OSName="Windows 7";
    if (window.navigator.userAgent.indexOf("Windows NT 6.0") != -1) OSName="Windows Vista";
    if (window.navigator.userAgent.indexOf("Windows NT 5.1") != -1) OSName="Windows XP";
    if (window.navigator.userAgent.indexOf("Windows NT 5.0") != -1) OSName="Windows 2000";
    if (window.navigator.userAgent.indexOf("Mac")            != -1) OSName="Mac/iOS";
    if (window.navigator.userAgent.indexOf("X11")            != -1) OSName="UNIX";
    if (window.navigator.userAgent.indexOf("Linux")          != -1) OSName="Linux";
    

    【讨论】:

    • 你不应该使用第二次检查中的else if 吗?
    【解决方案4】:

    @Ludwig 的解决方案非常出色。一些修复(与操作系统无关,我无法对他的原始帖子发表评论,因为这太长了):

    1. IE 11 不再将自己标识为 MS IE。
    2. IOS 上的 Chrome 将自己伪装成 Safari

    他们在这里:

    (function (window) {
        {
        /* test cases
            alert(
                'browserInfo result: OS: ' + browserInfo.os +' '+ browserInfo.osVersion + '\n'+
                    'Browser: ' + browserInfo.browser +' '+ browserInfo.browserVersion + '\n' +
                    'Mobile: ' + browserInfo.mobile + '\n' +
                    'Cookies: ' + browserInfo.cookies + '\n' +
                    'Screen Size: ' + browserInfo.screen
            );
        */
            var unknown = 'Unknown';
    
            // screen
            var screenSize = '';
            if (screen.width) {
                width = (screen.width) ? screen.width : '';
                height = (screen.height) ? screen.height : '';
                screenSize += '' + width + " x " + height;
            }
    
            //browser
            var nVer = navigator.appVersion;
            var nAgt = navigator.userAgent;
            var browser = navigator.appName;
            var version = '' + parseFloat(navigator.appVersion);
            var majorVersion = parseInt(navigator.appVersion, 10);
            var nameOffset, verOffset, ix;
    
            // Opera
            if ((verOffset = nAgt.indexOf('Opera')) != -1) {
                browser = 'Opera';
                version = nAgt.substring(verOffset + 6);
                if ((verOffset = nAgt.indexOf('Version')) != -1) {
                    version = nAgt.substring(verOffset + 8);
                }
            }
            // MSIE
            else if ((verOffset = nAgt.indexOf('MSIE')) != -1) {
                browser = 'Microsoft Internet Explorer';
                version = nAgt.substring(verOffset + 5);
            }
    
            //IE 11 no longer identifies itself as MS IE, so trap it
            //http://stackoverflow.com/questions/17907445/how-to-detect-ie11
            else if ((browser == 'Netscape') && (nAgt.indexOf('Trident/') != -1)) {
    
                browser = 'Microsoft Internet Explorer';
                version = nAgt.substring(verOffset + 5);
                if ((verOffset = nAgt.indexOf('rv:')) != -1) {
                    version = nAgt.substring(verOffset + 3);
                }
    
            }
    
            // Chrome
            else if ((verOffset = nAgt.indexOf('Chrome')) != -1) {
                browser = 'Chrome';
                version = nAgt.substring(verOffset + 7);
            }
            // Safari
            else if ((verOffset = nAgt.indexOf('Safari')) != -1) {
                browser = 'Safari';
                version = nAgt.substring(verOffset + 7);
                if ((verOffset = nAgt.indexOf('Version')) != -1) {
                    version = nAgt.substring(verOffset + 8);
                }
    
                // Chrome on iPad identifies itself as Safari. Actual results do not match what Google claims
                //  at: https://developers.google.com/chrome/mobile/docs/user-agent?hl=ja
                //  No mention of chrome in the user agent string. However it does mention CriOS, which presumably
                //  can be keyed on to detect it.
                if (nAgt.indexOf('CriOS') != -1) {
                    //Chrome on iPad spoofing Safari...correct it.
                    browser = 'Chrome';
                    //Don't believe there is a way to grab the accurate version number, so leaving that for now.
                }
            }
            // Firefox
            else if ((verOffset = nAgt.indexOf('Firefox')) != -1) {
                browser = 'Firefox';
                version = nAgt.substring(verOffset + 8);
            }
            // Other browsers
            else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
                browser = nAgt.substring(nameOffset, verOffset);
                version = nAgt.substring(verOffset + 1);
                if (browser.toLowerCase() == browser.toUpperCase()) {
                    browser = navigator.appName;
                }
            }
            // trim the version string
            if ((ix = version.indexOf(';')) != -1) version = version.substring(0, ix);
            if ((ix = version.indexOf(' ')) != -1) version = version.substring(0, ix);
            if ((ix = version.indexOf(')')) != -1) version = version.substring(0, ix);
    
            majorVersion = parseInt('' + version, 10);
            if (isNaN(majorVersion)) {
                version = '' + parseFloat(navigator.appVersion);
                majorVersion = parseInt(navigator.appVersion, 10);
            }
    
            // mobile version
            var mobile = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(nVer);
    
            // cookie
            var cookieEnabled = (navigator.cookieEnabled) ? true : false;
    
            if (typeof navigator.cookieEnabled == 'undefined' && !cookieEnabled) {
                document.cookie = 'testcookie';
                cookieEnabled = (document.cookie.indexOf('testcookie') != -1) ? true : false;
            }
    
            // system
            var os = unknown;
            var clientStrings = [
                {s:'Windows 3.11', r:/Win16/},
                {s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/},
                {s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/},
                {s:'Windows 98', r:/(Windows 98|Win98)/},
                {s:'Windows CE', r:/Windows CE/},
                {s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/},
                {s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/},
                {s:'Windows Server 2003', r:/Windows NT 5.2/},
                {s:'Windows Vista', r:/Windows NT 6.0/},
                {s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/},
                {s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/},
                {s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/},
                {s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},
                {s:'Windows ME', r:/Windows ME/},
                {s:'Android', r:/Android/},
                {s:'Open BSD', r:/OpenBSD/},
                {s:'Sun OS', r:/SunOS/},
                {s:'Linux', r:/(Linux|X11)/},
                {s:'iOS', r:/(iPhone|iPad|iPod)/},
                {s:'Mac OS X', r:/Mac OS X/},
                {s:'Mac OS', r:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},
                {s:'QNX', r:/QNX/},
                {s:'UNIX', r:/UNIX/},
                {s:'BeOS', r:/BeOS/},
                {s:'OS/2', r:/OS\/2/},
                {s:'Search Bot', r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/}
            ];
            for (var id in clientStrings) {
                var cs = clientStrings[id];
                if (cs.r.test(nAgt)) {
                    os = cs.s;
                    break;
                }
            }
    
            var osVersion = unknown;
    
            if (/Windows/.test(os)) {
                osVersion = /Windows (.*)/.exec(os)[1];
                os = 'Windows';
            }
    
            switch (os) {
                case 'Mac OS X':
                    osVersion = /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];
                    break;
    
                case 'Android':
                    osVersion = /Android ([\.\_\d]+)/.exec(nAgt)[1];
                    break;
    
                case 'iOS':
                    osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
                    osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
                    break;
    
            }
        }
    
        window.browserInfo = {
            screen: screenSize,
            browser: browser,
            browserVersion: version,
            mobile: mobile,
            os: os,
            osVersion: osVersion,
            cookies: cookieEnabled
        };
    }(this));
    

    【讨论】:

    • 我已经在此基础上启动了一个 github 存储库。 github.com/thorst/Browser。以最小化为目标,但有足够的覆盖范围。
    • 所以现在您所要做的就是在每台设备上的每个浏览器发布时不断更新它。我在任何地方都没有看到“Samsung SmartTV”。
    • @Ian Ippolito 这非常有帮助,非常感谢。我也想知道如何找到边缘浏览器及其版本。
    【解决方案5】:

    JavaScript 可以访问window.navigator.platform - 一个代表浏览器平台的字符串: https://developer.mozilla.org/en-US/docs/Web/API/NavigatorID/platform

    使用它来提取您需要(并且可以)的任何细节。请注意,不能保证客户端实际使用该平台,因为这可以通过多种方式轻松修改。

    【讨论】:

    • "此功能已从 Web 标准中删除。尽管某些浏览器可能仍支持它,但它正在被删除。请勿在旧项目或新项目中使用它。页面或 Web 应用程序使用它可能随时中断。”
    • @ConAntonakos 您能否为该声明提供参考?这个答案的 MDN 链接中没有提到这一点。
    • @Splaktar - 这太奇怪了。该消息肯定存在,但我发现它不再存在。我认为在 2016 年的某个时候它被考虑过?我也看到了这个问题(stackoverflow.com/questions/38506517/…),所以其他人也注意到了。感谢您的更新。
    • 我认为文档搞砸了,它仍然说它在葡萄牙语版本中已被弃用:developer.mozilla.org/pt-BR/docs/Web/API/NavigatorID/platform
    • 更新:我修复了葡萄牙语文档,并验证了英文文档确实在某些时候得到了更正。
    【解决方案6】:

    platform.js 似乎是一个很好的文件库来执行此操作。

    使用示例:

    // on IE10 x86 platform preview running in IE7 compatibility mode on Windows 7 64 bit edition
    platform.name; // 'IE'
    platform.version; // '10.0'
    platform.layout; // 'Trident'
    platform.os; // 'Windows Server 2008 R2 / 7 x64'
    platform.description; // 'IE 10.0 x86 (platform preview; running in IE 7 mode) on Windows Server 2008 R2 / 7 x64'
    
    // or on an iPad
    platform.name; // 'Safari'
    platform.version; // '5.1'
    platform.product; // 'iPad'
    platform.manufacturer; // 'Apple'
    platform.layout; // 'WebKit'
    platform.os; // 'iOS 5.0'
    platform.description; // 'Safari 5.1 on Apple iPad (iOS 5.0)'
    
    // or parsing a given UA string
    var info = platform.parse('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7.2; en; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 11.52');
    info.name; // 'Opera'
    info.version; // '11.52'
    info.layout; // 'Presto'
    info.os; // 'Mac OS X 10.7.2'
    info.description; // 'Opera 11.52 (identifying as Firefox 4.0) on Mac OS X 10.7.2'
    

    【讨论】:

      【解决方案7】:

      您可以使用这个javascript 函数来简单地检查用户的操作系统

        function getOS() {
        var userAgent = window.navigator.userAgent,
            platform = window.navigator.platform,
            macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'],
            windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'],
            iosPlatforms = ['iPhone', 'iPad', 'iPod'],
            os = null;
      
        if (macosPlatforms.indexOf(platform) !== -1) {
          os = 'Mac OS';
        } else if (iosPlatforms.indexOf(platform) !== -1) {
          os = 'iOS';
        } else if (windowsPlatforms.indexOf(platform) !== -1) {
          os = 'Windows';
        } else if (/Android/.test(userAgent)) {
          os = 'Android';
        } else if (!os && /Linux/.test(platform)) {
          os = 'Linux';
        }
      
        return os;
      }
      
      alert(getOS());
      

      【讨论】:

      • navigator.platform 在 typescript 中已弃用
      【解决方案8】:

      您可以在navigator 对象中找到操作系统名称和版本,正如其他人所回答的那样。查找此信息的标准跨浏览器位置位于 navigator.userAgent 属性中。但是,用户代理字符串因操作系统和浏览器而异。

      因此,我创建了一个脚本来封装此逻辑并以熟悉的方式报告最常见的操作系统和浏览器,例如 http://www.whatsmybrowser.org

      我将脚本开源并上传到 github,https://github.com/keithws/browser-report。欢迎请求请求!

      【讨论】:

        【解决方案9】:

        使用DetectOS.js。这是一个针对流行操作系统和浏览器的简单 JS 定义,无需依赖:

        class DetectOS {
            constructor() {
                this.browser = this.searchString(this.dataBrowser())
                this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion)
                this.OS = this.searchString(this.dataOS())
            }
        
            searchString(data) {
                for (let i = 0; i < data.length; i++) {
                    let
                        dataString = data[i].string,
                        dataProp = data[i].prop
                    this.versionSearchString = data[i].versionSearch || data[i].identity
                    if (dataString) {
                        if (dataString.indexOf(data[i].subString) !== -1) {
                            return data[i].identity
                        }
                    } else if (dataProp) {
                        return data[i].identity
                    }
                }
            }
        
            searchVersion(dataString) {
                let index = dataString.indexOf(this.versionSearchString)
                if (index === -1) return
                return parseFloat(dataString.substring(index+this.versionSearchString.length + 1))
            }
        
            dataBrowser() {
                return [
                    /***************
                     * Chrome
                     ***************/
                    {
                        string: navigator.userAgent,
                        subString: "Chrome",
                        identity: "Chrome"
                    },
                    /***************
                     * Safari
                     ***************/
                    {
                        string: navigator.vendor,
                        subString: "Apple",
                        identity: "Safari",
                        versionSearch: "Version"
                    },
                    /***************
                     * For Older Opera (12.18-)
                     ***************/
                    {
                        prop: window.opera,
                        identity: "Opera",
                        versionSearch: "Version"
                    },
                    /***************
                     * Internet Explorer 10
                     ***************/
                    {
                        string: navigator.userAgent,
                        subString: "MSIE",
                        identity: "IE10",
                        versionSearch: "MSIE"
                    },
                    /***************
                     * Internet Explorer 11
                     ***************/
                    {
                        string: navigator.userAgent,
                        subString: "Trident",
                        identity: "IE11",
                        versionSearch: "rv"
                    },
                    /***************
                     * Edge
                     ***************/
                    {
                        string: navigator.userAgent,
                        subString: "Edge",
                        identity: "Edge",
                        versionSearch: "Edge"
                    },
                    /***************
                     * Firefox
                     ***************/
                    {
                        string: navigator.userAgent,
                        subString: "Firefox",
                        identity: "Firefox"
                    },
                    {
                        string: navigator.userAgent,
                        subString: "Gecko",
                        identity: "Mozilla",
                        versionSearch: "rv"
                    },
                    /***************
                     * For Older Netscapes (4-)
                     ***************/
                    {
                        string: navigator.userAgent,
                        subString: "Mozilla",
                        identity: "Netscape",
                        versionSearch: "Mozilla"
                    },
                    /***************
                     * For Newer Netscapes (6+)
                     ***************/
                    {
                        string: navigator.userAgent,
                        subString: "Netscape",
                        identity: "Netscape"
                    },
                    /***************
                     * Other Browsers
                     ***************/
                    {
                        string: navigator.userAgent,
                        subString: "OmniWeb",
                        versionSearch: "OmniWeb/",
                        identity: "OmniWeb"
                    },
                    {
                        string: navigator.vendor,
                        subString: "iCab",
                        identity: "iCab"
                    },
                    {
                        string: navigator.vendor,
                        subString: "KDE",
                        identity: "Konqueror"
                    },
                    {
                        string: navigator.vendor,
                        subString: "Camino",
                        identity: "Camino"
                    }
                ]
            }
        
            dataOS() {
                return [
                    {
                        string: navigator.platform,
                        subString: 'Win',
                        identity: 'Windows'
                    },
                    {
                        string: navigator.platform,
                        subString: 'Mac',
                        identity: 'macOS'
                    },
                    {
                        string: navigator.userAgent,
                        subString: 'iPhone',
                        identity: 'iOS'
                    },
                    {
                        string: navigator.userAgent,
                        subString: 'iPad',
                        identity: 'iOS'
                    },
                    {
                        string: navigator.userAgent,
                        subString: 'iPod',
                        identity: 'iOS'
                    },
                    {
                        string: navigator.userAgent,
                        subString: 'Android',
                        identity: 'Android'
                    },
                    {
                        string: navigator.platform,
                        subString: 'Linux',
                        identity: 'Linux'
                    }
                ]
            }
        }
        
        const Detect = new DetectOS()
        
        console.log("We know your browser – it's " + Detect.browser + " " + Detect.version);
        console.log("We know your OS – it's " + Detect.OS);
        console.log("We know everything about you.");

        【讨论】:

          【解决方案10】:

          如果您正在创建网站或创建使用 Electron 的桌面应用程序,您可能需要获取客户端使用的操作系统的信息。因此,在这种特殊情况下,您可以使用名为window.navigator 的全局属性。 如果您在控制台中使用console.log(navigator) 记录该属性,您将看到包含浏览器、操作系统等信息的子属性的整个对象。

          同样,如果你想创建一个本地 NodeJS 应用程序,也是可以的!只需使用const os = require("os"); 调用os 模块。然后在控制台中记录常量。你会得到一个完整的对象,但如果你想查看平台名称,你可以输入console.log(os.platform());,并确保在os.platform 之后添加一对括号作为platform 这是一个函数!

          希望这会有所帮助!

          【讨论】:

            【解决方案11】:

            我创建了一个名为Voodoo 的用于解析用户代理字符串的库。但请注意,不应该使用它来代替特征检测。

            Voodoo 的作用是解析在 Navigator 对象 (window.navigator) 中找到的 userAgent 字符串。并不是所有的浏览器都会传递一个可靠的 userAgent 字符串,所以即使这是正常的做法,也不能总是信任 userAgent。

            【讨论】:

            • 我喜欢 Voodoo,但我认为它应该是一种轻松区分移动设备、平板电脑等的方法...请将其发布在 gittip 上,这样我就可以给你小费了。
            【解决方案12】:

            fork@Ludwig 编码并删除swfobject 的必要性。

            我只是使用swfobject code 来检测 Flash 版本。

            /**
             * JavaScript Client Detection
             * (C) viazenetti GmbH (Christian Ludwig)
             */
            (function (window) {
                {
                var unknown = '-';
            
                // screen
                var screenSize = '';
                if (screen.width) {
                    width = (screen.width) ? screen.width : '';
                    height = (screen.height) ? screen.height : '';
                    screenSize += '' + width + " x " + height;
                }
            
                //browser
                var nVer = navigator.appVersion;
                var nAgt = navigator.userAgent;
                var browser = navigator.appName;
                var version = '' + parseFloat(navigator.appVersion);
                var majorVersion = parseInt(navigator.appVersion, 10);
                var nameOffset, verOffset, ix;
            
                // Opera
                if ((verOffset = nAgt.indexOf('Opera')) != -1) {
                    browser = 'Opera';
                    version = nAgt.substring(verOffset + 6);
                    if ((verOffset = nAgt.indexOf('Version')) != -1) {
                    version = nAgt.substring(verOffset + 8);
                    }
                }
                // MSIE
                else if ((verOffset = nAgt.indexOf('MSIE')) != -1) {
                    browser = 'Microsoft Internet Explorer';
                    version = nAgt.substring(verOffset + 5);
                }
                // Chrome
                else if ((verOffset = nAgt.indexOf('Chrome')) != -1) {
                    browser = 'Chrome';
                    version = nAgt.substring(verOffset + 7);
                }
                // Safari
                else if ((verOffset = nAgt.indexOf('Safari')) != -1) {
                    browser = 'Safari';
                    version = nAgt.substring(verOffset + 7);
                    if ((verOffset = nAgt.indexOf('Version')) != -1) {
                    version = nAgt.substring(verOffset + 8);
                    }
                }
                // Firefox
                else if ((verOffset = nAgt.indexOf('Firefox')) != -1) {
                    browser = 'Firefox';
                    version = nAgt.substring(verOffset + 8);
                }
                // MSIE 11+
                else if (nAgt.indexOf('Trident/') != -1) {
                    browser = 'Microsoft Internet Explorer';
                    version = nAgt.substring(nAgt.indexOf('rv:') + 3);
                }
                // Other browsers
                else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
                    browser = nAgt.substring(nameOffset, verOffset);
                    version = nAgt.substring(verOffset + 1);
                    if (browser.toLowerCase() == browser.toUpperCase()) {
                    browser = navigator.appName;
                    }
                }
                // trim the version string
                if ((ix = version.indexOf(';')) != -1) version = version.substring(0, ix);
                if ((ix = version.indexOf(' ')) != -1) version = version.substring(0, ix);
                if ((ix = version.indexOf(')')) != -1) version = version.substring(0, ix);
            
                majorVersion = parseInt('' + version, 10);
                if (isNaN(majorVersion)) {
                    version = '' + parseFloat(navigator.appVersion);
                    majorVersion = parseInt(navigator.appVersion, 10);
                }
            
                // mobile version
                var mobile = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(nVer);
            
                // cookie
                var cookieEnabled = (navigator.cookieEnabled) ? true : false;
            
                if (typeof navigator.cookieEnabled == 'undefined' && !cookieEnabled) {
                    document.cookie = 'testcookie';
                    cookieEnabled = (document.cookie.indexOf('testcookie') != -1) ? true : false;
                }
            
                // system
                var os = unknown;
                var clientStrings = [
                    {s:'Windows 10', r:/(Windows 10.0|Windows NT 10.0)/},
                    {s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/},
                    {s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/},
                    {s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/},
                    {s:'Windows Vista', r:/Windows NT 6.0/},
                    {s:'Windows Server 2003', r:/Windows NT 5.2/},
                    {s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/},
                    {s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/},
                    {s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/},
                    {s:'Windows 98', r:/(Windows 98|Win98)/},
                    {s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/},
                    {s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},
                    {s:'Windows CE', r:/Windows CE/},
                    {s:'Windows 3.11', r:/Win16/},
                    {s:'Android', r:/Android/},
                    {s:'Open BSD', r:/OpenBSD/},
                    {s:'Sun OS', r:/SunOS/},
                    {s:'Linux', r:/(Linux|X11)/},
                    {s:'iOS', r:/(iPhone|iPad|iPod)/},
                    {s:'Mac OS X', r:/Mac OS X/},
                    {s:'Mac OS', r:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},
                    {s:'QNX', r:/QNX/},
                    {s:'UNIX', r:/UNIX/},
                    {s:'BeOS', r:/BeOS/},
                    {s:'OS/2', r:/OS\/2/},
                    {s:'Search Bot', r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/}
                ];
                for (var id in clientStrings) {
                    var cs = clientStrings[id];
                    if (cs.r.test(nAgt)) {
                    os = cs.s;
                    break;
                    }
                }
            
                var osVersion = unknown;
            
                if (/Windows/.test(os)) {
                    osVersion = /Windows (.*)/.exec(os)[1];
                    os = 'Windows';
                }
            
                switch (os) {
                    case 'Mac OS X':
                    osVersion = /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];
                    break;
            
                    case 'Android':
                    osVersion = /Android ([\.\_\d]+)/.exec(nAgt)[1];
                    break;
            
                    case 'iOS':
                    osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
                    osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
                    break;
                }
            
                var flashVersion = 'no check', d, fv = [];
                if (typeof navigator.plugins !== 'undefined' && typeof navigator.plugins["Shockwave Flash"] === "object") {
                    d = navigator.plugins["Shockwave Flash"].description;
                    if (d && !(typeof navigator.mimeTypes !== 'undefined' && navigator.mimeTypes["application/x-shockwave-flash"] && !navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
                    d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
                    fv[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
                    fv[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
                    fv[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
                    }
                } else if (typeof window.ActiveXObject !== 'undefined') {
                    try {
                    var a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
                    if (a) { // a will return null when ActiveX is disabled
                        d = a.GetVariable("$version");
                        if (d) {
                        d = d.split(" ")[1].split(",");
                        fv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
                        }
                    }
                    }
                    catch(e) {}
                }
                if (fv.length) {
                    flashVersion = fv[0] + '.' + fv[1] + ' r' + fv[2];
                }    
                }
            
                window.jscd = {
                screen: screenSize,
                browser: browser,
                browserVersion: version,
                mobile: mobile,
                os: os,
                osVersion: osVersion,
                cookies: cookieEnabled,
                flashVersion: flashVersion
                };
            }(this));
            
            alert(
                'OS: ' + jscd.os +' '+ jscd.osVersion + '\n'+
                'Browser: ' + jscd.browser +' '+ jscd.browserVersion + '\n' + 
                'Mobile: ' + jscd.mobile + '\n' +
                'Flash: ' + jscd.flashVersion + '\n' +
                'Cookies: ' + jscd.cookies + '\n' +
                'Screen Size: ' + jscd.screen + '\n\n' +
                'Full User Agent: ' + navigator.userAgent
            );
            

            【讨论】:

              【解决方案13】:

              我无法对@Ian Ippolito 的回答发表评论(因为如果我有代表我会这样做),但根据他的评论链接的文档,我相当肯定你可以找到适用于 IOS 的 Chrome 版本。 https://developer.chrome.com/multidevice/user-agent?hl=ja 将 UA 列为:Mozilla/5.0(iPhone;CPU iPhone OS 10_3,如 Mac OS X)AppleWebKit/602.1.50(KHTML,如 Gecko)CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1

              所以这应该有效:

              if ((verOffset = nAgt.indexOf('CriOS')) != -1) {
                              //Chrome on iPad spoofing Safari...correct it.
                              browser = 'Chrome';
                              version = nAgt.substring(verOffset + 6);//should get the criOS ver.
                          }
              

              由于我的 iPad 在家而且我在工作,因此无法测试(否则我会改进他的答案)以确保它,但我想我会把它放在那里。

              【讨论】:

                【解决方案14】:

                您可以考虑以下库的快速解决方案:UAPARSER - https://www.npmjs.com/package/ua-parser-js

                示例:

                <script type="text/javascript" src="ua-parser.min.js"></script>
                <script type="text/javascript">
                
                var parser = new UAParser();
                console.log(parser.getOS()) // will log  {name: "", version:""}
                

                你也可以通过 npm 安装这个库,然后像这样导入它:

                import { UAParser } from 'ua-parser-js';
                let parser = new UAParser();
                parser.getOS();
                

                该库是一个基于 JS 的用户代理字符串解析器(window.navigator.userAgent 是浏览器上的用户代理),因此您可以使用它获取其他详细信息,例如浏览器、设备、引擎等。它可以工作节点 js 也是如此。

                如果您需要为库输入:https://www.npmjs.com/package/@types/ua-parser-js

                【讨论】:

                  【解决方案15】:

                  我正在使用这个:)

                  getPlatform() {
                      const allPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE', 'Android', 'iPhone', 'iPad', 'iPod'];
                      return allPlatforms.find(item => item === navigator.platform);
                  }
                  

                  【讨论】:

                  • navigator.platform 已弃用。
                  【解决方案16】:

                  用户代理字符串不再可靠地获取平台信息(操作系统、操作系统版本、cpu-arch 等),因为可以重写它们,甚至是浏览器设置的默认值不准确。 在浏览器控制台中尝试“console.log(navigator)”并检查 User-Agent 字段。

                  为了解决上述问题,有一个新的 W3 提案 (https://wicg.github.io/ua-client-hints/) 将允许用户请求有关平台的特定信息。截至 2021 年 11 月 5 日,只有 基于 Chromium 的浏览器(Chrome、Edge、Opera、Brave...)已实施规范(该提案仍是非官方的)。

                  获取平台信息的一种方法是让服务器通过添加这样的标头来请求特定信息 'Accept-CH: Sec-CH-UA-Platform-Version em>' 到初始响应和来自客户端的任何后续请求都将包含平台信息标头。有关详细信息,请参阅上面的链接。

                  要通过 Javascript 获取 客户端中的信息,可以使用以下代码(复制并粘贴到 chrome 控制台中)。

                  let platformDetails = await navigator.userAgentData.getHighEntropyValues(["architecture", 
                  "platform", "platformVersion", "model", "bitness", "uaFullVersion"]);
                  console.log(platformDetails);
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2015-08-06
                    • 2019-01-15
                    • 2010-11-27
                    • 2014-07-24
                    • 1970-01-01
                    • 2021-05-21
                    • 1970-01-01
                    相关资源
                    最近更新 更多