问答详情
源自:8-13 userAgent

谷歌浏览器返回的版本信息中,既有Chorme又有Safari字符串值,

if(u_agent.indexOf("Firefox")>-1) 如果把 Firefox 改成Safari,浏览器名就会变成了Firefox而不是Chorme 了。像这种浏览器版本信息中字符串值有重合的,for循环返回的浏览器名还准确吗?

提问者:weibo_苏_0 2016-07-13 17:11

个回答

  • 前端大萌新
    2016-07-13 19:23:03
    已采纳

    navigator的信息可以很容易地被用户修改,所以JavaScript读取的值不一定是正确的。初学者为了针对不同浏览器编写不同的代码,喜欢用if判断浏览器版本,例如:

    var width;
    if (getIEVersion(navigator.userAgent) < 9) {    width = document.body.clientWidth;
    } else {    width = window.innerWidth;
    }

    但这样既可能判断不准确,也很难维护代码。正确的方法是充分利用JavaScript对不存在属性返回undefined的特性,直接用短路运算符||计算:

    var width = window.innerWidth || document.body.clientWidth;


  • php蚂蚁
    2016-07-13 23:07:32

    首先,问题的初衷是为了知道是那种浏览器。所以,为什么会去改动返回的内容呢?(没意义),

    然后不同浏览器返回的结果是不一样的,为什么GOOGLE浏览器返回的会有safi的标识呢?

    就是一个浏览器标识而已。是因为chrome模仿苹果WebKit标识让网站识别以获得访问更加精湛的页面。虽然带有apple,但苹果本身份额很小。chrome里面的APPLEWebKit标识一直没去掉。WebKit是Mac OS X v10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件。

    不同浏览器返回的结果如下(所以返回的结果判断还是准确的):

    IE(8-10)

    u_agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)


    Chrome

    u_agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36


    Chrome(115浏览器,内核也是Chrome的)

    u_agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36


    Safari

    u_agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2