Чи застарів jQuery $ .browser?


78

Хтось може сказати мені, чи правильно я вважаю, що $ .browser jQuery застарілий?

Чи будуть мої існуючі реалізації продовжувати працювати? Якщо ні, чи є проста у реалізації альтернатива.


api.jquery.com/jQuery.browser Категорія: застаріла.
Еван Мулавскі

14
Чому це позначено? Для когось це може бути тривіальним питанням, але якщо я не знаю альтернативи, це слушне питання.
Mark_54

3
Або просто додайте плагін: github.com/gabceb/jquery-browser-plugin
user956584

Відповіді:


70

З документації :

Властивість $ .browser застаріло в jQuery 1.3, і його функціональні можливості можуть бути переміщені до плагіна, що підтримується командою, у наступному випуску jQuery.

Так, так, це застаріло, але ваші існуючі реалізації продовжуватимуть працювати. Якщо функціональність буде видалена, вона, швидше за все, буде легко доступна за допомогою плагіна.

Щодо того, чи існує альтернатива ... Відповідь "так, мабуть". Набагато краще виявляти функції, $.supportа не виявляти браузером: виявляти потрібну вам функцію, а не браузер, який її надає. Найважливіші функції, які відрізняються від браузера до браузера, виявляються за допомогою цього.


Оновлення 16 лютого 2013 р .: У jQuery 1.9 цю функцію було видалено ( docs ). Набагато краще не використовувати його. Якщо ви дійсно, дійсно повинні використовувати його функціонал, ви можете відновити його за допомогою плагіна jQuery Migrate .


4
Проблема в $.supportтому, як я можу визначити, чи використовую IE 7, і тому мені потрібно додати налаштування CSS, щоб виправити мою сторінку?
Racket Hazmat,

5
@Rocket Умовні коментарі були б краще, звичайно.
одинокий день

1
lonesomeday - Дякую за додатковий коментар. Ми всі намагаємось набувати своїх знань і часом потребуємо допомоги.
Mark_54

6
і $.browserбув вилучений зjQuery 1.9
diEcho

6
Є так багато примх з IE та різними версіями IE. Так, IE 7 підтримує анімацію, але НІ Я не хочу, щоб її бачили користувачі! Це жахливо. Тож $ .browser у цьому випадку дуже зручний.
Elger Mensonides

94

Друге запитання

Чи будуть мої існуючі реалізації продовжувати працювати? Якщо ні, чи є проста у реалізації альтернатива.

Відповідь - так , але не без невеликої роботи.

$ .browser - це офіційний плагін, який був включений у старіші версії jQuery, тому, як і будь-який інший плагін, ви можете просто скопіювати його та включити у свій проект, або просто додати його до кінця будь-якого випуску jQuery.

Я витягнув для вас код, якщо ви хочете ним скористатися.


// Limit scope pollution from any deprecated API
(function() {

    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;

    jQuery.sub = function() {
        function jQuerySub( selector, context ) {
            return new jQuerySub.fn.init( selector, context );
        }
        jQuery.extend( true, jQuerySub, this );
        jQuerySub.superclass = this;
        jQuerySub.fn = jQuerySub.prototype = this();
        jQuerySub.fn.constructor = jQuerySub;
        jQuerySub.sub = this.sub;
        jQuerySub.fn.init = function init( selector, context ) {
            if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
                context = jQuerySub( context );
            }

            return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
        };
        jQuerySub.fn.init.prototype = jQuerySub.fn;
        var rootjQuerySub = jQuerySub(document);
        return jQuerySub;
    };

})();

Якщо ви запитуєте, чому комусь потрібен амортизований плагін, я підготував наступну відповідь.

Перш за все відповідь - сумісність. Оскільки jQuery базується на плагінах, деякі розробники вирішили використовувати $ .browser і з останніми випусками jQuery, що не включає $ .browser, всі ті плагіни, які стали марними.

jQuery випустив плагін міграції , який був створений для розробників, щоб визначити, чи використовували їх плагіни амортизовані залежності, такі як $ .browser.

Хоча це допомогло розробникам виправити свої плагіни. jQuery повністю знизив $ .browser, тому вищевказане виправлення є, мабуть, єдиним рішенням, доки розробники не виправлять або не включать вищезазначене.

Про: jQuery.browser


7
Це допомогло мені отримати сторонній сценарій, який все ще використовував $ .browser для роботи з jQuery 1.9.0. Дякую!
twamley

