Dans les versions précédentes, j'avais l'habitude de tester si je devais déclencher popstate
manuellement au chargement de la page, car Chrome le déclenchait juste après le chargement, contrairement à Firefox et IE.
if ($.browser.mozilla || $.browser.msie) {
$(window).trigger('popstate');
}
Maintenant qu'ils ont abandonné l'objet de navigateur dans la version 1.9, comment devrais-je tester ces navigateurs? Ou comment puis-je déterminer si je dois popstate
au chargement de la page ou non?
Le code est:
$(function(){
$(window).on('popstate', popState);
// manual trigger loads template by URL in FF/IE.
if ($.browser.mozilla || $.browser.msie) {
$(window).trigger('popstate');
}
});
Je suis allé pour ça:
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');
});
}
Vous devez ajouter un peu de contrôle de cohérence à votre gestionnaire popstate
et assurez-vous qu'il ne fait rien de coûteux si vous "sautez" dans le même état que celui dans lequel vous avez démarré. Ensuite, vous ne pouvez pas vous soucier du navigateur, mais appelez simplement votre popstate sur le document prêt:
$(function(){
$(window).on('popstate', popState);
// call popstate on document ready
$(popstate);
});
La réponse qui vous suggère de coller le code à partir de $.browser
dans votre environnement est trop longue pour supporter une mauvaise pratique. Vous pouvez détecter 99% des choses dont vous avez besoin. Presque chaque utilisation de $.browser
est dangereuse. Il y a presque toujours des moyens de détecter cela.
La communauté JavaScript s'oppose depuis longtemps à la détection de navigateur. Ici est un article de 2009 nous expliquant pourquoi c'est une mauvaise idée. Il y en a beaucoup d'autres.
Je vous prie de ne pas copier le $.browser
dans votre code, l'équipe de jQuery a décidé de le tuer pour une raison.
Ici est un moyen rapide de résoudre ce problème . Ajoutez cette ligne de codes à votre jQuery-1.9.js et remplacez $ .browser par 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());
Je suppose que mettre ce code ferait l'affaire pour vous. N'oubliez pas d'apporter des modifications si vous avez besoin selon vos besoins.
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;
Nous déconseillons d'utiliser cette propriété; S'il vous plaît essayez d'utiliser la fonctionnalité détection à la place (voir jQuery.support). jQuery.browser peut être déplacé vers un plugin dans une future version de jQuery.
ce lien pourrait vous aider si vous voulez https://github.com/jquery/jquery-migrate/#readme