Liens hypertexts foireux

Fermé
Duke - 16 mars 2009 à 09:42
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 - 21 avril 2009 à 16:52
Bonjour,

Mon problème est le suivant. J'utilise des liens hypertexts pour naviguer dans mon site. Si la destination du lien se trouve sur la même page que le lien, je ne peux pas revenir au lien de départ en utilisant la commande "précédent" du navigateur. Je vois bien l'adresse changer dans la barre d'URL mais l'affichage reste au même endroit. Si qqn a une idée géniale...

24 réponses

Sandriine Messages postés 1255 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 18 août 2010 283
16 mars 2009 à 09:55
Je suis pas sure d'avoir très bien compris ta question.

Montre le lien en question stp.

Merci
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 921
16 mars 2009 à 09:55
salut,

as-tu une version en ligne ?
0
Merci les filles de vous intéresser à mon problème. Non je n'ai pas de version en ligne... Je ne peux pas vous le montrer, je vais tâcher de m'expliquer un peu mieux:

Imaginez un lien en haut d'une page HTML qui pointe plus bas dans la page, juste pour s'éviter tout le scrolling à la molette ou à l'ascenseur.
Ce que je voudrais, c'est qu'une fois qu'on s'est servi du lien, (autrement dit qu'on est en bas de la page, à la destination du lien) on puisse revenir en haut de la page(au lien lui même) en utilisant la commande "précédent" du navigateur.

Voilà je crois que c'est un peu plus compréhensible, en attendant vos réponses...

Merci d'avance
0
Sandriine Messages postés 1255 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 18 août 2010 283
16 mars 2009 à 12:09
Pourquoi ne met-tu pas un lien de la même façon pour retourner en haut ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Si d'aventure après s'être servi du lien, on continue à naviguer à la molette, on perdrai ce lien de vue. En plus si on utilise un autre lien qui par exemple t'emmène du bas de la page à un autre endroit dans la page, il faudrait que je mette à cette autre endroit un lien pour revenir à l'endroit précédent... Ce serait évidemment bcp plus pratique de se servir des commandes "précédent" et "suivant".
0
vincent170186
16 mars 2009 à 15:36
bonjour !
je vais commencer par uen question a la con :
a tu essayer avec un lien<a href="#top">
ou alors as tu défini une ancre en haut de ta page avec un lien qui te renvoie vers cette ancre ?
si c'est le deuxième cas essaye de mettre la balise <a href="#top">
0
vincent170186
16 mars 2009 à 15:44
oups !!
je crois que je viens de dire de la merde !!!
il faut quand même mettre une ancre avec <a href="#top"> du type <a name='top'>...
si ton lien s'affiche dans ta barre de navigation mais que ça ne change pas ta page. c'est peut être qu'il n'y a pas d'ancre justement .verifie tes ancre ...
au fait tu a essayer sous plusieur ou sur un seul navigateur ?
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
16 mars 2009 à 15:48
Salut Duke,
le retour fonctionne quand la page a été chargée avec une ancre. Je m’explique : une URL qui contient une ancre termine par #nom_de_l_ancre. Dans ta situation, tu navigues comme ceci :
http://monsite.com/

	=> (clic sur l’ancre)

http://monsite.com/#ancre

	=> (précédent)

http://monsite.com/ 


Lorsque tu reviens sur la page sans ancre, le navigateur a gardé le scroll en mémoire. Et comme c’est la même page … il ne change rien.

Pour remédier à cela, on pourrait demander le vidage du cache, mais c’est une mauvaise idée. Le plus simple est de charger la page en précisant qu’on veut être en haut de page. Il faut donc placer une ancre en haut de la page, appelons-la top, puis modifier tous les liens pointant vers cette page.
http://monsite.com/#top

	=> (clic sur l’ancre)

http://monsite.com/#ancre

	=> (précédent)

http://monsite.com/#top 

De cette manière, le navigateur retourne sur l’ancre top et on se retrouve en haut de la page.

Je vois d’ici les critiques : modifier tous les liens, c’est fastidieux et ça donne des URL peu élégantes. Et vous avez raison ! en réalité, la meilleure solution – parmi les plus simples – est celle proposée par Sandriine :

Pourquoi ne mets-tu pas un lien de la même façon pour retourner en haut ?

Sinon tu peux utiliser JavaScript pour mettre en œuvre un lien de retour qui se met automatiquement à hauteur, ou bien – encore plus compliqué – un moteur de manipulation de l’historique (comme sur Facebook, vous avez remarqué ?).

En ce qui concerne l’historique, mes connaissances ne sont pas très solides, mais pour le reste je peux t’aider !

;)


