使用Javascript进行浏览器检测

时间:2012-10-29 11:45:04

标签: php javascript browser-detection

此问题的推理

我知道浏览器检测永远不会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 Detect

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

提前致谢

更新1

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

6 个答案:

答案 0 :(得分: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信息。

答案 1 :(得分:1)

说明

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

  1. 浏览器的格式如果浏览器的开发者希望这样做,用户代理可以随时更改。这可能会立即阻止某些脚本正常工作。
  2. 用户可以伪造他们的用户代理来模仿其他浏览器,因此他们似乎使用的浏览器不是。
  3. 可能的解决方案

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

    Javascript Detect

    但是,最可靠的检索浏览器细节的方法毫无疑问是由Gary Keith提供的browscapbrowscap项目提供有关从用户代理收集的每个浏览器和操作系统的详细信息。它易于实现,甚至更易于使用。要了解更多信息,请查看:

    Gary Keith - Browscap

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

    答案

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

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

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

    <!--[if IE 8]>I am IE 8<![endif]-->
    

答案 2 :(得分:1)

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

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

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

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

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

超级简单

WURFL.is_mobile

就是确定移动设备所需的全部内容。

祝你好运。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

yepnopejs IE detection (!ie prefixes)使用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
});

答案 5 :(得分:-1)

您可以使用完美的插件来获取用jQuery编写的信息(如javascript)

看看这个链接:

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

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