我习惯使用 Atlas。最近开始转向使用 jQuery 和 Prototype。我目前正在工作的项目中使用 Prototype。
在 Prototype 中,有没有一种简单的方法可以获取浏览器名称和版本?我已经查阅了 API 文档,但似乎找不到相关内容。
我习惯使用 Atlas。最近开始转向使用 jQuery 和 Prototype。我目前正在工作的项目中使用 Prototype。
在 Prototype 中,有没有一种简单的方法可以获取浏览器名称和版本?我已经查阅了 API 文档,但似乎找不到相关内容。
作为对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;
另一方面,您还需要在服务器端检测用户代理详情。无论如何,浏览器检测是编写跨浏览器脚本的严重有缺陷的策略,只有在浏览器功能检测失败时才使用它。对于用户来说,轻松更改其用户代理详情。
原型提供了一些标志,您可以检查以了解运行的浏览器。请记住,最好的做法是检查您希望使用的功能,而不是检查特定的浏览器。
以下是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
,以确保代码能够在未来的浏览器版本中正常运行。
我在使用这个工具时,相比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
});
你说得对-原型不提供确定浏览器名称或版本的实用程序。
如果你需要作为插件获取浏览器信息,我建议添加以下内容(直接从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 );
}
});
我已经扩展了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) { ... }
<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>