Je cherche à utiliser l'API de l'historique HTML5 pour résoudre des problèmes de liaison profonds avec le contenu chargé AJAX, mais j'ai du mal à décoller. Est-ce que quelqu'un connaît de bonnes ressources?
Je veux utiliser ceci, car cela semble être un excellent moyen de permettre à JS de ne pas activer les liens. De nombreuses solutions échouent lorsqu'une personne avec JS envoie un lien à une autre personne.
Ma recherche initiale semble indiquer une API d’historique au sein de JS et la méthode pushState.
Pour un bon tutoriel, la page Réseau de développeurs Mozilla sur cette fonctionnalité est tout ce dont vous avez besoin: https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history
Malheureusement, l’API d’historique HTML5 est implémentée différemment dans tous les navigateurs HTML5 (ce qui la rend incohérente et boguée) et n’a aucune solution de secours pour les navigateurs HTML4. Heureusement, History.js assure la compatibilité croisée des navigateurs HTML5 (garantissant que tous les navigateurs HTML5 fonctionnent comme prévu) et fournit éventuellement un repli par hachage pour les navigateurs HTML4 (y compris la prise en charge maintenue des données, des titres, des pushState). et remplacer la fonctionnalité État).
Vous pouvez en savoir plus sur History.js ici: https://github.com/browserstate/history.js
Pour un article sur Hashbangs VS Hash VS HTML5 History API, voir ici: https://github.com/browserstate/history.js/wiki/Intelligent-State-Handling
"Plongez dans HTML 5" m'a beaucoup apporté. L'explication et la démo sont plus simples et pertinentes. Chapitre d'histoire - http://diveintohtml5.info/history.html et démo d'histoire - http://diveintohtml5.info/examples/history/fer.html
Gardez à l'esprit lorsque vous utilisez HTML5 pushstate si un utilisateur copie ou marque-pages d'un lien profond et le visite à nouveau, ce sera un hit direct sur le serveur qui sera 404 donc vous devez être prêt et même une bibliothèque pushstate js ne vous aidera pas. toi. La solution la plus simple consiste à ajouter une règle de réécriture à votre serveur Nginx ou Apache, comme suit:
Apache (dans votre vhost si vous en utilisez un):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>
Nginx
rewrite ^(.+)$ /index.html last;
Le spec historique de HTML5 est original.
history.pushState()
ne distribue pas un événement popstate
ni ne charge une nouvelle page par elle-même. C'était seulement pour pousser l'état dans l'histoire. Ceci est une fonctionnalité "annuler" pour les applications de page unique. Vous devez distribuer manuellement un événement popstate
ou utiliser history.go()
pour accéder au nouvel état. L'idée est qu'un routeur peut écouter popstate
événements et faire la navigation pour vous.
Quelques points à noter:
history.pushState()
et history.replaceState()
ne distribuent pas les événements popstate
.history.back()
, history.forward()
et les boutons précédent et suivant du navigateur distribuent les événements popstate
.history.go()
et history.go(0)
effectuent un rechargement de page complète sans envoyer d'événements popstate
.history.go(-1)
(page précédente) et history.go(1)
(page suivante) distribuent les événements popstate
.Vous pouvez utiliser l'API d'historique comme ceci pour envoyer un nouvel état ET envoyer un événement popstate.
history.pushState({message:'New State!'}, 'New Title', '/link'); window.dispatchEvent(new PopStateEvent('popstate', { bubbles: false, cancelable: false, state: history.state }));
Ensuite, écoutez les événements popstate
avec un routeur.
Voici une excellente projection d’écran sur le sujet réalisée par Ryan Bates. À la fin, il désactive simplement la fonctionnalité ajax si la méthode history.pushState n'est pas disponible:
Vous pouvez essayer Davis.js , il vous donne le routage dans votre JavaScript en utilisant pushState lorsque disponible et sans JavaScript, il permet à votre code côté serveur de traiter les requêtes.
Vous voudrez peut-être jeter un coup d'œil à ce plugin jQuery. Ils ont beaucoup d'exemples sur leur site. http://www.asual.com/jquery/address/
J'ai écrit une abstraction de routeur très simple au-dessus de History.js, appelée StateRouter.js . C'est au tout début du développement, mais je l'utilise comme solution de routage dans une application d'une page que j'écris. Comme vous, j’ai trouvé History.js très difficile à comprendre, d’autant plus que j’étais assez nouveau en JavaScript, jusqu’à ce que je comprenne que vous avez vraiment besoin (ou devriez avoir) une abstraction de routage par dessus, car elle résout les problèmes de bas niveau. problème.
Cet exemple de code simple devrait montrer comment il est utilisé:
var router = new staterouter.Router();
// Configure routes
router
.route('/', getHome)
.route('/persons', getPersons)
.route('/persons/:id', getPerson);
// Perform routing of the current state
router.perform();
Voici un peu violon Je l'ai concocté afin de démontrer son utilisation.
si jQuery est disponible, vous pouvez utiliser BBQ jQuery