Comment faire en sorte qu'une balise d'ancrage ne renvoie à rien?

159

J'utilise jQuery, je dois faire en sorte que certaines balises d'ancrage n'effectuent aucune action.

Je l'écris généralement comme ceci:

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

Cependant cela fait référence au haut de la page!

ahmed
la source
parce que jquery gérera l'événement de clic donc je veux que le lien soit comme un lien achor mais se comporte comme une fonction JavaScript
ahmed
1
Comme mentionné dans l'une des réponses ci-dessous: si vous ne voulez pas qu'un lien pointe vers une ressource, n'utilisez pas l'élément A.
Mathias Bynens
N'utilisez pas l' hrefattribut at dedans.
vsync

Réponses:

103

Si vous ne voulez pas qu'il pointe vers quoi que ce soit, vous ne devriez probablement pas utiliser la <a>balise (anchor).

Si vous voulez que quelque chose ressemble à un lien mais n'agisse pas comme un lien, il est préférable d'utiliser l'élément approprié (tel que <span>), puis de le styliser en utilisant CSS:

<span class="fake-link" id="fake-link-1">Am I a link?</span>

.fake-link {
    color: blue;
    text-decoration: underline;
    cursor: pointer;
}

De plus, étant donné que vous avez tagué cette question "jQuery", je suppose que vous souhaitez attacher un hander d'événement de clic. Si tel est le cas, faites la même chose que ci-dessus, puis utilisez quelque chose comme le JavaScript suivant:

$('#fake-link-1').click(function() {
    /* put your code here */
});
Tyson
la source
37
Cela pose un problème: cela ne permet pas la navigation par onglets.
6
Notez que (comme le souligne Iraimbilanja) l'approche span désactive ici la possibilité d'invoquer la fonction à l'aide du clavier, ce que je considérerais comme un problème d'utilisabilité.
Fredrik Mörk
3
Également un problème d'accessibilité. Vous pouvez le résoudre en utilisant un élément de bouton (généré à partir de JavaScript afin que les utilisateurs non-JS n'obtiennent pas un contrôle cassé).
Quentin
4
Voici une solution rapide pour cela: tabindex = "0" sur un élément sans lien permettra la navigation au clavier dans la plupart des navigateurs modernes.
Mathias Bynens
1
Un autre «problème» est que vous n'avez pas la pseudo classe CSS: hover ne fonctionnera pas sur des éléments qui ne sont pas des liens dans IE6. Mais comme vous ajoutez de toute façon ces éléments via JavaScript (du moins, vous devriez), vous pouvez tout aussi bien écrire un script qui ajoute une classe .hover à l'élément lorsqu'il est survolé.
Mathias Bynens
268

Il existe quelques solutions moins que parfaites:

1. Lien vers une fausse ancre

<a href="#">

Problème: cliquez sur le lien pour revenir en haut de la page

2. Utilisation d'une balise autre que "a"

Utilisez une balise span et utilisez la jquery pour gérer le clic

Problème: interrompt la navigation au clavier, doit changer manuellement le curseur de survol

3. Lien vers une fonction javascript void

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

Problème: casse lors de la liaison d'images dans IE

Solution

Comme ils ont tous leurs problèmes, la solution sur laquelle j'ai choisi est de créer un lien vers une fausse ancre, puis de renvoyer false à partir de la méthode onClick:

<a href="#" onClick="return false;">

Ce n'est pas la solution la plus concise, mais elle résout tous les problèmes avec les méthodes ci-dessus.

zaïus
la source
2
J'utilise généralement le javascript: void (0); approche, car l'utilisation de # affiche l'URL actuelle dans la barre de Firefox au survol de la souris, ce qui peut être trompeur pour l'utilisateur.
lucaferrario le
8
breaks when linking images in IEQu'est-ce que ça veut dire?
eugene
14
@eugene cette question a maintenant 3 ans, mais IE faisait disparaître les images lorsqu'elles étaient entourées d'un lien vers une fonction vide. Je ne sais pas quand il a été corrigé, mais cela fonctionne dans IE10, c'est tout ce que j'ai installé. J'utilise personnellement maintenant<a href="javascript:;">
zaius
1
J'ai aussi utilisé des commentaires là-dedans: <a href="javascript:void(0); // Afficher la palette des propriétés">. De cette façon, lorsque l'utilisateur survole, il voit le commentaire qui peut lui donner un indice à quoi s'attendre lorsqu'il clique. (Bien que vous puissiez également utiliser une info-bulle.)
Robin Zimmermann
5
Il semble que cela href="javascript:"soit également suffisant et fonctionne dans les derniers navigateurs majeurs. Pas besoin de point-virgule, en fait PhpStorm suggère même de le supprimer.
jlh
40

Pour ne rien faire du tout, utilisez ceci:

<a href="javascript:void(0)"> ... </a>
Philippe Leybaert
la source
1
ou juste <a href="javascript:;">. PS ne fonctionne pas avec target=_blankcependant
Alex
36