PS : pour le lien qui reste à hauteur, ça serait possible uniquement en CSS (sans JavaScript) si Internet Explorer implémentait correctement la propriété CSS position : fixed. Dommage …
0
Yop Vincent,

Merci pour le conseil mais en fait je me suis servi de cette histoire de haut et de bas de page pour expliquer ce que je cherchais à faire. En réalité, je ne cherche pas une façon de retourner en haut de le page ni d'aller à aucun endroit d'ailleurs.
Ce que je voudrais faire, c'est utiliser un lien hypertext qui m'emmène à un autre endroit de la page et ensuite revenir à l'endroit où j'étais avant en utilisant la commande "précédent" du navigateur.
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
16 mars 2009 à 16:03
Hey Duke,
je crois que je vois ce que tu veux faire. Ma solution passe par JavaScript. L’idée est la suivante :
1/ il y a clic sur une ancre :
2/ je mémorise le scrolling ;
3/ je laisse le navigateur aller normalement vers l’ancre ;
4/ il y a clic sur l’ancre de retour :
5/ je remets le scrolling à sa valeur mémorisée.

Laisse-moi juste le temps de faire quelques tests et je te sors le code ;)
0
Re, désolé pour mon msg n°9, j'avais commencé à le taper avant vos réponses 7 et 8...

Super Groarh, je sens que t'as bien cercé mon pb, je suis pour la solution javascript que t'es en train de concocter mais le truc qui me chagrine c'est que je vois pas comment on pourrai affecter un évenement "onclick"
sur le bouton "précédent" du navigateur. Juste pour info le navigateur est firefox.
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
16 mars 2009 à 16:41
Re,
en fait je n’utilise pas le bouton précédent, mais une ancre de retour. Désolé si je suis un peu long, mais j’essaye de faire ça bien, solide et qui marche aussi sous IE (c’est dur :P) …
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 921
16 mars 2009 à 17:31
re,

<a href="#renvoi1" id="mot1">la première ancre</a>[...]
<a href="#renvoi2" id="mot2">la deuxième ancre</a>
[...]
<a href="#mot1" id="renvoi1">renvoi 1</a>
<a href="#mot2" id="renvoi2">renvoi 12</a>

et oublie pas de lire la signature...
0
Merci Mathieu, mais je crois que t'as pas très bien compris ce que je cherche à faire.

Et Groarh, qu'est-ce que t'appelle une ancre de retour? Une ancre qu'on positionnerait en "fixed" comme si on créait notre propre bouton "précédent"?
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 921
17 mars 2009 à 10:37
salut,

je crois que t'as pas très bien compris ce que je cherche à faire.
ah bon…

pourtant :

1/ il y a clic sur une ancre :
2/ je mémorise le scrolling ;
3/ je laisse le navigateur aller normalement vers l’ancre ;
4/ il y a clic sur l’ancre de retour :
5/ je remets le scrolling à sa valeur mémorisée.

c'est le comportement naturel du navigateur…
0
Re,

Je détaille:

1/ il y a clic sur le lien
2/ je mémorise le scrolling cad on stocke le scrolling (une valeur numérique) qq part en mémoire
3/ on laisse le navigateur aller à la destination du lien
4/ on clic sur l'ancre de retour

