2009-07-01 5 views
3

Il me semble qu'il me manque quelque chose de complètement élémentaire. Ce que j'essaye de réaliser ressemble à un cas assez commun, et ainsi je me demande pourquoi il n'y a pas de manière directe.Forcer la mise à jour de la page et passer à une section #

Le problème est que je voudrais actualiser la page courante de JavaScript et atterrir simultanément sur une section #. Si je fais simplement:

document.location.href = document.location.href + "#section"; 

tous les navigateurs que j'ai testés, faites défiler jusqu'à la section # (pas de rechargement). Cela a du sens d'une certaine manière. Juste pour être complet, si je

document.location.assign(document.location.href + "#section"); 

il fait la même chose (il fallait s'y attendre, cela se résume en interne à la même fonction pour sûr). Enfin, l'objet document semble avoir aussi la fonction document.reload() qui prend un argument booléen optionnel spécifiant si je veux forcer le rechargement, mais évidemment, il ne permet pas de spécifier la section #. La seule façon que je pouvais trouver (l'utilisation de ces méthodes) est la combinaison suivante:

document.location.assign(document.location.href + "#section"); 
document.location.reload(); 

Mais ce n'est pas idéal, car comme vous l'avez probablement deviné, il défile et rechargements qui provoque le navigateur pour faire défiler en fait trois fois à la fin.

Je sais qu'il y a des façons de contourner cela: redirection côté serveur ou en ajoutant un paramètre de chaîne de requête aléatoire unique, mais il semble étrange qu'il n'y a pas de manière simple.

+1

La question évidente est: pourquoi le monde ne la page besoin de recharger? –

Répondre

1

C'est la valeur de "hachage" de l'objet de localisation. Vous devez définir comme ça ...

location.hash = "#section"; 

Si cela est le cas, vous pourriez vouloir travailler pas toujours envisager d'utiliser une fonction scrollToElement ...

function scrollToElement(elem) { 
    if(typeof elem == 'string') elem = document.getElementById(elemId); 
    var top = 0; 

    if(elem) { 
     if(elem.offsetParent) { 
      top = elem.offsetTop; 

      while(elem = elem.offsetParent) { 
       top += elem.offsetTop; 
      } 
     } 

     window.scrollTo(0, top); 
    } 

} 

Si vous absolument besoin d'un reload la page (ne sais pas pourquoi vous ne le ferait), essayez d'ouvrir une fenêtre en lui-même ...

window.open(location.href + '#section', '_top'); 

Ou essayez remplacer ...

location.replace(location.href + '#section'); 
+0

Merci. Je n'ai pas pensé à window.open(), mais je l'ai juste testé, et si je ne me trompe pas, il se comporte de la même manière. Il ne fait que défiler et ne déclenche pas un rechargement complet. –

+0

Je sais que ça sonne peut-être un peu louche (forçant un réel), et c'est peut-être le cas et je le changerai plus tard. Mais c'est pour la première version de l'application sur laquelle je travaille et la priorité est d'avoir une version de travail complète, puis de peaufiner les détails. Mais en tout cas, j'ai été surpris que quelque chose que je m'attendais à faire facilement en JavaScript n'est pas si facile après tout. –

0

Il y a une solution beaucoup plus simple:

if (document.location.href.match(/[?]/)) 
    document.location.href = document.location.href + '&fake_param=' + Math.random() + '#section' ; 
else  
    document.location.href = document.location.href + '?fake_param=' + Math.random() + '#section' ; 
+0

Corbeille dans l'URL? Non, merci. –

Questions connexes