Браузер и версия в библиотеке прототипов?
Я привык к использованию Атласа. Недавно я начал переходить на jQuery, а иногда и на прототип. Проект, над которым я сейчас работаю, использует прототип.
В Prototype есть простой способ получить имя и версию браузера? Я просмотрел документацию по API и не могу ее найти.
6 ответов
В завершение ответа Нерци вы можете добавить возможность обнаружения версий 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 предлагает несколько флагов, которые вы можете проверить, чтобы понять, какой браузер работает. Имейте в виду, что гораздо лучше проверять функциональность, которую вы хотите использовать, а не проверять конкретный браузер.
Вот часть, посвященная обнаружению браузеров и функций 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__']
},
}
Таким образом, вы можете проверить, является ли текущий браузер IE, изучив значение Prototype.Browser.IE
или, в качестве альтернативы, быть более совместимым с будущим и проверить наличие определенной функции, такой как XPath, с Prototype.BrowserFeatures.XPath
,
Вы правы - прототип не предоставляет утилиту для определения имени или версии браузера.
Если вам необходимо получить информацию о браузере в качестве плагина, я бы предложил добавить следующее (взято непосредственно из 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.
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
});
Надеюсь, поможет!
У меня есть 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>