2009-09-05 7 views
5

J'ai une page avec deux onglets que je veux être en mesure de passer avec Javascript, mais aussi définir l'ancre (par exemple page.html#tab1) dans l'URL pour bookmarking/liaison.Activer l'ancre URL mais ne pas y accéder?

Par défaut, le contenu de l'onglet est divisé en deux, l'un en dessous de l'autre, et l'étiquette d'ancrage défilera vers la bonne, JS étant désactivé.

Avec JS activé, les classes CSS sont appliquées pour les faire fonctionner comme des onglets. Chaque onglet est lié à chaque ancre, mais lorsque vous cliquez pour changer d'onglet, la page défile vers l'onglet. Si je renvoie false à partir de la fonction onclick, l'URL ne change pas pour inclure l'ancre.

Comment faire pour que l'URL du navigateur passe à page.html#tab1 mais pas à #tab1?

Répondre

5

J'ai joué avec cela pendant un moment, parce que je ne vous croyais pas initialement (j'utilise le jQuery history plugin pour obtenir un comportement similaire).

Et je suis perplexe. Je ne pense pas que tu puisses. Ce que vous pouvez faire, comme une solution de contournement, est use javascript to set the hash to something DIFFERENT from what is actually on the page. Et puis utilisez javascript au chargement pour lire le hachage et remplir le contenu correct. I do this on my site. Donc, dans ce scénario, les utilisateurs sans javascript seraient défilés, les utilisateurs avec javascript garderaient la chaîne d'historique, et il devient seulement loufoque lorsque les gens sans envoyer des liens aux personnes avec (ou vice versa).

+0

Cela fonctionne, et je viens de découvrir que c'est ce que fait validator.w3.org. Finalement, j'ai décidé d'abandonner l'ancrage au bon endroit dans les navigateurs non-JS, car les deux divs ne sont pas très grands, et comme vous le dites, les liens des utilisateurs JS pour les non-JS l'arrêtent. – DisgruntledGoat

-1
window.location.hash = 'tab1'; 

peut fonctionner.

+1

Non, il ne le fera pas, cela fera défiler vers l'ancre (sauf dans Safari dans certains cas, grâce à son emplacement broken.hash). – andynormancx

0

Pourriez-vous avoir du Javascript qui a changé les noms des ancres, définir window.location.hash, puis changé les noms d'ancre?

(J'ai confirmé que andynormancx a raison, et la configuration de window.location.hash fait défiler la vue, mais je suis trop fainéant pour tester si la création d'une ancre dans le DOM à window.location.hash défile aussi.)

0
var Namespace = { 
    var timer, scroll; 
} 

// Onclick 
Namespace.scroll = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop; 
Namespace.timer = setInterval(function() { scrollTo(0, Namespace.scroll) }, 100); 
location.hash = this.href; 
clearInterval(Namespace.timer); 
1

Un hack rapide:

var thehash = e.target.hash; 
$(thehash).prop('id',thehash.substr(1)+'-noscroll'); 
window.location.hash = e.target.hash; 
$(thehash+'-noscroll').prop('id',thehash.substr(1));  

Cela change l'id de l'élément HTML avant et après avoir modifié le hachage de l'URL. Fonctionne pour moi, mais pourrait aussi bien casser quelque chose. Cela empêche le navigateur de faire défiler un changement de hachage, car il n'y a pas d'élément html avec cet identifiant entre les deux.

+0

Cela a fonctionné pour moi (ne m'y attendais qu'à moitié). Il a certainement une qualité similaire à celle d'un hack, mais n'a pas rencontré de problèmes jusqu'à présent. –

Questions connexes