Avez-vous remarqué en parcourant l'album photo Facebook que lorsque la page est partiellement rafraîchie, l'adresse dans la barre d'adresse change également, et ce n'est pas dans une méthode de hachage. Il utilise plusieurs nouvelles API de l'historique HTML5. En tant que variable globale de fenêtre, l'historique n'a rien de nouveau à l'ère du HTML4. Ceux que nous utilisons souvent sont history.back() et history.go().
J'ai toujours pensé qu'il n'y avait aucun moyen de le faire, jusqu'à ce que je voie la solution de Robin Ward, l'un des fondateurs de Discourse, il y a deux jours, et je n'ai pas pu m'empêcher d'être étonné.
Discourse est un programme de forum qui s'appuie fortement sur Ajax, mais il doit permettre à Google d'inclure le contenu. Sa solution consiste à abandonner la structure du signe dièse et à adopter l'API History.
L'API dite d'historique fait référence à la modification de l'URL affichée dans la barre d'adresse du navigateur sans actualiser la page (pour être précis, elle modifie l'état actuel de la page Web). Voici un exemple où vous cliquez sur le bouton ci-dessus pour commencer à jouer de la musique. Ensuite, cliquez à nouveau sur le lien ci-dessous et voyez ce qui se passe ?
L'URL dans la barre d'adresse a changé, mais la lecture de la musique n'est pas interrompue !
Une introduction détaillée à l’API History dépasse le cadre de cet article. En termes simples, sa fonction est d'ajouter un enregistrement à l'objet Historique du navigateur.
La ligne de commande ci-dessus peut faire apparaître une nouvelle URL dans la barre d'adresse. La méthode pushState de l'objet History accepte trois paramètres. La nouvelle URL est le troisième paramètre. Les deux premiers paramètres peuvent être nuls.
window.history.pushState(null, null, newURL);
exemple.com/2
exemple.com/3
function anchorClick(link) { var linkSplit = link.split('/').pop(); $.get('api/' + linkSplit, function(data) { $('#content').html(data); }); }
$('#container').on('click', 'a', function(e) { window.history.pushState(null, null, $(this).attr('href')); anchorClick($(this).attr('href')); e.preventDefault(); });
window.addEventListener('popstate', function(e) { anchorClick(location.pathname); });
<html> <body> <section id='container'></section> <noscript> ... ... </noscript> </body> </html>