2010-10-29 9 views
13

J'essaie d'implémenter la navigation de contenu comme c'est fait sur Facebook lorsque l'utilisateur parcourt les photos. Je suppose que tout le monde est familier avec cette navigation photo où vous pouvez cliquer sur "suivant" et "précédent" et obtenir immédiatement la photo suivante ou précédente (vous pouvez également naviguer en utilisant les touches fléchées). Lorsque vous cliquez sur "Suivant", par exemple, vous remarquez que la page ne s'actualise pas - seulement le contenu. Au début, je pensais que c'est fait en utilisant des appels ajax ordinaires qui rafraîchissent seulement le "contenu" dans ce cas l'image, la description et les commentaires. Mais alors j'ai remarqué que l'URL dans la barre d'outils "Emplacement" de mon navigateur est également modifiée! J'ai essayé d'inspecter cela en utilisant Firebug et j'ai découvert que lorsque vous cliquez sur "next", seule la photo suivante est téléchargée et je ne sais toujours pas d'où proviennent les métadonnées image (description, heure, tags, ...) chargé. Est-ce que quelqu'un peut expliquer comment cette technique est faite - l'URL de la page change sans rafraîchissement de la page (ou même sans page "clignotant" si elle rafraîchit du cache). Je sais comment changer le contenu de la page en utilisant ajax mais l'URL de cette page reste la même tout le temps. Si je clique sur le bouton "Actualiser", j'obtiens à nouveau la première page. Mais pas sur Facebook puisque même le "window.location" est changé à chaque fois sans redirection réelle.Page "Rediriger" sans rafraîchissement (style de photos Facebook)

L'autre chose que j'ai remarqué est que la barre d'outils inférieure (applications, chat, ...) est "toujours au top". Même si vous changez la page, cette barre d'outils n'est pas actualisée et reste toujours en haut - elle ne clignote même pas comme les autres pages qui sont actualisées (à partir du serveur Web ou du cache local). Je suppose que c'est la même technique que ci-dessus - une sorte de "faux" redirections ou quelque chose?

La réponse est pushState

if (window.history.pushState) 
    window.history.pushState([object or string], [title], [new link]); 

Vous sourire :)

+2

Pour ce que ça vaut la peine [ History.js] (https://github.com/balupton/History.js) fournit la même API HTML5 tout en dégradant tout navigateur qui ne le prend pas en charge (y compris la prise en charge des données et des titres, et la fonctionnalité replaceState). L'utilisation de cela signifierait que vous n'auriez pas à modifier votre code pour les changements IE9. – balupton

Répondre

5

J'ai essayé de changer à travers des images facebook, et voici ce que j'ai vu:

Dans Firefox :

L'URL de la page ne change pas. Seul le hash change. This is a technique used to allow crawlers to index the content. Ce qui se passe est le suivant:

  • utilisateur clique sur « suivant »
  • JS charge l'image suivante avec des balises, commentaires, etc et remplace l'ancien contenu avec eux.
  • JS modifie le hachage pour correspondre à la nouvelle image

urls ressemblent à ceci: http://www.facebook.com/home.php?#!/photo.php?fbid=1550005942528966&set=a.1514725882151300.28042.100000570788121&pid=3829033&id=1000001570788121 (notez le hachage)

En ce qui concerne la deuxième question, c'est juste un avantage de la technique ci-dessus. Lorsque vous êtes sur facebook, la page est rarement actualisée. Seul le hachage est modifié afin que vous puissiez envoyer des liens vers d'autres personnes et que les robots d'indexation puissent indexer le contenu.

Dans Google Chrome:

Il semble que manière Eprouve quelques chrome pour changer urls sans rafraîchir la page. Il le fait en utilisant window.history.pushState. Lisez à ce sujet here.

urls ressemblent à ceci: http://www.facebook.com/photo.php?fbid=1613802157224343&set=a.1514725288215100.28042.1000005707388121&pid=426541&id=1000001570788121 (notez qu'il n'y a pas de hachage ici, mais l'URL change ainsi que des images)

En Epiphany:

Epiphanie ne change pas l'URL lorsque l'image change.

urls ressemblent à ceci: http://www.facebook.com/photo.php?fbid=1441817122377521&set=a.1514725882215100.28042.1000005707848121&pid=3251944&id=1000200570788121 (il n'y a pas de hachage, et l'URL reste le même lors de la modification de l'image)

(ne pas avoir d'autres navigateurs pour vérifier en ce moment)

+0

D'accord. Merci pour l'explication, je vais ajouter mon code à propos de pushState en question. –

+0

Peut-être que le moment où vous avez répondu à cela, ils ont utilisé des changements de hachage pour charger de nouvelles images, mais maintenant, lorsque vous cliquez sur le bouton suivant, l'URL elle-même est modifiée mais ne rafraîchit pas. Et même lorsque vous cliquez sur Top news dans l'URL de la page d'accueil, les modifications ne sont pas actualisées. Je suis vraiment curieux de savoir comment cela fonctionne. – Sridarshan

+0

@UberGeek AFAIK firefox (je suppose que vous en parlez) a le support de 'window.history.pushState' dans les nouvelles versions –

0

Vous pourriez remarquer que l'URL de la page reste la même. Ce qui est changé, cependant, c'est la page hash (la partie après # dans l'url).

Vous avez besoin quelque chose comme ceci: http://code.google.com/p/reallysimplehistory/

+0

Ce n'est pas correct. Les URL d'image apparaissent comme 'http: //www.facebook.com/photo.php? Fbid = 135122293393816 & set = t.1575828580 & pid = 8182864 & id = 15752828580' dans ma barre d'URL de chrome et il n'y a pas de' # 'dedans. –

+0

@Gabi: Chrome prend en charge window.history.pushState. Par conséquent, dans Chrome, il est possible de modifier la barre d'URL sans forcer le rechargement. Dans d'autres navigateurs (Firefox, IE), la barre d'URL n'est modifiable que par la méthode window.location.hash qui ajoute des données de changements (ou les récupère) après une balise de hachage à la fin de l'URL. –

2

La méthode (prise en charge dans IE8 + et la plupart des autres) une technique non mentionnée est le window.onhashchange() qu'ils auraient pu utiliser

+0

Je crois que c'est exactement ce qui se passe plutôt que l'inverse. Les liens suivant et précédent modifient simplement le hachage et le code JavaScript réagit et charge la photo correspondante. – Tallmaris

Questions connexes