Empêcher le navigateur de scroller vers une ancre

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
Répondre
Conrad

Empêcher le navigateur de scroller vers une ancre

Message par Conrad »

Bonjour,

je suis actuellement confronté à un problème que je n'arrive pas à résoudre :
afin de garder la possibilité d'utiliser l'historique des navigateurs tout en exécutant de l'Ajax, j'utilise les ancres pour modifier la barre d'adresse.

Le problème est donc le suivant : lorsque le navigateur change la barre d'adresse en ajoutant une ancre, il remonte la page automatiquement en haut, si l'ancre n'existe pas réellement.

Par exemple j'appelle http://www.test.com/script.html, puis une fonction Javascript appelle l'URL http://www.test.com/script.html#couleur:bleu

Aucun élément d'id "couleur:bleu" n'existe, le navigateur remonte la page au début.

J'ai d'abord pensé à utiliser une astuce avec la fonction scrollTo de Scriptaculous, qui permet de naviguer de façon fluide vers une ancre (au lieu de sauter vers celle-ci), puis de lui mettre une durée d'exécution énorme, qui donne l'impression que la page ne bouge pas. Ça fonctionne un peu trop bien, car la page ne bouge pas, mais il est impossible de scroller ensuite.

J'ai ensuite pensé à utiliser l'option "offset" de la fonction scrollTo, pour faire revenir le navigateur au pixel où à cliqué l'utilisateur. Mais ça donne une désagréable impression que la page remonte puis redescend en une fraction de seconde.

___________

Y-a-t'il un moyen pour empêcher le navigateur de scroller vers le haut de la page, si l'ancre n'existe pas ?


Merci d'avance !

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Tu as regardé http://www.deviantart.com/ ? Il ne me semble pas qu'on remonte en haut (mais je ne suis pas 100% sur)
Conrad

Message par Conrad »

Merci du lien, j'ai cherché sur plusieurs pages s'il y avait des appel en ancre, mais à par un système qui permet de voter, je n'en ai pas vu (et la page remonte après le vote).

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

D'habitude j'y accède depuis chez moi, avec un plus grand écran où tout tient dans un seul écran... effectivement depuis un écran plus petit on remonte.
En fait je pensais par exemple aux galleries des utilisateurs, p.ex au bol : http://hibbary.deviantart.com/gallery/#_featured--2
On remonte mais pas tout en haut. Mais l'ancre doit probablement exister.

Pourquoi ne pas créer ces ancres ? Ca ne doit pas être très compliqué en javascript, avant d'appeler l'ajax...
Conrad

Message par Conrad »

Bon, à force de me creuser la tête, j'ai trouvé une solution.

Déjà il faut savoir que le problème de retour au haut de la page ne se pose pas avec IE6 et 7 (Internet Explorer semble se foutre que l'on change l'url de toute façon).

La correction n'est donc à effectuer que pour les navigateurs Webkit (Safari, Chrome, Opera) et Gecko (Firefox).

Le principe c'est de faire flotter une div invisible en permanence en haut de l'écran. Lorsque l'url est modifié, on enregistre la position de cette div, puis on demande à la page de scroller à l'ancienne position de la div.

Avec cette méthode on retourne bien à la position d'origine, mais on peu observer un léger clignotement (vu que la page remonte puis redescend en une fraction de seconde). C'est le mieux que j'ai réussi à faire malheureusement, et ce "clignotement" est presque indiscernable sur Firefox et Safari, et carrément inexistant sur Opera et Chrome.

L'exemple : http://conradsonblog.appspot.com/test/ancres_test.html

Exemple de code :

Code : Tout sélectionner

<div id="hash_position" style="position:absolute;"></div>

<script type="text/javascript">
// pour garder une div toujours en haut de la page, si on est pas sur IE
if (!document.all) { setInterval("positionHash()",100); }
function positionHash(){
       var hashTop = pageYOffset;
        hash_position.style.top = hashTop+"px";
}

// on modifie le "hash", puis on repositionne la fenêtre
window.location.hash = color_line;
current_hash = window.location.hash;
if (!document.all) {
    window.scrollBy(0,ypox);
}
</script>

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5
Avatar de l’utilisateur
ra-mon
Varan
Messages : 1540
Inscription : 16 janv. 2004, 09:51

Message par ra-mon »

Salut,
La correction n'est donc à effectuer que pour les navigateurs Webkit (Safari, Chrome, Opera)
Opera n'utilise pas le moteur de rendu Webkit. Il utilise son propre Presto "fait maison" dont le nom figure désormais dans le User-Agent de la bête.
@+
--
Pierre

Message envoyé avec : Opera/10.00 (Windows NT 5.1; U; fr) Presto/2.2.0
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Ca c'est malin comme technique ! :)
Conrad a écrit :Avec cette méthode on retourne bien à la position d'origine, mais on peu observer un léger clignotement (vu que la page remonte puis redescend en une fraction de seconde).
On dirait en effet que ça remonte en haut. Je pense qu'il s'agit d'un bug (vu mes connaissances en javascript, je n'en suis pas sûr). Étant donné que tu as un exemple minimum, ça pourrait être utile de le soumettre sur Bugzilla (vérifie qu'il n'existe pas déjà).
bormat
Varan
Messages : 1545
Inscription : 01 juil. 2008, 18:22

Message par bormat »

c'est assez satisfaisant je trouve on ne vois que aller en bas 1/5 de seconde à peine

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5
https://addons.mozilla.org/en-US/firefox/addon/113517 mon theme en ligne compatilble ff2et 3
bormat
Varan
Messages : 1545
Inscription : 01 juil. 2008, 18:22

Message par bormat »

la page à disparu et je me demander comment faire pour faire des ancre comme celle-ci
je croyais que les ancre amené à une partie de la page et la celon #blue #red
on avait un e page différente

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6
https://addons.mozilla.org/en-US/firefox/addon/113517 mon theme en ligne compatilble ff2et 3
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

bormat a écrit :la page à disparu et je me demander comment faire pour faire des ancre comme celle-ci
je croyais que les ancre amené à une partie de la page et la celon #blue #red
on avait un e page différente
On a la même page, simplement l'ancre provoque un appel ajax qui fait que son contenu est changé dynamiquement !
bormat
Varan
Messages : 1545
Inscription : 01 juil. 2008, 18:22

Message par bormat »

calimo a écrit :
bormat a écrit :la page à disparu et je me demander comment faire pour faire des ancre comme celle-ci
je croyais que les ancre amené à une partie de la page et la celon #blue #red
on avait un e page différente
On a la même page, simplement l'ancre provoque un appel ajax qui fait que son contenu est changé dynamiquement !
salut merci ,ok c'est de l'ajax je ne suis pas encore à là

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6
https://addons.mozilla.org/en-US/firefox/addon/113517 mon theme en ligne compatilble ff2et 3
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 4 invités