J'ai plusieurs liens qui ont tous des identifiants uniques qui sont des "pseudo-ancres". Je veux qu’ils affectent la valeur de hachage de l’URL et la magie du clic est gérée par du code mootools. Cependant, lorsque je clique sur les liens, ils défilent vers eux-mêmes (ou vers le haut dans un cas). Je ne veux pas faire défiler n'importe où, mais j'ai également besoin de mon javascript pour s'exécuter et pour avoir la valeur de hachage dans la mise à jour de l'URL.
Exemple de code simulé:
<a href="#button1" id="button1">button 1</a>
<a href="#button2" id="button2">button 2</a>
<a href="#" id="reset">Home</a>
Donc, si vous deviez cliquer sur le lien "bouton 1", l'URL pourrait être http://example.com/foo.php#button1
Est-ce que quelqu'un a des idées pour ça? Avoir juste un peu de javascript return tue le défilement mais tue aussi mon javascript (bien que je puisse probablement le contourner avec un onclick), mais plus important encore, empêche la valeur de hachage dans l'URL de changer.
Je manque probablement quelque chose, mais pourquoi ne pas simplement leur donner des identifiants différents?
<a href="#button1" id="button-1">button 1</a>
<a href="#button2" id="button-2">button 2</a>
<a href="#" id="reset">Home</a>
Ou quelle que soit la convention que vous préférez.
L'intérêt d'un lien d'ancrage est de faire défiler une page vers un point particulier. Donc, si vous ne voulez pas que cela se produise, vous devez attacher un gestionnaire onclick
et renvoyer false. Même en l'ajoutant comme attribut, ça devrait marcher:
<a href="#button1" id="button1" onclick="return false">button 1</a>
L'un des effets de ce qui précède est que l'URL elle-même ne changera pas, car renvoyer false annulera l'événement. Ainsi, puisque vous souhaitez que l'URL change réellement, vous pouvez définir la variable window.location.hash
sur la valeur souhaitée (il s'agit de la seule propriété de l'URL que vous pouvez modifier sans que le navigateur ne force le rechargement). Vous pouvez probablement attacher un gestionnaire d'événements et appeler quelque chose comme window.location.hash = this.id
même si je ne suis pas sûr de savoir comment mootools gère les événements.
(De plus, tous les identifiants doivent être uniques)
Vous pouvez utiliser le code ci-dessous pour éviter le défilement:
<a href="javascript:void(0);">linktxt</a>
De plus, preventDefault
$(your-selector).click(function (event) {
event.preventDefault();
//rest of your code here
}
J'ai trouvé la solution. Ici, je sauvegarde un ancien emplacement de l’appel href Et le restaure après le défilement.
<script language="JavaScript" type="text/javascript">
<!--
function keepLocation(oldOffset) {
if (window.pageYOffset!= null){
st=oldOffset;
}
if (document.body.scrollWidth!= null){
st=oldOffset;
}
setTimeout('window.scrollTo(0,st)',10);
}
//-->
</script>
et dans le corps de la page
<a href="#tab1" onclick="keepLocation(window.pageYOffset);" >Item</a>
Merci à sitepoint
Une solution plus simple consisterait probablement à l’ajouter en tant que GET. C'est-à-dire, http://example.com/foo.php?q=#button1
au lieu de http://example.com/foo.php#button1
Cela n'aura aucun effet sur le mode d'affichage de la page (sauf si vous le souhaitez) et la plupart des langages de script disposent déjà d'outils leur permettant de lire les données facilement (et en toute sécurité).
Voilà 7 ans après la publication de cette réponse, j’ai trouvé un moyen différent de le faire fonctionner: il suffit de pointer le window.location.hash sur un ancre inexistant! Cela ne fonctionne pas pour <a>
s mais fonctionne parfaitement dans <div>
s.
<div onclick="window.location.hash = '#NonExistentAnchor';">button 1</div>
A bien fonctionné sous Chrome 56, Firefox 52 et Edge (IE?) 38. Un autre point positif est que cela ne génère aucune erreur de la console ni aucun avertissement.
J'espère que ça aide quelqu'un d'autre que moi.