c'est là que je ne comprends pas très bien ce que Groarh appelle
une ancre de retour, mais dans mon esprit c un bouton (j'espérais le bouton "précédent" du navigateur) qui lance quand on clic dessus, une fonction javascript qui va réaffecter à l'affichage courant la valeur du scrolling qu'on a stocké au point 2


Ce que tu me propose c juste 2 lien pour aller de bas en haut et de haut en bas. Moi ce que je veux, c un qqch qui me permettent a tout moment et quelquesoit ma position actuelle, de retourner à l'endroit d'ou je viens.
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 921
17 mars 2009 à 12:48
un qqch qui me permettent a tout moment et quelquesoit ma position actuelle, de retourner à l'endroit d'ou je viens.
dans ce cas, moi je le ferais bien avec JS mais pas pour la même chose.
pas besoin de mémoriser la position du scroll, le navigateur le fait pour toi.
tu fais bien des aller/retour, ce qui change c'est que le lien de retour ne doit pas être inséré dans le flux du document mais qu'il soit positionné en absolu par rapport à la page.

donc, dans le contenu tu ajoutes un lien qui pointe vers l'ancre et qui appelle la fonction d'affichage en JS.
cette fonction retourne 'true' pour laisser le navigateur aller jusqu'à l'ancre après traitement et prend le lien lui-même comme paramètre pour récupérer les infos nécessaires à la construction du lien de retour.
<a id="lien1" href="ancre1" onclick="displayBackLink(this)">aller à la cible 1</a>

l'ancre est définie par ailleurs :
[…]blablabla <span id="ancre1">la cible 1</span> blablabla[…]

en JS, tu ajoutes à <body> un paragraphe contenant le lien de retour. ce lien pointe vers le lien passé en paramètre et appelle une fonction de nettoyage (il s'efface lui-même).
function displayBackLink(link)
{
	removeBackLink(); /* à mettre en commentaire pour les 1ers tests */
	var backP = document.createElement("p");
	backP.setAttribute('id', 'backLink');
	backP = document.body.appendChild(backP);
	var backLink = document.createElement("a");
	backLink.setAttribute('href', '#'+link.getAttribute('id'));
	backLink.setAttribute('onclick', 'removeBackLink();');
	var linkText = document.createTextNode('retour vers '+link.getAttribute('id'));
	linkText = backLink.appendChild(linkText);
	backLink = backP.appendChild(backLink);
}
function removeBackLink()
{
	document.body.removeChild(document.getElementById('backLink'));
}

je ne suis pas sûr pour le removeBackLink(), commente la première ligne de displayBackLink() au départ et vérifie que le lien s'ajoute bien au document.

et pour que le lien soit toujours visible, tu le positionnes en CSS :
p#backLink{
position:absolute;
top:10px;
right:10px;
}

je t'ai codé ça de tête, sans tester.
donc si ça correspond à ce que tu cherches ne t'attends pas à ce que ça passe du premier coup !
-;o)
0
A y est, t' as bien pigé ce que je cherchais à obtenir. Ca revient en gros à créer mon propre bouton "précédent". Avant de tester le code et de le mettre au point je voudrais être sûr qu'il n'y a pas moyen d'obtenir ce résultat en utilisant le bouton "précédent" du navigateur.
Le site que je suis en train de faire n'est destiné qu'à être consulté sur un réseau local par des débutants en informatique, donc j'aimerais faire au plus simple et au plus intuitif...
Quoiqu'il en soit je te remercie bcp pour le code Math.
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
17 mars 2009 à 14:05
Bon j'avais posté un truc hier mais visiblement c'est passé à la trappe, puis une meilleure solution a été proposée. Je remets le code pour mémoire :
// variable globale scroll
myScroll = 0;

anchorPart = function(s) {
	/*
		pour les URL : récupère la partie ancre de l'URL
		(après le dièse, inclus)
	*/
	return s.substring(s.indexOf('#'));
} // anchorPart

function myListener(o, e, f) { // objet, event, function
	/*
		gestionnaire d'évènement adapté à tous les navigateurs
	*/
	if (o.addEventListener)
		o.addEventListener(e, f, false) // version standard
	else
		o.attachEvent('on' + e, f) // version IE
} // myListener

function scrollBack(e) {
	/*
		renvoie à l'ancien scroll mémorisé et empêche
		le navigateur de suivre normalement le lien.
		Il est nécessaire de laisser un href au lien,
		pour que l'utilisateur voie qu'il s'agit d'un lien,
		et pour que ça marche aussi si JavaScript est désactivé.
	*/
	if (e.preventDefault)
		e.preventDefault(); // méthode standard
	e.returnValue = false; // méthode IE
	scrollTo(0, myScroll);
} // scrollBack


