0

这个问题的推理

我知道浏览器检测永远不会 100% 可靠,因为用户代理标头总是可以伪造的,但是,我对此并不感到困扰。

尽管关于这个话题有很多问题,但它们似乎都很老了,所以为了获得最新的答案,我觉得我应该再次问这个问题。

我目前正在使用 PHP browscap 检测浏览器名称和版本服务器端,然后将名称和版本返回到 javascript 变量中(不是一个很好的方法)。我需要这样做的原因只是为了在访问者没有使用支持的浏览器时向他们显示一条消息。

当前方法(类似的东西):

<script type="text/javascript">
    var browser = new Array();
    browser['browser'] = '<?php echo $browser_name; ?>';
    browser['version'] = '<?php echo $browser_version; ?>';
    browser['error'] = '<?php echo $browser_error; ?>';
</script>

做这个客户端会更好,因为 browscap 可能会很慢,而且它会阻止我将值从 PHP 传递到 javascript 变量中。如果您认为使用 PHP 是一种更好的方法,请在您的回答中说明,这只是我的意见。

问题

因此,我的问题很简单,以下链接是确定浏览器名称和版本的可靠方法吗?

Javascript 检测

我知道需要添加新的浏览器,这不会打扰我。我更关心使用的算法是否可靠。

提前致谢

更新 1

要了解我的意思,请查看 Internet Explorer 7 或更低版本中的https://www.icloud.com/。您将收到一条消息,指出不支持该浏览器。这对于 IE 来说很容易做到,因为您可以简单地使用<!--[if gt IE.... 但是,我需要测试所有浏览器。

4

6 回答 6

1

这看起来不对,您可以从 Javascript 获取浏览器信息。无需混合 JS 和 PHP 代码即可。

您可以执行以下操作来获取并仅使用 JavaScript 检测用户浏览器:

var userAgent = navigator.userAgent.toLowerCase();
var old = false;

// Internet Explorer 7
if (userAgent.indexOf('msie 7.0b') !== -1) { old = true; }
else if (userAgent.indexOf('msie 7.0') !== -1) { old = true; }

// Internet Explorer 6
else if (userAgent.indexOf('msie 6.1') !== -1) { old = true; }
else if (userAgent.indexOf('msie 6.01') !== -1) { old = true; }
else if (userAgent.indexOf('msie 6.0b') !== -1) { old = true; }
else if (userAgent.indexOf('msie 6.0') !== -1) { old = true; }
...
// Detect any other browser versions you consider old

if(old = true) {
// Show notification and alert users that they are using old browser
}

这是使用 JS 的方法,但您也可以使用 HTML 来实现:

<!--[if lte IE 6]>
   // include your .css style or do whatever you want to alert users their browser is old
<![endif]-->

对您的问题的简短回答是肯定的,以您的方式检测用户浏览器是错误的,因为您可以使用纯 JavaScript 甚至 HTML 来完成。这里不需要混合 PHP 和 JS 代码,最后,PHP 和 JS 都会得到相同的 UserAgent 信息。

于 2012-10-29T12:08:11.377 回答
1

解释

经过与其他开发人员的广泛研究和讨论,很明显没有可靠的方法可以从用户代理中检索浏览器名称和版本。这归结为几个原因:

  1. 如果浏览器的开发人员愿意,浏览器用户代理的格式可以随时更改。这可能会立即阻止某些脚本正常工作。
  2. 用户可以伪造他们的用户代理来模仿其他浏览器,因此看起来像是在使用他们不是的浏览器。

可能的解决方案

虽然我非常不鼓励使用这些脚本,因为它们可能会在任何浏览器的更新发布时停止工作,但如果您确实希望在Javascript中检测浏览器名称和版本,那么我建议您使用此脚本:

Javascript 检测

然而,检索浏览器详细信息的最可靠方法无疑是browscap由 Gary Keith 提供的。该browscap项目提供了有关从用户代理收集的每个浏览器和操作系统的广泛信息。它非常容易实现,甚至更容易使用。要了解更多信息,请查看:

加里·基思 - Browscap

如果您选择使用browscapGary Keith 的文章,则需要确保至少每周更新一次。

回答

虽然我与这个答案相矛盾,但很明显,不建议使用任何类型的脚本检测浏览器信息。唯一可靠的浏览器检测方法是 Internet Explorer HTML 条件,如前所述,这些仅涵盖 Internet Explorer。

尽量避免浏览器特定的功能和通知,并利用内置功能,例如:

media="only screen and (device-width: 768px)"

<!--[if IE 8]>I am IE 8<![endif]-->
于 2012-10-30T09:07:50.360 回答
1

这个问题需要一个更新的答案。我认为如今客户端检测的最佳选择是WURFL

它是一个基于 Useragents 的更新设备库——想想客户端的 Browscap。

加载 JS 并根据请求 js 的设备返回 JSON。完美的!

<script type="text/javascript" src="//wurfl.io/wurfl.js"></script>

因为它在 WURFL 服务器端进行解析,所以您需要远程加载 js 而不是将其保存在您的目录树中。

一个超级容易

WURFL.is_mobile

例如,确定移动设备所需的一切。

祝你好运。

于 2015-08-11T06:24:08.860 回答
0

您可以尝试查看navigator.appNameand navigator.userAgent

于 2012-10-29T12:05:51.023 回答
0

yepnopejs IE 检测(!ie 前缀)通过使用 MS 条件注释来工作

一个简短的片段,用于在 JavaScript 中检测 IE10 之前的 IE 版本,而不使用用户代理嗅探。

while (
  div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->'
);
// …

https://github.com/SlexAxton/yepnope.js/blob/master/prefixes/yepnope.ie-prefix.js

yepnope 用法示例:

yepnope({
    load: ['normal.js', 'ie6!ie7!ie-patch.js'] // patch for ie6 or ie7 only
});
于 2012-10-29T12:19:26.870 回答
-1

您可以为这些用 jQuery 编写的信息使用完美的插件(如 javascript)

看看这个链接:

https://github.com/jquery/plugins.jquery.com

当您想确定某个功能在浏览器中是否可用、应用错误修复等时,请务必进行功能检测而不是浏览器检测。

于 2012-10-29T12:11:42.810 回答