2
Я знайшов більш офіційну версію цього (та інших застарілих функцій) тут: github.com/jquery/jquery-migrate
twamley

2
Плагін Migrate - це хороший інструмент, який дозволяє користувачам бачити список застарілих функцій, які в даний час є у сценаріях, але він надає функціональність застарілій функції. Не призначений для виправлення.
EminezArtus

1
Домовились. З тих пір я вирішив дотримуватися 1.8.3, поки чекаю наступного покоління сторонніх сценаріїв.
twamley

1
+1, у таких речах, як placeholderатрибут, через IE10 є помилки, з якими нам доводиться мати справу та вимагати $.browserдля цього ...
Izkata

6

Тут я представляю альтернативний спосіб виявлення браузера на основі доступності функцій.

Щоб виявити лише IE, ви можете використовувати це:

if(/*@cc_on!@*/false || typeof ScriptEngineMajorVersion === "function")
{
    //You are using IE>=4 (unreliable for IE11)
}
else
{
    //You are using other browser
}

Щоб виявити найпопулярніші браузери:

if(/*@cc_on!@*/false || typeof ScriptEngineMajorVersion === "function")
{
    //You are using IE >= 4 (unreliable for IE11!!!)
}
else if(window.chrome)
{
    //You are using Chrome or Chromium
}
else if(window.opera)
{
    //You are using Opera >= 9.2
}
else if('MozBoxSizing' in document.body.style)
{
    //You are using Firefox or Firefox based >= 3.2
}
else if({}.toString.call(window.HTMLElement).indexOf('Constructor')+1)
{
    //You are using Safari >= 3.1
}
else
{
    //Unknown
}

Ця відповідь була оновлена, оскільки IE11 більше не підтримує умовне компілювання ( /*@cc_on!@*/falseфокус).
Ви можете перевірити, чи видалив IE11 умовну компіляцію javascript? для отримання додаткової інформації щодо цієї теми.
Я використав пропозицію, яку вони там подали.
Крім того , ви можете використовувати typeof document.body.style.msTransform == "string"або document.body.style.msTransform !== window.undefinedнавіть 'msTransform' in document.body.style.


Дякуємо, що поділились цим. мій вибір дати не працював після оновлення до VS2013 та завантаження Jquery та Juice з менеджера пакунків Nuget. Встав код і все знову запрацювало.
user1270384

2
Будь ласка. Я використовую цей код, щоб обробляти всі браузери в крайніх регістрах деяких моїх кодів javascript. Якщо БУДЬ-ЯК з цього перестане працювати, і якщо ви виявите це, будь ласка, повідомте мене якомога швидше.
Ісмаель Мігель

/ * @ cc_on! @ * / false повертає false для IE edge
alex

@alex Яку саме версію та збірку ви використовуєте та в якій ОС? Якщо ви використовуєте на віртуальній машині, будь ласка, чи можете ви вказати програмне забезпечення та версію?
Ісмаель Мігель

1
@alex Вибачте за затримку. Зараз я зафіксував відповідь. IE справді зіпсувався. Але мені це вдалося. Скажи мені, що ти думаєш, будь ласка.
Ісмаель Мігель

3

Оновлено! 24.03.2015 (прокрутка нижче години)

lonesomeday «s відповідь абсолютно правильно, я просто думав , що я хотів би додати цю пікантну. Я давно створив метод для отримання браузера у Vanilla JS і врешті-решт вигнув його для заміни jQuery.browserв пізніших версіях jQuery. Він не заважає жодній частині нової бібліотеки jQuery, але забезпечує однакову функціональність традиційного jQuery.browserоб'єкта, а також деякі інші невеликі функції.


Нова розширена версія!

Набагато ретельніше для нових браузерів. Крім того, 90 +% точність при мобільному тестуванні! Не скажу на 100%, оскільки я не тестував на кожному мобільному браузері, але нова функція додає $.browser.mobileлогічний / рядок. Неправда, якщо не мобільна, інакше це буде ім'я рядка для мобільного пристрою або браузера (Найкраще вгадування, наприклад: Android, планшет RIM, iPod тощо ...).

Одне з можливих застережень може не працювати з деякими старими (непідтримуваними) браузерами, оскільки воно повністю залежить від userAgentрядка.

JS Мініфікований

