如何在 Javascript 中获取 PC 中的操作系统版本

Posted

技术标签:

【中文标题】如何在 Javascript 中获取 PC 中的操作系统版本【英文标题】:How to get OS version in PC in Javascript 【发布时间】:2019-03-29 06:32:25 【问题描述】:

我需要查找用户设备的操作系统版本。对于移动设备,我知道它是如何完成的,并且已经成功地为 iosandroid 完成了,但我也需要找到 PC 的操作系统版本

假设我是使用 Ubuntu 16.04 的用户,那么我需要得到这个 来自我的脚本,但现在我得到"Linux" 作为操作系统

我也试过this。但是导航器中没有提供oscpu

var user = 
user.device = ;

function findBrowserDetails() 
  user.device = ;
  var unknown = '-';

  // screen
  var screenSize = '';
  if (screen.width) 
    width = (screen.width) ? screen.width : '';
    height = (screen.height) ? screen.height : '';
    screenSize += '' + width + " x " + height;
  
  console.log("What i get from above link is--", navigator);
  // browser
  var nVer = navigator.appVersion;
  var nAgt = navigator.userAgent || navigator.vendor || window.opera;

  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);
  
  // Edge
  else if ((verOffset = nAgt.indexOf('Edge')) != -1) 
    browser = 'Microsoft Edge';
    version = nAgt.substring(verOffset + 5);
  
  // 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);

  // 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;
  

  window.jscd = 
    screen: screenSize,
    browser: browser,
    browserVersion: version,
    browserMajorVersion: majorVersion,
    mobile: mobile,
    os: os,
    osVersion: osVersion,
  ;

  user.device = window.jscd;
  //detect device type
  if (/windows phone/i.test(nAgt)) 
    user.device.deviceType = "Windows Phone";
   else if (/android/i.test(nAgt)) 
    user.device.deviceType = "Android";
   else if (/iPad|iPhone|iPod/.test(nAgt) && !window.MSStream) 
    user.device.deviceType = "iOS";
   else 
    user.device.deviceType = "web";
  
  console.log("This is what so far i fetched", user.device)

findBrowserDetails();

【问题讨论】:

navigator.platform 将为您提供操作系统版本 您可以使用navigator.oscpu 获取操作系统的完整版本详细信息。 developer.mozilla.org/en-US/docs/Web/API/Navigator/oscpu Chrome 不支持 navigator.oscpu,如浏览器兼容性表中所示。 developer.mozilla.org/en-US/docs/Web/API/Navigator/… 是的@SamiAhmedSiddiqui 你是对的 navigator.oscpu 在 chrome 中未定义 【参考方案1】:
navigator.platform

这将为您提供操作系统名称,例如

更新

var OSName="Unknown OS";
if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows";
if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS";
if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";
if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux";

document.write('Your OS: '+OSName);

在您的系统上,此脚本产生以下结果: 你的操作系统:Linux (要获得更详细的操作系统信息,您的脚本应对navigator.appVersionnavigator.userAgent 执行更复杂的分析,但思路相同。)

【讨论】:

感谢您的回复。但是我不能得到我在问题中描述的版本名称,即 Ubuntu 16.04 之类的吗? 不,我猜不是.. 更多详情请参见link 你根本不能依赖 navigator 对象,因为它是由用户代理发送的,因此它可以被伪造:) 所以我想我必须和 navigator.platform 达成一致:( 是的 :) 我在应用程序中使用过它很好【参考方案2】:

您可以从navigator.userAgent 获得操作系统的版本号,但据我所知,您目前无法获得版本名称。

如果您想获取版本号,那么本文可能会帮助您: https://medium.com/creative-technology-concepts-code/detect-device-browser-and-version-using-javascript-8b511906745

这里是完整的代码,为您提供操作系统名称、操作系统版本、浏览器名称和浏览器版本。

