Comment empêcher un clic sur un lien '#' de sauter en haut de page?


213

J'utilise actuellement des <a>balises avec jQuery pour lancer des choses comme des événements de clic, etc.

L'exemple est <a href="#" class="someclass">Text</a>

Mais je déteste la façon dont le «#» fait sauter la page en haut de la page. Que puis-je faire à la place?



2
Je suis avec David Dorward ici, et gargantaun sur la question en double liée. Si vous avez des liens sur votre site Web, ils doivent fonctionner comme des liens normaux. Si JavaScript les intercepte et fait quelque chose de différent, tant mieux, mais vous devez avoir un vrai lien là-bas, cela mène à une vraie page. Cela est nécessaire pour toutes sortes de raisons, notamment la SEO et l'accessibilité.
Daniel Pryden

"Stupid is as stupid does" Nous avons tous été là avant :)
prend le

Réponses:


242

Dans jQuery, lorsque vous gérez l'événement click, renvoie false pour empêcher le lien de répondre de la manière habituelleempêcher l'action par défaut, qui est de visiter l' hrefattribut, d'avoir lieu (selon le commentaire de PoweRoy et la réponse d'Erik ):

$('a.someclass').click(function(e)
{
    // Special stuff to do when this link is clicked...

    // Cancel the default action
    e.preventDefault();
});

1
@pranay: OP a précisé qu'il utilise jQuery pour travailler avec ces liens.
BoltClock

8
Au lieu de retourner false, faites un event.preventDefault (). Ceci est plus clair pour les personnes qui liront votre code.
RvdK

@PoweRoy: compris. J'ai fait le montage et appris quelque chose de nouveau :)
BoltClock

5
@BoltClock L'OP doit utiliser des boutons pour gérer les événements de clic au lieu des ancres. Votre réponse est assez utile, mais dans le cas où href pointe quelque part et que vous n'avez pas besoin de la redirection pour le moment . Empêcher le comportement par défaut d'une action qui n'est pas du tout nécessaire est une sorte de conseil comme: prenez le couteau, saisissez la lame et martelez les clous à l'aide de la poignée :) Prenez un bon outil pour le travail!
takehin

1
Si jquery:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin

298

Donc c'est vieux mais ... juste au cas où quelqu'un trouverait ça dans une recherche.

Utilisez simplement "#/"au lieu de "#"et la page ne sautera pas.


2
EXACTEMENT ce dont j'avais besoin! Même un an après votre commentaire, cela m'a été utile, alors merci Chris
Zack

49
cela fonctionne parce qu'il navigue vers l'ancre nommée /, et non parce qu'il #/a une signification. vous pouvez faire la même chose avec #whateveryouwantet cela empêchera un saut vers le haut
argot

3
Cela doit être la meilleure réponse. Je vous remercie.
Gilberto Sánchez

1
@slang, bien que vous ayez raison, et ce n'est qu'une simple piqûre, mais je préférerais utiliser "# /" au lieu de "#wthingyouwant" parce que "# /" est utilisé assez commun et révèle ainsi des intentions (Clean Code). Cela pourrait néanmoins être un ajout à la réponse.
jobbert

22
Attention - cela crée un enregistrement dans l'historique du navigateur, donc cliquer en arrière ne fera pas ce que l'utilisateur pense qu'il fera après avoir cliqué sur un lien #/ou quoi que ce soit d'autre, par exemple #whatever.
Darren Sweeney

61

vous pouvez même l'écrire comme ceci:

<a href="javascript:void(0);"></a>

je ne suis pas sûr que c'est une meilleure façon mais c'est une façon :)


Cette méthode était bien pour le pré-HTML 4 mais aujourd'hui c'est une très mauvaise pratique car elle casse trop d'actions de navigation comme "ouvrir le lien dans un nouvel onglet".
Steve-o

7
vous avez peut-être raison mais .. dans ce cas, cela n'a pas d'importance car il donne un événement onclick donc le lien ouvert dans le nouvel onglet ne fonctionnerait pas de toute façon ...
guy schaller

