2009-06-05 10 views
2

J'ai un site avec navigation d'ancre (comme gmail, quand la valeur d'ancre change un nouveau contenu pour qu'une page soit chargée avec ajax). Dans Firefox, quand je change l'ancre (avec js ou avec une page) un nouvel élément dans l'historique est créé et fonctionne parfaitement. Mais dans IE6, il ne stocke pas ce nouvel élément et le bouton de retour ne fonctionne pas comme prévu.Enregistrer l'ancre dans l'historique ie6

Est-il possible d'ajouter ce nouvel élément en utilisant javascript? C'est possible parce que Gmail le fait mais je ne sais pas comment il le fait.

Répondre

9

J'ai fait un lot du travail avec l'histoire et en utilisant le hachage. Presque tous les plugins d'histoire existants ont une sorte de fossé en eux. Celui que je l'ai utilisé qui est assez proche de la perfection est celui qui est un plugin jQuery:

http://www.mikage.to/jquery/jquery.history.js

Il a été mis à jour en Mars de cette année poignées IE 8 questions et il touche aussi IE6 avec assez de succès. Une chose que j'ai remarqué est que IE déteste vraiment avoir? dans le hachage après le #. Il arrête de gérer correctement le hachage lorsque le? est présent. Même celui-ci, je pense, a besoin d'un petit patch pour le?, J'ai vraiment besoin d'envoyer ça à Mikage. La façon de gérer cela est au lieu d'utiliser location.hash dans le plug-in lors du référencement du hachage, utilisez cette fonction:

function getHash(loc) { 
    loc = loc.toString(); 
    if (loc.indexOf("#") != -1) 
     return loc.substring(loc.indexOf("#")); 
     else return ""; 
} 

Donc, dans ces endroits où vous avez besoin le hachage, passez location la pour fonctionner ...

getHash(location) 

... au lieu d'utiliser location.href. Mais notez que pour IE, parce qu'il utilise l'iframe, vous voulez plutôt utiliser iframe.location.

getHash(iframe.location) 

Bug Yahoo

Vous pouvez voir que Yahoo n'a pas gracieusement poignée de IE quand on regarde cette URL:

http://developer.yahoo.com/yui/examples/history/history-tabview.html#tabview=tab1?7236471234

Il faut simplement ignorer la module inexistant, (ce qu'il fait pour les autres noms qui n'ont pas de? Mais il soulève une erreur JavaScript quand un? est dans l'URL.

(je dirigerai cette liste dans un moment)

vraiment tout simplement l'histoire

Franchement, il est question principale semble être qu'il est parti en sommeil. Je l'ai connu this issue et ne voulait pas creuser à travers elle:

En outre, même si aucun changement semblent ont lieu sur la page pendant que je voyage en arrière à travers l'histoire, l'arrière fonctionnalité sera retourner une fois que j'ai frappé les pages que j'avais été la navigation avant celle en utilisant RSH. Donc, si je cliqué sur quatre liens dans la page RSH, back fonctionnalité retournera après J'ai cliqué sur le bouton de retour quatre fois. J'espère que cela à du sens.

+0

+1 pour les lacunes, mais plus important encore pour le? après #, qui pourrait facilement être le tueur ici – annakata

+0

Je n'avais jamais entendu parler du '#?' question avant. Bon à savoir. –

+0

La chose amusante est, j'ai modélisé ma fonction historique pour travailler exactement comme une URL et pensé que j'étais très intelligent. Après avoir erré en regardant les différentes implémentations et voir si j'avais bien fait, je suis tombé sur facebook, ce qui arrive à utiliser une idée très similaire pour suivre l'histoire. Franchement, je devrais transformer ceci en un plugin plus étoffé qui est complet avec l'analyseur d'URL et le rende conduit par l'événement. – cgp

0

Je pense que vous pouvez avoir un problème différent. IE6 gère certainement # liens dans l'histoire comme il devrait pour moi sur une page de test donnée, donc je crois que vous avez soit brisé ce en quelque sorte ou vous avez un bug avec votre version particulière de IE.

Je vous suggère d'essayer quelques copies et versions différentes d'IE6 sur d'autres machines pour exclure ce dernier, puis essayez de simplifier votre code et de le reconstruire pour voir si et quand le problème apparaît. Désactiver JS peut (html dépend) être un moyen rapide de tester cela.

Si tout le reste échoue, je vous suggère de regarder Really Simple History qui (la dernière fois que j'ai vérifié) résout presque tous les problèmes JS/histoire vous pouvez jeter.