/* quick & easy cut & paste */
;;(function($){if(!$.browser&&1.9<=parseFloat($.fn.jquery)){var a={browser:void 0,version:void 0,mobile:!1};navigator&&navigator.userAgent&&(a.ua=navigator.userAgent,a.webkit=/WebKit/i.test(a.ua),a.browserArray="MSIE Chrome Opera Kindle Silk BlackBerry PlayBook Android Safari Mozilla Nokia".split(" "),/Sony[^ ]*/i.test(a.ua)?a.mobile="Sony":/RIM Tablet/i.test(a.ua)?a.mobile="RIM Tablet":/BlackBerry/i.test(a.ua)?a.mobile="BlackBerry":/iPhone/i.test(a.ua)?a.mobile="iPhone":/iPad/i.test(a.ua)?a.mobile="iPad":/iPod/i.test(a.ua)?a.mobile="iPod":/Opera Mini/i.test(a.ua)?a.mobile="Opera Mini":/IEMobile/i.test(a.ua)?a.mobile="IEMobile":/BB[0-9]{1,}; Touch/i.test(a.ua)?a.mobile="BlackBerry":/Nokia/i.test(a.ua)?a.mobile="Nokia":/Android/i.test(a.ua)&&(a.mobile="Android"),/MSIE|Trident/i.test(a.ua)?(a.browser="MSIE",a.version=/MSIE/i.test(navigator.userAgent)&&0<parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,""))?parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,"")):"Edge",/Trident/i.test(a.ua)&&/rv:([0-9]{1,}[\.0-9]{0,})/.test(a.ua)&&(a.version=parseFloat(a.ua.match(/rv:([0-9]{1,}[\.0-9]{0,})/)[1].replace(/[^0-9\.]/g,"")))):/Chrome/.test(a.ua)?(a.browser="Chrome",a.version=parseFloat(a.ua.split("Chrome/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Opera/.test(a.ua)?(a.browser="Opera",a.version=parseFloat(a.ua.split("Version/")[1].replace(/[^0-9\.]/g,""))):/Kindle|Silk|KFTT|KFOT|KFJWA|KFJWI|KFSOWI|KFTHWA|KFTHWI|KFAPWA|KFAPWI/i.test(a.ua)?(a.mobile="Kindle",/Silk/i.test(a.ua)?(a.browser="Silk",a.version=parseFloat(a.ua.split("Silk/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Kindle/i.test(a.ua)&&/Version/i.test(a.ua)&&(a.browser="Kindle",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,"")))):/BlackBerry/.test(a.ua)?(a.browser="BlackBerry",a.version=parseFloat(a.ua.split("/")[1].replace(/[^0-9\.]/g,""))):/PlayBook/.test(a.ua)?(a.browser="PlayBook",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/BB[0-9]{1,}; Touch/.test(a.ua)?(a.browser="Blackberry",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Android/.test(a.ua)?(a.browser="Android",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Safari/.test(a.ua)?(a.browser="Safari",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Firefox/.test(a.ua)?(a.browser="Mozilla",a.version=parseFloat(a.ua.split("Firefox/")[1].replace(/[^0-9\.]/g,""))):/Nokia/.test(a.ua)&&(a.browser="Nokia",a.version=parseFloat(a.ua.split("Browser")[1].replace(/[^0-9\.]/g,""))));if(a.browser)for(var b in a.browserArray)a[a.browserArray[b].toLowerCase()]=a.browser==a.browserArray[b];$.extend(!0,$.browser={},a)}})(jQuery);
/* quick & easy cut & paste */

jsFiddle "Плагін jQuery: отримати браузер (розширене видання Alt)"

/**	jQuery.browser
 *	@author	J.D. McKinstry (2014)
 *	@description	Made to replicate older jQuery.browser command in jQuery versions 1.9+
 *	@see http://jsfiddle.net/SpYk3/wsqfbe4s/
 *
 *	@extends	jQuery
 *	@namespace	jQuery.browser
 *	@example	jQuery.browser.browser == 'browserNameInLowerCase'
 *	@example	jQuery.browser.version
 *	@example	jQuery.browser.mobile	@returns	BOOLEAN
 *	@example	jQuery.browser['browserNameInLowerCase']
 *	@example	jQuery.browser.chrome	@returns	BOOLEAN
 *	@example	jQuery.browser.safari	@returns	BOOLEAN
 *	@example	jQuery.browser.opera	@returns	BOOLEAN
 *	@example	jQuery.browser.msie	@returns	BOOLEAN
 *	@example	jQuery.browser.mozilla	@returns	BOOLEAN
 *	@example	jQuery.browser.webkit	@returns	BOOLEAN
 *	@example	jQuery.browser.ua	@returns	navigator.userAgent String
 */
