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?

st4ck0v3rfl0w
la source
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();
});
BoltClock
la source
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.

Chris
la source
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 :)

gars schaller
la source
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>
Nabi KAZ
la source
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.

takhin
la source
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');
});
Néothor
la source
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>
Veve
la source
5
$('a[href="#"]').click(function(e) {e.preventDefault(); });
Praveen Manne
la source
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"); }
Ayush
la source
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.

bélugabob
la source
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.

martinedwards
la source
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>

kingjeffrey
la source
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

J'ai utilisé:

<a href="javascript://nop/" class="someClass">Text</a>
Brice Roncace
la source
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.

David
la source
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.

Josh Harris
la source
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.

ExillustX
la source
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
    }
);
user3581326
la source
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>
Stefan
la source
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/

anthonyjruffa
la source
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..
Agidigbi Ayodeji Victor
la source
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.

Vivek Vijayan
la source
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();
Richard Rosario
la source