Le raccourci est href='javascript:;'mais attention il déclenche l'événement window.beforeUnload dans IE
Mihir

Cela pourrait briser sa propre fonction? Parce que si je fais cela, ma fonction de rendu des diapositives n'est plus déclenchée.
user3806549

29

Solution # 1: (simple)

<a href="#!" class="someclass">Text</a>

Solution n ° 2: (nécessaire javascript)

<a href="javascript:void(0);" class="someclass">Text</a>

Solution n ° 3: (nécessaire jQuery)

<a href="#" class="someclass">Text</a>
<script>
$('a.someclass').click(function(e) {
    e.preventDefault();
});
</script>

3
La première solution est parfaite. Court, propre et simple. Cela devrait être la réponse acceptée. Merci!
AlmostPitt

Le numéro 1 est une solution géniale. Je vous remercie!
Brenton Scott


11

Utilisez simplement <input type="button" />au lieu de <a>et utilisez CSS pour le styliser pour ressembler à un lien si vous le souhaitez.

Les boutons sont spécialement conçus pour les clics et n'ont pas besoin d'attributs href.

La meilleure façon est d'utiliser l'action onload pour créer le bouton et l'ajouter où vous en avez besoin via javascript, donc avec javascript désactivé, ils ne s'afficheront pas du tout et ne confondent pas l'utilisateur.

Lorsque vous utilisez, href="#"vous obtenez des tonnes de liens différents pointant vers le même emplacement, ce qui ne fonctionnera pas lorsque l'agent ne prend pas en charge JavaScript.


1
@kingjeffrey Mais ne rien faire est encore mieux que de naviguer vers #.
Robert

8

Si vous souhaitez utiliser une ancre, vous pouvez utiliser http://api.jquery.com/event.preventDefault/ comme les autres réponses suggérées.

Vous pouvez également utiliser n'importe quel autre élément comme une étendue et y attacher l'événement click.

$("span.clickable").click(function(){
alert('Yeah I was clicked');
});

7

Vous pouvez utiliser #0 comme href, car 0n'est pas autorisé comme identifiant, la page ne sautera pas.

<a href="#0" class="someclass">Text</a>

5
$('a[href="#"]').click(function(e) {e.preventDefault(); });

3
Pourriez-vous s'il vous plaît ajouter une courte explication?
JF Meier

Il me semble qu'il ajoute un gestionnaire de clics sur n'importe quelle ancre à laquelle une href "#" lui est associée. De cette façon, vous n'auriez pas à rechercher tous les gestionnaires de clics que vous avez déjà en place et à y ajouter e.preventDefault ().
Mani5556

4

Utilisez simplement

<a href="javascript:;" class="someclass">Text</a>

JQUERY

