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

时间:2008-10-16 15:31:02

标签: javascript prototypejs browser-detection

我习惯使用Atlas。最近我开始转换到jQuery,有时甚至是原型。我目前正在进行的项目是使用原型。

在Prototype中,是否有一种简单的方法来获取浏览器名称和版本?我查看了API文档,似乎无法找到它。

6 个答案:

答案 0 :(得分: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;

另一方面,您还必须检测服务器端的用户代理详细信息。 无论如何,浏览器检测是编写跨浏览器脚本的严重缺陷策略,只有在浏览器功能检测失败时才能使用。用户很容易改变他/她的用户代理细节。

答案 1 :(得分:7)

Prototype提供了一些标记,您可以检查以了解哪个浏览器正在运行。请记住,检查您希望使用的功能而不是检查特定浏览器是更好的做法。

以下是源树中当前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的XPath。

答案 2 :(得分: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 );
  }
});

答案 3 :(得分: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
});

希望它有所帮助!

答案 4 :(得分: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) { ... }

答案 5 :(得分: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>