Обнаружение браузера jQuery 1.9
В более ранних версиях я использовал для проверки, должен ли я запускать popstate
вручную при загрузке страницы, потому что Chrome запускает его сразу после загрузки, а Firefox и IE этого не делают.
if ($.browser.mozilla || $.browser.msie) {
$(window).trigger('popstate');
}
Теперь, когда они сбросили объект браузера в 1.9, как мне проверить эти браузеры? Или как мне понять, нужно ли мне popstate
на загрузке страницы или нет?
Код:
$(function(){
$(window).on('popstate', popState);
// manual trigger loads template by URL in FF/IE.
if ($.browser.mozilla || $.browser.msie) {
$(window).trigger('popstate');
}
});
Update
Пошел для этого:
function popState(e){
var initial = e.originalEvent === undefined || e.originalEvent.state === null;
if(!initial){
activateRoute({
key: e.originalEvent.state.key,
settings: e.originalEvent.state.settings
},'replace');
}
}
function init(){
$(window).on('popstate', popState);
$(function(){
var route = getRoute(document.location.pathname);
activateRoute(route, 'replace');
});
}
Ответы
Ответ 1
Вы должны добавить небольшую проверку работоспособности к своему обработчику popstate
и убедиться, что он не делает ничего дороже, если вы "поп" в том же состоянии, в котором вы начали. Тогда вам не все равно, и вместо этого просто назовите свой popstate на готовом документе:
$(function(){
$(window).on('popstate', popState);
// call popstate on document ready
$(popstate);
});
Ответ, предполагающий, что вы вставляете код из $.browser
обратно в вашу среду, - это излишний способ поддержки плохой практики. Вы можете обнаружить 99% вещей, которые вам нужны. Почти любое использование $.browser
опасно. Почти всегда есть способы обнаружить это.
Сообщество JavaScript уже давно не работает с браузером. Здесь - сообщение от 2009 года, рассказывающее нам, почему это плохая идея. Есть много других.
Я прошу вас не копировать $.browser
обратно в ваш код, команда jQuery решила убить его по какой-то причине.
Ответ 2
Здесь - это быстрый способ решить эту проблему.
Добавьте эту строку кодов в jQuery-1.9.js и замените $.browser на jQuery.browser
jQuery.browser = {};
jQuery.browser.mozilla = /mozilla/.test(navigator.userAgent.toLowerCase()) && !/webkit /.test(navigator.userAgent.toLowerCase());
jQuery.browser.webkit = /webkit/.test(navigator.userAgent.toLowerCase());
jQuery.browser.opera = /opera/.test(navigator.userAgent.toLowerCase());
jQuery.browser.msie = /msie/.test(navigator.userAgent.toLowerCase());
здесь
Ответ 3
Я предполагаю, что этот код сделает трюк для вас. Не забудьте внести изменения, если вам нужно согласно вашему требованию.
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 Docs
Мы не рекомендуем использовать это свойство; попробуйте использовать функцию (см. jQuery.support). jQuery.browser может быть перемещен в плагин в будущей версии jQuery.
jQuery.browser
jQuery.support
Ответ 4
эта ссылка могла бы оборвать ее, если вы хотите https://github.com/jquery/jquery-migrate/#readme