(function () 
    'use strict';
    
    var module = 
        options: [],
        header: [navigator.platform, navigator.userAgent, navigator.appVersion, navigator.vendor, window.opera],
        dataos: [
             name: 'Windows Phone', value: 'Windows Phone', version: 'OS' ,
             name: 'Windows', value: 'Win', version: 'NT' ,
             name: 'iPhone', value: 'iPhone', version: 'OS' ,
             name: 'iPad', value: 'iPad', version: 'OS' ,
             name: 'Kindle', value: 'Silk', version: 'Silk' ,
             name: 'Android', value: 'Android', version: 'Android' ,
             name: 'PlayBook', value: 'PlayBook', version: 'OS' ,
             name: 'BlackBerry', value: 'BlackBerry', version: '/' ,
             name: 'Macintosh', value: 'Mac', version: 'OS X' ,
             name: 'Linux', value: 'Linux', version: 'rv' ,
             name: 'Palm', value: 'Palm', version: 'PalmOS' 
        ],
        databrowser: [
             name: 'Chrome', value: 'Chrome', version: 'Chrome' ,
             name: 'Firefox', value: 'Firefox', version: 'Firefox' ,
             name: 'Safari', value: 'Safari', version: 'Version' ,
             name: 'Internet Explorer', value: 'MSIE', version: 'MSIE' ,
             name: 'Opera', value: 'Opera', version: 'Opera' ,
             name: 'BlackBerry', value: 'CLDC', version: 'CLDC' ,
             name: 'Mozilla', value: 'Mozilla', version: 'Mozilla' 
        ],
        init: function () 
            var agent = this.header.join(' '),
                os = this.matchItem(agent, this.dataos),
                browser = this.matchItem(agent, this.databrowser);
            
            return  os: os, browser: browser ;
        ,
        matchItem: function (string, data) 
            var i = 0,
                j = 0,
                html = '',
                regex,
                regexv,
                match,
                matches,
                version;
            
            for (i = 0; i < data.length; i += 1) 
                regex = new RegExp(data[i].value, 'i');
                match = regex.test(string);
                if (match) 
                    regexv = new RegExp(data[i].version + '[- /:;]([\\d._]+)', 'i');
                    matches = string.match(regexv);
                    version = '';
                    if (matches)  if (matches[1])  matches = matches[1];  
                    if (matches) 
                        matches = matches.split(/[._]+/);
                        for (j = 0; j < matches.length; j += 1) 
                            if (j === 0) 
                                version += matches[j] + '.';
                             else 
                                version += matches[j];
                            
                        
                     else 
                        version = '0';
                    
                    return 
                        name: data[i].name,
                        version: parseFloat(version)
                    ;
                
            
            return  name: 'unknown', version: 0 ;
        
    ;
    
    var e = module.init(),
        debug = '';
    
    debug += 'os.name = ' + e.os.name + '<br/>';
    debug += 'os.version = ' + e.os.version + '<br/>';
    debug += 'browser.name = ' + e.browser.name + '<br/>';
    debug += 'browser.version = ' + e.browser.version + '<br/>';
 
    document.getElementById('log').innerHTML = debug;
());
&lt;div id="log"&gt;&lt;/div&gt;

以上代码是从这里复制粘贴的:https://jsfiddle.net/kmturley/Gd6c8/?utm_source=website&utm_medium=embed&utm_campaign=Gd6c8

如果您仍然想获得操作系统名称,那么您可以通过某种库来获得它(如果存在任何库,我不知道),或者您可以在其中定义带有版本号和版本名称硬编码的键值对,但是这绝对是一项繁忙的工作,可能不适合你。

【讨论】:

感谢您的回复。但是我不能得到我在问题中描述的版本名称,即 Ubuntu 16.04 之类的吗? @the_ultimate_developer 您可以使用上述代码获取操作系统版本号。我认为没有任何方法可以从 JS 获取版本名称,直到或除非您可能有一些库可以提供此名称或创建一个列表,您可以在其中定义跨版本号的版本名称,但这是一个忙碌的工作。 感谢您的信息!为你的努力点赞:)

以上是关于如何在 Javascript 中获取 PC 中的操作系统版本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 或 jQuery 或 Javascript 获取客户端系统/PC 域名和 PC 名称

如何使用 Redux connect 中的操作对测试组件进行快照?

AOP在JavaScript和TypeScript中的应用

javascript 和 css 在 PC 上获取与手机和平板电脑不同的窗口宽度

JavaScript--作用域和闭包

如何在javascript中获取从Action中传送过来的一个List集合中的某一个值呢?