La bonne façon de gérer cela est de "rompre" le lien avec jQuery lorsque vous gérez le lien

HTML

<a href="#" id="theLink">My Link</a>

JS

$('#theLink').click(function(ev){
    // do whatever you want here

    ev.preventDefault();
    ev.stopPropagation();
});

Ces deux derniers appels arrêtent le navigateur d'interpréter le clic.

Oli
la source
5
Bien que cela semble "correct" car cela arrête le bouillonnement d'événements, "return false" est beaucoup moins verbeux et fait la même chose. La seule fois où vous voudriez faire cela, c'est si vous avez déjà des gestionnaires d'événements enregistrés pour cliquer sur des liens via jQuery.
aleemb
25

Il y a tellement de façons de le faire comme

Ne pas ajouter et hrefattribuer

<a name="here"> Test <a>

Vous pouvez ajouter un événement onclick au lieu de href comme

<a name="here" onclick="YourFunction()"> Test <a>

Ou vous pouvez ajouter une fonction void comme celle-ci, ce qui serait le meilleur moyen

<a href="javascript:void(0);"> 
<a href="javascript:;">
Punit Gajjar
la source
L'attribut de nom est-il obligatoire?
Petrus Theron
@PetrusTheron Pas nécessaire. .
Punit Gajjar
Ceci est une arnaque de réponses préexistantes
autour du
1
N'oubliez pas de définir le style de votre balise d'ancrage si vous supprimez l' hrefattribut car il ne se comportera plus comme un lien hypertexte (même si l'onclick fonctionne toujours), vous devrez réinitialiser des éléments tels que cursor: pointer;et le :hoversélecteur.
Partack
@Partack Correct .. Merci d'avoir remarqué
Punit Gajjar
24

Que voulez-vous dire par rien?

<a href='about:blank'>blank page</a>

ou

<a href='whatever' onclick='return false;'>won't navigate</a>
KristoferA
la source
1
D'accord - il suffit de renvoyer false de votre méthode jQuery et le tour est joué, cela n'ira nulle part
joshcomley
14

Je pense que tu peux essayer

<a href="JavaScript:void(0)">link</a>

Le seul hic que je vois ici est que la sécurité du navigateur de haut niveau peut inciter à exécuter javascript.

Bien que ce soit l'un des moyens les plus simples

<a href="#" onclick="return false;">Link</a>

cela doit être utilisé avec parcimonie

Lisez cet article pour quelques pointeurs https://web.archive.org/web/20090301044015/http://blog.reindel.com/2006/08/11/a-hrefjavascriptvoid0-avoid-the-void

Rutesh Makhijani
la source
Bonne réponse, permet la navigation par onglets.
K - La toxicité du SO augmente.
14

Cette réponse doit être mise à jour pour refléter les nouvelles normes Web (HTML5).

Ce:

<a tabindex="0">This represents a placeholder hyperlink</a>

... est du HTML5 valide. L'attribut tabindex le rend focusable au clavier comme les hyperliens normaux. Vous pourriez aussi bien utiliser l' spanélément pour cela comme mentionné précédemment, mais je trouve que l'utilisation de l' aélément est plus élégante.

Voir: https://w3c.github.io/html-reference/a.html
et: https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-href

aross
la source
1
C'est également du HTML4 valide, mais il ne formera pas l'ancre comme un lien.
entre le
1
Je ne savais pas que c'était du html4 valide, mais la spécification HTML5 mentionne explicitement le cas d'utilisation. Et les styles qui ne ciblent pas l'attribut href fonctionneront très bien, seuls les styles de navigateur par défaut peuvent être un problème.
aross le
1
Cela ne déclenche pas non plus d' clickévénement lorsque l'utilisateur concentre l'élément et appuie sur Entrée (testé dans Firefox 51).
torvin
@torvin, c'est simple. Utilisez l' keydownévénement.
aross
bizarrerie snazzy, mais dans la fenêtre 10, il ajoute une boîte bordée autour de l'élément
1-14x0r
12

Voici les trois façons dont <a>la hrefpropriété tag de la balise ne renvoie à rien:

<a href="JavaScript:void(0)"> link </a>

<a href="javascript:;">link</a >

<a href="#" onclick="return false;"> Link </a>
Milan Gajjar
la source
1
Ceci est juste une copie de la réponse actuellement la plus votée , mais avec moins d'informations
aross
5

Je sais que c'est une vieille question, mais je pensais quand même ajouter mes deux cents:

Cela dépend de ce que le lien va faire, mais en général, je pointerais le lien vers une URL qui pourrait éventuellement afficher / faire la même chose, par exemple, si vous faites un petit message sur la boîte:

<a id="about" href="/about">About</a>

Puis avec jQuery

$('#about').click(function(e) {
    $('#aboutbox').show();
    e.preventDefault();
});

