JavaScript中的浏览器检测---错误?

9
这是探测器:http://w3schools.com/js/tryit.asp?filename=try_nav_all 在 Chrome、Firefox、Safari 和 Netscape 中,它总是显示浏览器代号为 Mozilla,浏览器名称为 Netscape。难道这不应该根据浏览器而改变吗?
如果您感兴趣,下面是代码和不同的输出:
代码:
document.write("Browser CodeName: " + navigator.appCodeName);
document.write("<br /><br />");
document.write("Browser Name: " + navigator.appName);
document.write("<br /><br />");
document.write("Browser Version: " + navigator.appVersion);
document.write("<br /><br />");
document.write("Cookies Enabled: " + navigator.cookieEnabled);
document.write("<br /><br />");
document.write("Platform: " + navigator.platform);
document.write("<br /><br />");
document.write("User-agent header: " + navigator.userAgent);

谷歌浏览器输出:

Browser CodeName: Mozilla

Browser Name: Netscape

Browser Version: 5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10

Cookies Enabled: true

Platform: Win32

User-agent header: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10

火狐输出:
Browser CodeName: Mozilla

Browser Name: Netscape

Browser Version: 5.0 (Windows; es-ES)

Cookies Enabled: true

Platform: Win32

User-agent header: Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 

SAFARI 输出:

Browser CodeName: Mozilla

Browser Name: Netscape

Browser Version: 5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4

Cookies Enabled: true

Platform: Win32

User-agent header: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4

网景输出:

Browser CodeName: Mozilla

Browser Name: Netscape

Browser Version: 5.0 (Windows; en-US)

Cookies Enabled: true

Platform: Win32

User-agent header: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax)

2
w3schools太烂了。为自己着想,去看看MDC吧:https://developer.mozilla.org/en/JavaScript/Guide - Ivo Wetzel
2个回答

11

也许应该这样做,这取决于他们想要实现什么目标。

但它只是展示了为什么浏览器检测已经被淘汰,转而使用特性检测。浏览器检测代码的过时速度非常快。另一方面,特性检测则相对永恒。

例如:我可以检查浏览器是否为IE,并且如果是,则假定该浏览器没有Array.prototype.indexOf。但是然后IE9出现了并添加了它,但像个笨蛋一样,我仍在使用自己的版本,因为我认为“IE”没有它。更好的做法是实际检查我正在运行的实现中是否存在它,而不太关心它的品牌是什么。当然,特性检测将与我从未听说过的浏览器一起工作;浏览器检测将失败并回退到一些完全随意的“默认值”。

有时候这并不像执行if (Array.prototype.indexOf)那么简单,但通常是可行的。Juriy Zaytsev (kangax) 有一个很好的特性检测列表

(副注:几乎所有浏览器都声称(在某个级别上)它们是“Mozilla”,因为一些网站容易优先选择Netscape浏览器(就是那么久以前)而不是Microsoft浏览器,并且正在执行浏览器检测来进行检查。)


3
首先,我发现Quirksmode BrowserDetect脚本是一个真正的宝藏,可能比你现在使用的更好。 维基百科解释,用户代理字符串几乎总是以“Mozilla”开头:

Web浏览器使用的一种非官方格式如下:Mozilla / [版本]([系统和浏览器信息])[平台]([平台详细信息])[扩展]。

但是,为什么所有浏览器都声称自己是“Mozilla”,你必须回到20世纪90年代的浏览器战争时期,从webaim.org上这篇文章中可以了解到:
[...] 接着出现了一个名为“Mozilla”的新网络浏览器,缩写为“Mosaic Killer”,但Mosaic并不满意,因此公共名称改为Netscape,并将其称为Mozilla/1.0 (Win3.1) [...]
[...] 微软变得不耐烦,不想等待网站管理员了解IE并开始发送框架,因此Internet Explorer声明自己是“Mozilla兼容”,并开始冒充Netscape,称自己是Mozilla/1.22 (compatible; MSIE 2.0; Windows 95) [...]
并且微软将IE与Windows捆绑销售,并使其比Netscape更好,第一次浏览器战争在陆地上爆发。 Netscape被杀死了,人们对微软感到非常高兴。但是Netscape重生为Mozilla,Mozilla构建了Gecko,并称自己是Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826,而Gecko是渲染引擎,Gecko很好。 Mozilla变成了Firefox,并称自己是Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0,Firefox非常好。 Gecko开始繁殖,其他使用其代码的浏览器诞生了,它们称自己是Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/0.8.1这个,以及Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.8) Gecko/20071008 SeaMonkey/1.0另一个,每个浏览器都假装是Mozilla,所有这些浏览器都由Gecko驱动。[...]
你应该阅读整篇文章,它既有启发性又有趣。但长话短说,你需要解析用户代理字符串,因为它们几乎都说“Mozilla / something”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接