// on attache les fonctions lorsque toute la page est chargée :
myListener(window, 'load', function() {
	// attachement d'une fonction de mémorisation sur les liens
	var liens = document.getElementsByTagName('a');
	for (var i = 0; i < liens.length; i++) {
		var a = liens.item(i);
		if ('#ancre' == anchorPart(a.href)) {
			myListener(a, 'click', function() {
				myScroll = window.pageYOffset
					|| document.documentElement.scrollTop
			});
		}
	}
	
	// attachement de scrollBack sur le lien de retour
	var retour = document.getElementById('retour');
	myListener(retour, 'click', scrollBack);
});

Ce code est entièrement portable, c.-à-d. compatible avec le plus de navigateurs possibles, et unobstrusive, c.-à-d. qu'il n'y aucune trace de JavaScript dans le body. Il suffit de le placer dans une balise <script> dans le <head>, et il va modifier le comportement de la page grâce à des gestionnaires d'évènements.

Néanmoins, il nécessite la présence des éléments HTML suivants :
– une ancre : <a id="ancre"> ;
– des liens vers l’ancre : <a href="#ancre">, autant qu’on veut ;
– un lien de retour à côté de l’ancre, avec un id pour que le script puisse le manipuler : <a id="retour">.

Et j’ai aussi fait une page Xhtml strict compliant pour illustrer :
http://www.mediaf
ire.com/?3dnm8jnqmiy
(j’ai pas le droit de poster le lien entier, donc recollez les morceaux …)

Edit : En ce qui concerne la manipulation de l’historique, je laisse tomber. Je sais que des applications Ajax comme Facebook ou Google Map savent le faire, mais ce n’est pas encore à ma portée. Pour ceux qui veulent se jeter à l’eau, j’ai trouvé quelque chose d’intéressant ici :
(en) Ajax history service

Bon courage …
;)
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
17 mars 2009 à 16:24
Re (encore :P),

je me suis permis de retoucher ton code à ma façon Mathieu, m’en veux pas, j’adore faire ça ^^
Voilà ce que ça donne, et j’ai testé sous IE, ça marche aussi.
function myListener(o, e, f) {
	if (o.addEventListener)
		o.addEventListener(e, f, false)
	else
		o.attachEvent('on' + e, f);
} // myListener

BackLink = {
	
	p: document.createElement('p'),
	a: document.createElement('a'),
	text: document.createTextNode(''),
	
	create: function(e) {
		with (BackLink) {
			p.id = 'backLink';
			myListener(a, 'click', remove);
			a.appendChild(text);
			p.appendChild(a);
		}
	}, // BackLink.create
	
	display: function(e) {
		var link = e.target || e.srcElement;
		with (BackLink) {
			a.href = '#' + link.id;
			text.data = 'retour vers ' + link.id;
			document.body.appendChild(p);
		}
	}, // BackLink.display
	
	remove: function(e) {
		document.body.removeChild(BackLink.p);
	} // BackLink.remove
	
} // namespace BackLink

function listenToAllLinks() {
	var links = document.getElementsByTagName('a');
	for (var i = 0; i < links.length; i++) {
		var link = links.item(i);
		if ('#ancre1' == link.href.substring(link.href.indexOf('#'))) {
			link.id = 'lien' + i;
			myListener(link, 'click', BackLink.display);
		}
	}
} // listenToAllLinks

/************ initialisation de la page ***************/
myListener(window, 'load', function() {
	listenToAllLinks();
	BackLink.create();
});


La grosse astuce c’est l’utilisation d’un objet anonyme comme espace de noms. Bon j’admets, c’est juste pour la frime !

Une page d’exemple ? Par ici :
medi
afire.com/?cd1mn42ilmx

Voilà, et si y’a des questions, pas de problème je suis là !
;)
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 921
17 mars 2009 à 19:05
je me suis permis de retoucher ton code à ma façon Mathieu, m’en veux pas, j’adore faire ça
mais je t'en prie, c'est fait pour !
-:o)

et ça tombe bien j'ai le temps d'avoir des idées mais pas de coder !
0