De cette façon, les très anciens navigateurs (ou les navigateurs avec JavaScript désactivé) peuvent toujours naviguer vers une page à propos distincte, mais plus important encore, Google la récupérera également et explorera le contenu de la page à propos.

Connell
la source
5

Assurez-vous que tous vos liens que vous souhaitez arrêter ont href="#!"(ou tout ce que vous voulez vraiment), puis utilisez ceci:

jq('body').on('click.stop_link', 'a[href="#!"]',
function(event) {
     event.preventDefault();
});
ourson
la source
4

Vous pouvez avoir une ancre HTML ( abalise) sans hrefattribut. Laissez l' hrefattribut et il ne sera lié à rien:

<a>link</a>
tee
la source
Je vous remercie! Cela a parfaitement fonctionné pour mon cas. Où je voulais avoir la balise Anchor à ouvrir dans un nouvel onglet lorsqu'il y a une URL, mais rien si aucune URL. Dans le cas de #, il acceptait un CLIC et le déplaçait en haut de la page. N'ayant pas de partie href comme vous l'avez suggéré. Cela a résolu le problème! Le formatage a l'air bien en raison d'une balise, le problème de clic a disparu sans href. Je vous remercie!!!
Mohsin
1
Si quelqu'un d'autre se demande si c'est HTML5 valide, alors la réponse est OUI :) stackoverflow.com/a/33046203/5323892 . Voici un exemple tiré de la page des standards (voir le troisième élément li): <nav> <ul> <li> <a href="https://stackoverflow.com/"> Accueil </a> </li> <li> <a href = "/ news "> Actualités </a> </li> <li> <a> Exemples </a> </li> <li> <a href="https://stackoverflow.com/legal"> Juridique </a> </li> </ ul> </nav>
Mohsin
Cela fonctionne mais si vous voulez que le pointeur de la souris se transforme en doigt, ajoutez simplement href = "JavaScript: void (0)" comme suggéré sur la réponse de @Rutesh Makhijani.
Tarik
3

La seule chose qui a fonctionné pour moi était une combinaison de ce qui précède:

D'abord le li dans l'ul

<li><a onclick="LoadTab2_1()" href="JavaScript:void(0)">All Assigned</a></li>

Ensuite, dans le LoadTab2_1, j'ai changé manuellement les onglets divs

$("#tabs-2-1").hide();
    $("#tabs-2-2").show();

En effet, la déconnexion du déconnecte également l'action dans les onglets

Vous devez également faire manuellement le style de l'onglet lorsque l'onglet principal change les choses

$("#secTab1").addClass("ui-tabs-active").addClass("ui-state-active").addClass("ui-state-hover").addClass("ui-state-focus");
    $("#secTab1 a").css("color", "#ffffff");
Pat Capozzi
la source
2

Vous pouvez le faire en

<a style='cursor:pointer' >Link</a>
Naveen Heroorkar
la source
1
<a href="#" onclick="SomeFunction()"  class="SomeClass">sth.</a>

c'était ma balise d'ancrage. donc renvoyer false sur l'événement onClick = "" n'est pas utile ici. Je viens de supprimer la propriété href = "#" et cela a fonctionné pour moi comme ci-dessous

<a onclick="SomeFunction()"  class="SomeClass">sth.</a>

et j'avais besoin d'ajouter ce css.

.SomeClass
{
    cursor: pointer;
}
Burk
la source
Que veux-tu dire par là. Qu'est-ce qui est recommandé et pourquoi?
Burk
Sa bonne pratique de conserver javascript et html dans des fichiers séparés, voici une réponse détaillée: stackoverflow.com/questions/5871640/…
Alexandru Severin
1

J'ai rencontré ce problème sur un site WordPress. Les en-têtes des menus déroulants avaient toujours l'attribut href=""et le plugin d'en-tête utilisé uniquement les URL standard autorisées. La solution la plus simple était juste d'exécuter ce code dans le pied de page:

jQuery('[href=""]').click(function(e){
    e.preventDefault();
});

Cela empêchera les ancres vierges de faire quoi que ce soit.

Bryant Jackson
la source
0

React ne prend plus en charge l'utilisation d'une fonction comme celle-ci href="javascript:void(0)"dans votre balise d'ancrage, mais voici quelque chose qui fonctionne plutôt bien.

<a href="#" onClick={() => null} >link</a>
w3bh4ck
la source
-1

Je sais que cela est étiqueté comme une question jQuery, mais vous pouvez également y répondre avec AngularJS.

dans votre élément, ajoutez la directive ng-click et utilisez la variable $ event qui est l'événement click ... évitez son comportement par défaut:

<a href="#" ng-click="$event.preventDefault()">

Vous pouvez même passer la variable $ event dans une fonction:

<a href="#" ng-click="doSomething($event)">

dans cette fonction, vous faites ce que vous voulez avec l'événement click.

Jeremy Jao
la source