$('.someclass').click(function(e) { alert("action here"); }

4

Si l'élément n'a pas de valeur href significative, alors ce n'est pas vraiment un lien, alors pourquoi ne pas utiliser un autre élément à la place?

Comme suggéré par Neothor, une durée est tout aussi appropriée et, si elle est correctement conçue, elle sera visiblement évidente comme un élément sur lequel vous pouvez cliquer. Vous pouvez même attacher un événement de vol stationnaire, pour faire `` s'allumer '' l'elemnt lorsque la souris de l'utilisateur se déplace dessus.

Cependant, cela dit, vous voudrez peut-être repenser la conception de votre site pour qu'il fonctionne sans javascript, mais est amélioré par javascript lorsqu'il est disponible.


4

Les liens avec href = "#" devraient presque toujours être remplacés par un élément bouton:

<button class="someclass">Text</button>

L'utilisation de liens avec href = "#" est également un problème d'accessibilité car ces liens seront visibles pour les lecteurs d'écran, qui liront "Lien - Texte" mais si l'utilisateur clique dessus, il n'ira nulle part.


3

Vous pouvez simplement passer une balise d'ancrage sans propriété href et utiliser jQuery pour effectuer l'action requise:

<a class="foo">bar</a>


Je ne recommande généralement pas cette approche, car il n'y a aucune action de secours si l'utilisateur a désactivé js. Mais étant donné que vous avez déjà défini le href #, j'ai supposé que ce n'était pas un problème pour vous, et j'ai donc proposé cette solution car c'est probablement le moyen le plus simple de répondre à votre besoin.
kingjeffrey

1
a:linkLes sélecteurs CSS ne cibleront pas cette balise d'ancrage.
BoltClock

BoltClock, c'est vrai. Mais st4ck0v3rfl0w n'a pas indiqué un tel besoin.
kingjeffrey

Peut aussi bien utiliser un <div> alors. Je crois que le fait de maintenir le <a> est de conserver son style, qui est déjà défini par les <a> habituels. Sans href, il ne sera pas détecté et stylé comme les autres <a>.
MarsAndBack


3

L' #/astuce fonctionne, mais ajoute un événement historique au navigateur. Donc, cliquer en arrière ne fonctionne pas comme l'utilisateur peut le souhaiter / s'attendre à ce qu'il le fasse.

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); est la façon dont je suis allé, car cela fonctionne pour le contenu déjà existant, et tous les éléments ajoutés au DOM après le chargement.

Plus précisément, je devais le faire dans un menu déroulant de démarrage à l'intérieur d'un .btn-group(Référence) , alors j'ai fait:

$('body').click('.dropdown-menu li a[href="#"]', function(e) {e.preventDefault() });

De cette façon, il a été ciblé et n'a rien affecté d'autre sur la page.


3

J'ai toujours utilisé:

<a href="#?">Some text</a>

lorsque vous essayez d'empêcher le saut de page. Je ne sais pas si c'est le meilleur, mais cela semble bien fonctionner depuis des années.


3

Il existe 4 façons similaires d'empêcher la page de sauter vers le haut sans JavaScript:

Option 1:

<a href="#0">Link</a>

Option 2:

<a href="#!">Link</a>

Option 3:

<a href="#/">Link</a>

Option 4 ( non recommandé ):

<a href="javascript:void(0);">Link</a>

Mais il vaut mieux l'utiliser event.preventDefault()si vous distribuez l'événement click dans jQuery.


3
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
A. Suliman

2

Vous pouvez également retourner false après avoir traité votre requête.

Par exemple.

$(".clickableAnchor").live(
    "click",
    function(){
        //your code
        return false; //<- prevents redirect to href address
    }
);

1
Cela et la méthode live sont tous deux obsolètes et ne devraient plus être utilisés.
Quentin

2

J'utilise quelque chose comme ça:

<a href="#null" class="someclass">Text</a>

2

Pour empêcher la page de sauter, vous devez appeler e.stopPropagation();après avoir appelé e.preventDefault();:

stopPropagationempêche l'événement de remonter dans l'arborescence DOM. Plus d'informations ici: https://api.jquery.com/event.stoppropagation/


pourriez-vous s'il vous plaît fournir le code complet que je pourrais coller dans mon html? J'utilise Zurb Foundation 5.5.3.
Julie S.

2

Si vous souhaitez migrer vers une section d'ancrage sur la même page sans sauter de page, utilisez:

Utilisez simplement "# /" au lieu de "#" par exemple

<a href="#/home">Home</a>
<a href="#/about">About</a>
<a href="#/contact">contact</a> page will not jump up on click..

1

Ajouter quelque chose après #définit le focus de la page sur l'élément avec cet ID. La solution la plus simple consiste à utiliser #/même si vous utilisez jQuery. Cependant, si vous gérez l'événement dans jQuery, event.preventDefault()c'est la voie à suivre.


0

Le <a href="#!">Link</a>et<a href="#/">Link</a> ne fonctionne pas si l'on doit cliquer sur la même entrée plus d'une fois .. il suffit d'un clic pour chaque événement sur plusieurs entrées.

la meilleure façon de procéder est <a href="#">Link</a>

puis,

event.preventDefault();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.