是否有可能,不透过 user agent,知道用户使用的浏览器信息

最近和浏览器版本杠上了。

简单的来说,就是我想要知道用户使用的浏览器的版本,如果与我们预期的版本不符,则提示用户升级或跟换浏览器

这里的行为就有点像知乎、阿里巴巴等网站的做法,直接上图

9f510fb30f2442a73f313088db43ad4bd11302e4.jpg

首先我提的方案是透通过 JavaScript 获取 user agent 字符串中的内容来检测用户使用的浏览器版本

图片描述

如上图,我就可以根据这个字符串中是否存在“FireFox”来判断它是否是 FireFox 浏览器,并根据后面的数字得到版本。

但是 user agent 有个致命的问题,它可以修改,且各个版本的 user agent 内容是不一样的,就算在某个版本区间内可以保证它的一致性,但是不能保证以后的都会一致,况且现在的浏览器更新速度越来越快了。

更何况国内浏览器“鱼龙混杂”,user agent 的判断逻辑可以说很难。(知乎的相关功能已被无数人吐槽)

所以想问大佬们

是否有其他的办法知道浏览器的版本。

不胜感激!

阅读 5.4k
6 个回答

只能用UA,同时浏览器的版本信息允许被修改,可欺骗性比较强。

这是我常用的获取浏览器信息的代码,你可以参考一下:

navigator.sayswho= (function(){

var ua= navigator.userAgent, tem, 
M= ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if(/trident/i.test(M[1])){
    tem=  /\brv[ :]+(\d+)/g.exec(ua) || [];
    return 'IE '+(tem[1] || '');
}
if(M[1]=== 'Chrome'){
    tem= ua.match(/\b(OPR|Edge)\/(\d+)/);
    if(tem!= null) return tem.slice(1).join(' ').replace('OPR', 'Opera');
}
M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
if((tem= ua.match(/version\/(\d+)/i))!= null) M.splice(1, 1, tem[1]);
return M.join(' ');

})();

console.log(navigator.sayswho);

我觉得可以换一个思路,低版本浏览器主要在于不支持某些 HTML5 特性,所以题主想提示这些浏览器进行版本升级。题主可以通过测试浏览器是否支持对应的 API 来判断该浏览器是否需要更新,这个目前已经有现成的类库进行封装了。 https://modernizr.com/

UA允许修改且浏览器鱼龙混杂,这是一个目前大家都很头疼但是都很无奈的问题。

只能通过UA,不过要精确到浏览器的版本,这个是否有必要,就需要思考了。
如果是为了考虑兼容,那么从产品经理的角度出发,设定最低浏览器支持要求,代码样式也依照最低要求来编写,不就可以了吗?
再或者,针对再旧的浏览器用户,可以专门开设一个阉割的版本,能使用基本功能,但是体验没有标准版好,比如gmail。

根据UA来判断浏览器,只能接受UA会被修改的情况,这是没有办法改变的。
不过,某些情况下可以确定浏览器版本区间,比如IE5和IE6是没有XMLHttpRequest对象的,检测用户浏览器是否版本大于IE6可以使用if(window.XMLHttpRequest)语句进行判断。
我想,就算能修改IE的UA,也没办法凭空造一个不存在的XMLHttpRequest对象来吧。

没有。
进一步说,别人用的什么,跟你没关系。是否想让你知道,也只是别人想或者不想的事。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题