原型库中的浏览器和版本?

14

我习惯使用 Atlas。最近开始转向使用 jQuery 和 Prototype。我目前正在工作的项目中使用 Prototype。

在 Prototype 中,有没有一种简单的方法可以获取浏览器名称和版本?我已经查阅了 API 文档,但似乎找不到相关内容。


1
另外,我明白编写针对特定浏览器及其版本的代码与编写针对可用“功能”的代码之间存在的陷阱。 - EvilSyn
更深入的搜索后,我发现了Prototype.Browser,它可以在IE或Gecko等浏览器上给我布尔值。这很有帮助...如果它还能包含版本信息就更好了,但我想我可以用普通的JS来实现。 - EvilSyn
6个回答

18

作为对nertzy答案的补充,你可以使用以下代码来检测IE版本:

Prototype.Browser.IE6 = Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 6;
Prototype.Browser.IE7 = Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 7;
Prototype.Browser.IE8 = Prototype.Browser.IE && !Prototype.Browser.IE6 && !Prototype.Browser.IE7;

另一方面,您还需要在服务器端检测用户代理详情。无论如何,浏览器检测是编写跨浏览器脚本的严重有缺陷的策略,只有在浏览器功能检测失败时才使用它。对于用户来说,轻松更改其用户代理详情。


请注意,此答案不考虑IE9(因为在发布时可能还不存在)。 - Stephan Muller
我的猜测是不到10%的用户不知道如何更改他们的用户代理,所以我认为这不是一个坏策略。 - Rigel Glen
最后一行需要更新以适应IE9!Prototype.Browser.IE8在使用最新版本的这个超棒浏览器时会返回true。 - jmlnik

7

原型提供了一些标志,您可以检查以了解运行的浏览器。请记住,最好的做法是检查您希望使用的功能,而不是检查特定的浏览器。

以下是prototype.js源代码中当前的浏览器和功能检测部分:

var Prototype = {
  Browser: {
    IE:     !!(window.attachEvent &&
      navigator.userAgent.indexOf('Opera') === -1),
    Opera:  navigator.userAgent.indexOf('Opera') > -1,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && 
      navigator.userAgent.indexOf('KHTML') === -1,
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
  },

  BrowserFeatures: {
    XPath: !!document.evaluate,
    SelectorsAPI: !!document.querySelector,
    ElementExtensions: !!window.HTMLElement,
    SpecificElementExtensions: 
      document.createElement('div')['__proto__'] &&
      document.createElement('div')['__proto__'] !== 
        document.createElement('form')['__proto__']
  },
}

您可以通过检查Prototype.Browser.IE的值来确定当前浏览器是否为IE,或者更具有未来兼容性地检查特定功能,例如Prototype.BrowserFeatures.XPath,以确保代码能够在未来的浏览器版本中正常运行。


3

我在使用这个工具时,相比Prototype的浏览器定义,更喜欢它。

Object.extend(Prototype.Browser, {
    ie6: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 6 ? true : false) : false,
    ie7: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 7 ? true : false) : false,
    ie8: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 8 ? true : false) : false,
    ie9: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 9 ? true : false) : false
});

希望这能帮助到您!

3

你说得对-原型不提供确定浏览器名称或版本的实用程序。

如果你需要作为插件获取浏览器信息,我建议添加以下内容(直接从jQuery中获取):

var Browser = Class.create({
  initialize: function() {
    var userAgent = navigator.userAgent.toLowerCase();
    this.version = (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1];
    this.webkit = /webkit/.test( userAgent );
    this.opera = /opera/.test( userAgent );
    this.msie = /msie/.test( userAgent ) && !/opera/.test( userAgent );
    this.mozilla = /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent );
  }
});

2
你的说法有些不正确,Prototype确实提供了一个猜测浏览器名称的工具,就像我下面展示的那样。而且猜测确实是你所能做的最好的事情,因为任何浏览器都可以伪造其用户代理字符串。 - Grant Hutchins
这是一个很好的解决方案,谢谢。它比Prototype更好,Prototype只能区分IE、Opera、WebKit、MobileSafari和Gecko,而且没有版本号,除非你自己编码。 - Chuck Le Butt
添加以下代码:this.chrome = /chrome/.test( userAgent ); 可以识别...你猜对了。(注意:你还需要在 Safari 行中添加:"&& !/chrome/.test( userAgent );") - Chuck Le Butt

2

我已经扩展了prototype.js:

var Prototype = { ... };

使用这个:

// extension
if (Prototype.Browser.IE) {
    if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) {
        Prototype.BrowserFeatures['Version'] = new Number(RegExp.$1);
    }
}

对我来说很有效,调用方式如下:

if (Prototype.Browser.IE && Prototype.BrowserFeatures['Version'] == 8) { ... }

0
            <script type="text/JavaScript">

                function getBrowserVersion()
                {
                    var msg = "Not Recognised Browser";

                    if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent))
                    {
                        var ffversion = new Number(RegExp.$1)

                        for (var i = 1; i < 20; i++)
                        {
                            if (ffversion == i)
                            {
                                msg = "FF" + i + "x";
                                break;
                            }
                        }
                    }
                    else if (/MSIE (\d+\.\d+);/.test(navigator.userAgent))
                    {
                        var ieversion = new Number(RegExp.$1)

                        for (var i = 1; i < 20; i++)
                        {
                            if (ieversion == i)
                            {
                                msg = "IE" + i + "x";
                                break;
                            }
                        }
                    }

                    alert(msg); // return msg; 
                }

           </script>

仅提供代码的答案并不好。请在您的代码中解释答案。 - random_user_name

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