У меня было несколько клиентов, жалующихся вчера, что какой-то код перестает работать. По-видимому, это сводится к подключаемым модулям, используя теперь устаревший jQuery.browser
, который прекратил работу вчера, когда был выпущен jQuery 1.9.
Я (быстро) посмотрел документы 1.9 change, и кажется, что они хотят, чтобы я заменил некоторые довольно тяжелые библиотеки только для этой одной функции.
Есть ли рекомендованный легкий плагин или фрагмент кода для восстановления этой функции?
Для чего нужны эти сайты, это очень просто; Мне нужно только самое основное обнаружение IE vs FF против всех остальных.
Предложения?
Ответ 1
Я использую следующий код, который ответил Alexx Roche, но я хотел обнаружить MSIE, поэтому:
<script type="text/javascript">
$(document).ready(function() {
if (navigator.userAgent.match(/msie/i) ){
alert('I am an old fashioned Internet Explorer');
}
});
</script>
надеюсь, что это поможет!
Ответ 2
jQuery Migrate был создан для обеспечения обратной совместимости при обновлении кода.
https://github.com/jquery/jquery-migrate
В качестве бонуса он регистрирует устаревшие функции по мере их использования. Я бы попробовал, пока вы решаете проблемы. Кроме того, вы должны установить определенную версию jQuery для своих сайтов. Это хорошо для обновления, но не забудьте проверить эти обновления, прежде чем вводить их в производство. Если вы используете CDN, вы все равно можете указать определенную версию в имени файла.
Теперь вам не нужен плагин jQuery для того, что вы просите. Проверьте объект navigator
.
appCodeName: "Mozilla"
appName: "Netscape"
appVersion: "5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17"
cookieEnabled: true
doNotTrack: null
geolocation: Geolocation
language: "en-US"
mimeTypes: MimeTypeArray
onLine: true
platform: "MacIntel"
plugins: PluginArray
product: "Gecko"
productSub: "20030107"
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17"
vendor: "Google Inc."
vendorSub: ""
Ответ 3
var browser = {
chrome: false,
mozilla: false,
opera: false,
msie: false,
safari: false
};
var sUsrAg = navigator.userAgent;
if(sUsrAg.indexOf("Chrome") > -1) {
browser.chrome = true;
} else if (sUsrAg.indexOf("Safari") > -1) {
browser.safari = true;
} else if (sUsrAg.indexOf("Opera") > -1) {
browser.opera = true;
} else if (sUsrAg.indexOf("Firefox") > -1) {
browser.mozilla = true;
} else if (sUsrAg.indexOf("MSIE") > -1) {
browser.msie = true;
}
console.log(browser.msie);
Ответ 4
Поместите этот код на свой сайт (например, файл js или после кода jQuery...):
var matched, browser;
// Use of jQuery.browser is frowned upon.
// More details: http://api.jquery.com/jQuery.browser
// jQuery.uaMatch maintained for back-compat
jQuery.uaMatch = function( ua ) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
/(msie) ([\w.]+)/.exec( ua ) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
matched = jQuery.uaMatch( navigator.userAgent );
browser = {};
if ( matched.browser ) {
browser[ matched.browser ] = true;
browser.version = matched.version;
}
// Chrome is Webkit, but Webkit is also Safari.
if ( browser.chrome ) {
browser.webkit = true;
} else if ( browser.webkit ) {
browser.safari = true;
}
jQuery.browser = browser;
Ответ 5
Я использовал следующий код, когда попал в ту же проблему:
<script type="text/javascript">
$(document).ready(function() {
//if (!$.browser.webkit && ! $.browser.mozilla) { //depricated
if (!navigator.userAgent.match(/mozilla/i) &&
! navigator.userAgent.match(/webkit/i) ){
alert('Let me tell you about Mozilla');
}
});
</script>
Ответ 6
Вы можете просто не обновлять, пока не уйдете от изношенных методов.
Вы действительно не должны включать jquery из CDN без указания номера версии в любом случае, это в какой-то мере побеждает цель использования CDN (без кэширования).
Вот ссылка на последнюю версию jQuery, которая поддерживала $.browser:
http://code.jquery.com/jquery-1.8.3.min.js
просто замените jquery.js src на эту ссылку, и ваш код будет продолжать работать до тех пор, пока вы не будете готовы двигаться вперед и перестанете использовать обесцененные функции.
Примечание. Fancybox2 по-прежнему использует $.browser, самый распространенный из них, который я видел до сих пор с момента обновления.
Обновление: Slickgrid по-прежнему использует $.browser
, обновление от 02/11/2013
Ответ 7
Я отвлек логику от jQuery.browser в плагин jquery.browser. Плагин выпущен под лицензией MIT.
Я также добавил поддержку IE11, Opera Webkit и Android.
Ответ 8
Попробуйте Conditionizr
Надеюсь, что это поможет:)
Ответ 9
Точная версия IE может быть обнаружена путем дополнительной проверки существования стандартных глобальных объектов, добавленных в определенные версии IE.
10 or older document.all
9 or older document.all && !window.atob
8 or older document.all && !document.addEventListener
7 or older document.all && !document.querySelector
6 or older document.all && !window.XMLHttpRequest
5.x document.all && !document.compatMode
if (document.all && !document.querySelector) {
alert('IE7 or lower');
}
Эти тесты не позволяют использовать userAgent, который используется для подмены
Ответ 10
if(!$.browser){
$.browser={chrome:false,mozilla:false,opera:false,msie:false,safari:false};
var ua=navigator.userAgent;
$.each($.browser,function(c,a){
$.browser[c]=((new RegExp(c,'i').test(ua)))?true:false;
if($.browser.mozilla && c =='mozilla'){$.browser.mozilla=((new RegExp('firefox','i').test(ua)))?true:false;};
if($.browser.chrome && c =='safari'){$.browser.safari=false;};
});
};
http://jsfiddle.net/R3AAX/3/
Ответ 11
Если все, что вам нужно, это ваши сторонние плагины jQuery, чтобы иметь возможность использовать jQuery.browser.msie, здесь однострочный. Просто включите его после jQuery.
jQuery.browser = jQuery.browser || {msie: navigator.userAgent.match(/msie/i) ? true : false};
Это самое малое возможное исправление, но все, что мне нужно, и оно работает, поэтому вы идете!
Ответ 12
Чтобы добавить к этому обсуждению. Я просто придумал плагин jquery $.browser, который вместо "обнаружения" просто просто анализирует агент пользователя в простой в использовании объект. Дальнейшая логика может быть легко применена для дальнейшего разбиения и анализа отдельных браузеров и платформ.
У меня были очень надежные результаты по useragents found здесь: UserAgentString.com. Я даже включил обнаружение версии для ie11 (около дна).
//The following code is by no means perfect, nor is it meant to be a standalone 'detection' plugin.
//It demonstrates parsing the useragent string into an easy to manage object.
//Even if it does make detection rediculously easy.. :)
//Because this regex makes no assumptions in advance.
//IMO, It compatibilty and maintainability is much higher than those based on static identifiers.
/*
uaMatch replacement that parses a useragent string into an object
useragent segments can be Name Value OR Name/Value OR Name
Segment: Name Value
Name: parsed to the last whitespace character
Value: value after the last whitespace character
Matches: (.NET CLR) (#.##), Android 2.3.4, etc
Note: this regex can have leading/trailing whitespace (trimmed for object properties)
Segment: Name/Value
Matches: all values matching Name/Value
Example: Firefox/24.0, Safari/533.1, Version/12.1, etc
Segment: Name
Matches: identifiers that hold no values (value of 'true' is implied)
Example: Macintosh, Linux, Windows, KHTML, U, etc
WARNING: not necessarily compatible with jQuery $.browser implementation.
- not recommended as a replacement for plugins that require it to function.
*/
(function ($) {
var ua = navigator.userAgent.toLowerCase();
var regex = /compatible; ([\w.+]+)[ \/]([\w.+]*)|([\w .+]+)[: \/]([\w.+]+)|([\w.+]+)/g;
var match = regex.exec(ua);
var browser = { };
while (match != null) {
var prop = {};
if (match[1]) {
prop.type = match[1];
prop.version = match[2];
}
else if (match[3]) {
prop.type = match[3];
prop.version = match[4];
}
else {
prop.type = match[5];
}
// some expressions have leading whitespace (i couldn't avoid this without a more complex expression)
// trim them and get rid of '.' (' .NET CLR' = 'net_clr')
prop.type = $.trim(prop.type).replace(".","").replace(" ","_");
var value = prop.version ? prop.version : true;
if (browser[prop.type]) {
if (!$.isArray(browser[prop.type]))
browser[prop.type] = new Array(browser[prop.type]);
browser[prop.type].push(value);
}
else browser[prop.type] = value;
match = regex.exec(ua);
}
for (var i in browser)
if (i.indexOf("mac") > -1)
browser.mac = true;
if (browser.windows_nt && !browser.windows)
browser.windows = true;
//put known browsers into the 'version' property for 'some' jquery compatibility
//for sake of argument chromium 'is' chrome
if (browser.chromium && !browser.chrome)
browser.chrome = browser.chromium;
//chrome / safari / webkit
if (browser.chrome) {
browser.version = browser.chrome;
}
else if (browser.safari) {
browser.version = browser.safari;
}
else {
if (browser.applewebkit)
browser.webkit = browser.applewebkit;
if (browser.webkit)
browser.version = browser.webkit;
}
//firefox / gecko
if (browser.firefox) {
if (browser.rv)
browser.version = browser.rv;
else browser.version = browser.firefox;
}
else if (browser.gecko) {
if (browser.rv)
browser.version = browser.rv;
else browser.version = browser.gecko;
}
//opera
if (browser.opera && !browser.version)
browser.version = browser.opera;
//msie
if (browser.trident && browser.rv) //ie11
browser.msie = browser.rv;
if (browser.msie)
browser.version = browser.msie;
$.browser = browser;//Rename to reduce confliction?
//WAS USED FOR TESTING & DISCOVERY (very useful)
//TODO: remove line below
alert(JSON.stringify($.browser));
}) (jQuery);
В Internet Explorer 10 JSON.stringify выйдет примерно так:
{"mozilla":"5.0","msie":"10.0","windows_nt":"6.2","trident":"6.0","net4.0e":true,"net4.0c":true,"net_clr":["3.5.30729","2.0.50727","3.0.30729"],"windows":true,"version":"10.0"}
Ответ 13
Короткий и вместе с тем мощный.
// chrome, safari, webkit, mozilla, msie, opera
var chrome = /chrome/i.test(navigator.userAgent);