;;(function($){if(!$.browser&&1.9<=parseFloat($.fn.jquery)){var a={browser:void 0,version:void 0,mobile:!1};navigator&&navigator.userAgent&&(a.ua=navigator.userAgent,a.webkit=/WebKit/i.test(a.ua),a.browserArray="MSIE Chrome Opera Kindle Silk BlackBerry PlayBook Android Safari Mozilla Nokia".split(" "),/Sony[^ ]*/i.test(a.ua)?a.mobile="Sony":/RIM Tablet/i.test(a.ua)?a.mobile="RIM Tablet":/BlackBerry/i.test(a.ua)?a.mobile="BlackBerry":/iPhone/i.test(a.ua)?a.mobile="iPhone":/iPad/i.test(a.ua)?a.mobile="iPad":/iPod/i.test(a.ua)?a.mobile="iPod":/Opera Mini/i.test(a.ua)?a.mobile="Opera Mini":/IEMobile/i.test(a.ua)?a.mobile="IEMobile":/BB[0-9]{1,}; Touch/i.test(a.ua)?a.mobile="BlackBerry":/Nokia/i.test(a.ua)?a.mobile="Nokia":/Android/i.test(a.ua)&&(a.mobile="Android"),/MSIE|Trident/i.test(a.ua)?(a.browser="MSIE",a.version=/MSIE/i.test(navigator.userAgent)&&0<parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,""))?parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,"")):"Edge",/Trident/i.test(a.ua)&&/rv:([0-9]{1,}[\.0-9]{0,})/.test(a.ua)&&(a.version=parseFloat(a.ua.match(/rv:([0-9]{1,}[\.0-9]{0,})/)[1].replace(/[^0-9\.]/g,"")))):/Chrome/.test(a.ua)?(a.browser="Chrome",a.version=parseFloat(a.ua.split("Chrome/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Opera/.test(a.ua)?(a.browser="Opera",a.version=parseFloat(a.ua.split("Version/")[1].replace(/[^0-9\.]/g,""))):/Kindle|Silk|KFTT|KFOT|KFJWA|KFJWI|KFSOWI|KFTHWA|KFTHWI|KFAPWA|KFAPWI/i.test(a.ua)?(a.mobile="Kindle",/Silk/i.test(a.ua)?(a.browser="Silk",a.version=parseFloat(a.ua.split("Silk/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Kindle/i.test(a.ua)&&/Version/i.test(a.ua)&&(a.browser="Kindle",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,"")))):/BlackBerry/.test(a.ua)?(a.browser="BlackBerry",a.version=parseFloat(a.ua.split("/")[1].replace(/[^0-9\.]/g,""))):/PlayBook/.test(a.ua)?(a.browser="PlayBook",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/BB[0-9]{1,}; Touch/.test(a.ua)?(a.browser="Blackberry",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Android/.test(a.ua)?(a.browser="Android",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Safari/.test(a.ua)?(a.browser="Safari",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Firefox/.test(a.ua)?(a.browser="Mozilla",a.version=parseFloat(a.ua.split("Firefox/")[1].replace(/[^0-9\.]/g,""))):/Nokia/.test(a.ua)&&(a.browser="Nokia",a.version=parseFloat(a.ua.split("Browser")[1].replace(/[^0-9\.]/g,""))));if(a.browser)for(var b in a.browserArray)a[a.browserArray[b].toLowerCase()]=a.browser==a.browserArray[b];$.extend(!0,$.browser={},a)}})(jQuery);
/* - - - - - - - - - - - - - - - - - - - */

var b = $.browser;
console.log($.browser);    //    see console, working example of jQuery Plugin
console.log($.browser.chrome);

for (var x in b) {
    if (x != 'init')
        $('<tr />').append(
            $('<th />', { text: x }),
            $('<td />', { text: b[x] })
        ).appendTo($('table'));
}
table { border-collapse: collapse; }
th, td { border: 1px solid; padding: .25em .5em; vertical-align: top; }
th { text-align: right; }

textarea { height: 500px; width: 100%; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table></table>



0

З офіційної документації за адресою http://api.jquery.com/jQuery.browser/ :

Це властивість було вилучено в jQuery 1.9 і доступне лише через плагін jQuery.migrate.

Ви можете використовувати, наприклад, jquery-migrate-1.4.1.jsщоб ваш існуючий код або плагіни, які використовують $ .browser, все ще працювали, поки ви знайдете спосіб повністю позбутися $ .browser від свого коду в майбутньому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.