Quelle valeur «href» dois-je utiliser pour les liens JavaScript, «#» ou «javascript: void (0)»?

4079

Voici deux méthodes de création d'un lien dont le seul but est d'exécuter du code JavaScript. Quel est le meilleur, en termes de fonctionnalité, de vitesse de chargement des pages, de validation, etc.?

function myJsFunc() {
    alert("myJsFunc");
}
<a href="#" onclick="myJsFunc();">Run JavaScript Code</a>

ou

function myJsFunc() {
    alert("myJsFunc");
}
 <a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>

Peter Mortensen
la source
202
À moins que je manque quelque chose, <a href="javascript:void(0)" onclick="myJsFunc();">cela n'a absolument aucun sens. Si vous devez utiliser le javascript:protocole psuedo, vous n'avez pas non plus besoin de l' onclickattribut. <a href="javascript:myJsFunc();">fera très bien.
Wesley Murch
65
@WesleyMurch - Si myJsFunc()a une valeur de retour, votre page se cassera. jsfiddle.net/jAd9G Vous souhaitez toujours avoir à utiliser voidcomme ceci: <a href="javascript:void myJsFunc();">. Mais alors, le comportement serait toujours différent. L'appel du lien via le menu contextuel ne déclenche pas l' clickévénement.
gilly3
38
Pourquoi pas juste <a href="javascript:;" onclick="myEvent()"?
3k-
26
javascript:;est beaucoup plus rapide à taper quejavascript:void(0)
Mike Causer
78
D'abord, lorsque vous regardez ceci: "pourquoi utiliseriez-vous une <a>balise si ce que vous voulez faire n'est PAS d'ouvrir une autre page via la fonction de navigateur natif, mais plutôt de déclencher une" action "javascript? Simplement en utilisant une spanbalise avec une classe de js-triggerserait probablement beaucoup mieux ". Ou est-ce que je manque quelque chose?
Adrien Be

Réponses:

2164

J'utilise javascript:void(0).

Trois raisons. Encourager l'utilisation de #parmi une équipe de développeurs conduit inévitablement à certains à utiliser la valeur de retour de la fonction appelée comme ceci:

function doSomething() {
    //Some code
    return false;
}

Mais ensuite, ils oublient d'utiliser return doSomething()dans le onclick et utilisent simplement doSomething().

Une deuxième raison pour éviter #est que la finale return false;ne s'exécutera pas si la fonction appelée renvoie une erreur. Par conséquent, les développeurs doivent également se rappeler de gérer correctement toute erreur dans la fonction appelée.

Une troisième raison est qu'il existe des cas où la onclickpropriété d'événement est affectée dynamiquement. Je préfère pouvoir appeler une fonction ou l'attribuer dynamiquement sans avoir à coder la fonction spécifiquement pour une méthode de connexion ou une autre. Par conséquent, mon onclick(ou n'importe quoi) dans le balisage HTML ressemble à ceci:

onclick="someFunc.call(this)"

OU

onclick="someFunc.apply(this, arguments)"

L'utilisation javascript:void(0)évite tous les maux de tête ci-dessus, et je n'ai trouvé aucun exemple d'inconvénient.

Donc, si vous êtes un développeur isolé, vous pouvez clairement faire votre propre choix, mais si vous travaillez en équipe, vous devez indiquer:

Utilisez href="#", assurez-vous que onclickcontient toujours return false;à la fin, que toute fonction appelée ne onclickrenvoie pas d'erreur et si vous attachez une fonction dynamiquement à la propriété, assurez-vous qu'en plus de ne pas renvoyer d'erreur, elle retourne false.

OU

Utilisation href="javascript:void(0)"

La seconde est clairement beaucoup plus facile à communiquer.

AnthonyWJones
la source
329
J'ouvre toujours chaque lien dans un nouvel onglet et c'est la raison pour laquelle je déteste personnellement quand les gens utilisent la href="javascript:void(0)"méthode
Timo Huovinen
182
Désolé désaccord, pourquoi cette réponse a-t-elle autant de votes positifs? Toute utilisation de javascript:devrait être considérée comme une mauvaise pratique, importune et ne dégrade pas gracieusement.
Lankymart
52
Les deux réponses suivantes sont bien meilleures et raisonnables que celle-ci. De plus, les deux premiers arguments ne sont pas valides car ils event.preventDefault()sont là exactement pour empêcher le comportement par défaut (comme sauter en haut de la page dans ce cas) et faire un meilleur travail sans toute la return false;folie.
sudee
136
Avance rapide jusqu'en 2013: javascript:void(0)enfreint la politique de sécurité du contenu sur les pages HTTPS compatibles CSP. Une option serait alors d'utiliser href='#'et event.preventDefault()dans le gestionnaire, mais je n'aime pas beaucoup ça. Vous pouvez peut-être établir une convention à utiliser href='#void'et vous assurer qu'aucun élément de la page ne l'a id="void". De cette façon, cliquer sur un lien vers une ancre non existante ne fera pas défiler la page.
jakub.g
24
Vous pouvez utiliser "#" puis lier un événement de clic à tous les liens avec "#" comme href. Cela se ferait dans jQuery avec:$('a[href="#"]').click(function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; });
Nathan
1325

Ni.

Si vous pouvez avoir une URL réelle qui a du sens, utilisez-la comme HREF. Le onclick ne se déclenchera pas si quelqu'un clique avec le bouton du milieu sur votre lien pour ouvrir un nouvel onglet ou si JavaScript est désactivé.

Si cela n'est pas possible, vous devez au moins injecter la balise d'ancrage dans le document avec JavaScript et les gestionnaires d'événements de clic appropriés.

Je me rends compte que ce n'est pas toujours possible, mais à mon avis, cela devrait être recherché dans le développement de tout site Web public.

Découvrez JavaScript discret et l' amélioration progressive (tous deux Wikipedia).

Aaron Wagner
la source
19
Pouvez-vous donner un exemple de la façon dont on pourrait «injecter la balise d'ancrage dans le document avec JavaScript et les gestionnaires d'événements de clic appropriés»?
user456584
11
Pourquoi injecter la balise d'ancrage si elle est simplement destinée à être utilisée pour permettre à un élément d'être a) cliqué b) d'afficher le curseur "pointeur". Il ne semble pas pertinent d'injecter même une balise d'ancrage dans ce scénario.
écraser
12
+1 pour aucun des deux, mais il y a plus d'approches. Le fait demeure l'utilisation de l'une javascript:ou de l'autre ou de #mauvaises pratiques et ne doit pas être encouragé. Beaux articles btw.
Lankymart
13
@crush: Je n'utiliserais pas non plus un div ou un span; franchement, il semble que la chose même ait <button>été faite. Mais d'accord: cela ne devrait probablement pas être spécifiquement un <a>s'il n'y a pas d'endroit approprié pour qu'il y ait un lien.
cHao
14
@cHao Button est peut-être le meilleur choix. Je suppose que le point principal est que l'élément HTML ne doit pas être sélectionné en fonction de son apparence de présentation par défaut, mais plutôt de sa signification pour la structure du document.
écraser le
775

Faire <a href="#" onclick="myJsFunc();">Link</a> ou <a href="javascript:void(0)" onclick="myJsFunc();">Link</a>ou quoi que ce soit d'autre qui contient un onclickattribut - c'était bien il y a cinq ans, bien que maintenant cela puisse être une mauvaise pratique. Voici pourquoi:

  1. Il promeut la pratique du JavaScript intrusif - qui s'est avéré difficile à maintenir et à mettre à l'échelle. Plus à ce sujet dans JavaScript discret .

  2. Vous passez votre temps à écrire du code incroyablement trop verbeux - ce qui a très peu (voire aucun) avantage pour votre base de code.

  3. Il existe désormais des moyens meilleurs, plus faciles et plus faciles à maintenir et à adapter pour atteindre le résultat souhaité.

La manière discrète de JavaScript

N'ayez tout simplement pas d' hrefattribut du tout! Toute bonne réinitialisation CSS prendrait en charge le style de curseur par défaut manquant, donc ce n'est pas un problème. Ensuite, associez votre fonctionnalité JavaScript à l'aide de meilleures pratiques gracieuses et discrètes - qui sont plus faciles à maintenir car votre logique JavaScript reste en JavaScript, plutôt que dans votre balisage - ce qui est essentiel lorsque vous commencez à développer des applications JavaScript à grande échelle qui nécessitent que votre logique soit divisée en composants et modèles en boîte noire. En savoir plus sur l' architecture d'application JavaScript à grande échelle

Exemple de code simple

// Cancel click event
$('.cancel-action').click(function(){
    alert('Cancel action occurs!');
});

// Hover shim for Internet Explorer 6 and Internet Explorer 7.
$(document.body).on('hover','a',function(){
    $(this).toggleClass('hover');
});
a { cursor: pointer; color: blue; }
a:hover,a.hover { text-decoration: underline; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="cancel-action">Cancel this action</a>

Un exemple Backbone.js en boîte noire

Pour un exemple de composant évolutif, en boîte noire , Backbone.js - voir cet exemple de jsfiddle fonctionnel ici . Remarquez comment nous utilisons des pratiques JavaScript discrètes et, dans une petite quantité de code, un composant peut être répété plusieurs fois sur la page sans effets secondaires ni conflits entre les différentes instances de composant. Incroyable!

Remarques

  • L'omission de l' hrefattribut sur l' aélément rendra l'élément inaccessible à l'aide de la tabnavigation par clé. Si vous souhaitez que ces éléments soient accessibles via la tabclé, vous pouvez définir l' tabindexattribut ou utiliser des buttonéléments à la place. Vous pouvez facilement styliser les éléments des boutons pour qu'ils ressemblent à des liens normaux, comme mentionné dans la réponse de Tracker1 .

  • L'omission de l' hrefattribut sur l' aélément empêchera Internet Explorer 6 et Internet Explorer 7 de prendre le a:hoverstyle, c'est pourquoi nous avons ajouté un simple cale JavaScript pour accomplir cela via a.hover. Ce qui est parfaitement correct, comme si vous n'avez pas d'attribut href et aucune dégradation gracieuse, votre lien ne fonctionnera pas de toute façon - et vous aurez de plus gros problèmes à vous inquiéter.

  • Si vous souhaitez que votre action fonctionne toujours avec JavaScript désactivé, utilisez un aélément avec un hrefattribut qui va à une URL qui exécutera l'action manuellement plutôt que via une demande Ajax ou tout ce qui devrait être le chemin à parcourir. Si vous faites cela, vous devez vous assurer de faire un event.preventDefault()appel sur votre clic pour vous assurer que lorsque vous cliquez sur le bouton, il ne suit pas le lien. Cette option est appelée dégradation gracieuse.

balupton
la source
163
Soyez prudent, laisser les attributs href désactivés n'est pas compatible avec tous les navigateurs et vous perdrez des choses telles que les effets de survol dans Internet Explorer
Thomas Davis
16
Attention: l' buttonapproche de type lien suggérée ici est en proie à l' état actif "3d" inévitable dans IE9 et inférieur .
Brennan Roberts
44
Je trouve cette réponse trop dogmatique. Il y a des moments où vous voulez simplement appliquer le comportement JS à 1 ou 2 a href. Dans ce cas, il est exagéré de définir du CSS supplémentaire et d'injecter une fonction JS entière. Dans certains cas (par exemple, ajouter du contenu via un CMS), vous n'êtes en fait pas autorisé à injecter de nouveaux CSS ou JS autonomes, et en ligne est tout ce que vous pouvez faire. Je ne vois pas comment la solution en ligne est moins maintenable en pratique pour 1 ou 2 JS simples par href. Méfiez-vous toujours des déclarations générales sur les mauvaises pratiques, y compris celle-ci :)
Jordan Rieger
17
Avec toutes ces "notes" difficiles à résoudre (créer un tabindex demande des ennuis sur une page complexe!). Il vaut mieux faire juste javascript:void(0). Telle est la réponse pragmatique et la seule réponse sensée dans le monde réel.
Abhi Beckert du
14
Si vous vous souciez de rendre votre application Web accessible (et vous devriez), la simplicité et la raison font valoir href. La folie se situe dans le sens de tabindex.
jkade
328

'#'ramènera l'utilisateur en haut de la page, donc je vais généralement avec void(0).

javascript:; se comporte également comme javascript:void(0);

Gabe Rogan
la source
68
Pour éviter cela, renvoyez false dans le gestionnaire d'événements onclick.
Guvante
34
Renvoyer false dans le gestionnaire d'événements n'évite pas cela si JavaScript le JS ne fonctionne pas correctement.
Quentin
28
utiliser "#someNonExistantAnchorName" fonctionne bien car il n'a nulle part où aller.
scunliffe
21
Si vous avez une base href, alors #ou vous #somethingamènera à cette ancre sur la base href page de , plutôt que sur la page en cours.
Abhi Beckert
11
Le shebang ( #!) fait l'affaire mais c'est définitivement une mauvaise pratique.
Neel
276

Je ne dirais honnêtement ni l'un ni l'autre. J'utiliserais un stylisé <button></button>pour ce comportement.

button.link {
  display: inline-block;
  position: relative;
  background-color: transparent;
  cursor: pointer;
  border: 0;
  padding: 0;
  color: #00f;
  text-decoration: underline;
  font: inherit;
}
<p>A button that looks like a <button type="button" class="link">link</button>.</p>

De cette façon, vous pouvez attribuer votre onclick. Je suggère également une liaison via un script, sans utiliser l' onclickattribut sur la balise element. Le seul problème est l'effet de texte psuedo 3d dans les anciens IE qui ne peuvent pas être désactivés.


Si vous DEVEZ utiliser un élément A, utilisez-le javascript:void(0);pour les raisons déjà mentionnées.

  • Interceptera toujours en cas d'échec de votre événement onclick.
  • Aucun appel de charge errant ne se produira ou ne déclenchera d'autres événements en fonction d'un changement de hachage
  • La balise de hachage peut provoquer un comportement inattendu si le clic échoue (lancers sur un clic), évitez-le sauf s'il s'agit d'un comportement de passage approprié et que vous souhaitez modifier l'historique de navigation.

REMARQUE: vous pouvez remplacer le 0par une chaîne telle que javascript:void('Delete record 123')qui peut servir d'indicateur supplémentaire qui montrera ce que le clic fera réellement.

Tracker1
la source
Dans IE8 / IE9, je ne peux pas supprimer le décalage 1px "3D" dans l'état actif du bouton.
Brennan Roberts
@BrennanRoberts Oui, malheureusement, tout style de boutons est plus problématique avec IE ... Je pense toujours que c'est probablement l'approche la plus appropriée, pas que je ne casse pas mes propres règles à l'occasion.
Tracker1
Alors n'utilisez pas <button>mais un à la input type=buttonplace?
Patrik Affentranger
4
Utilisez ensuite un <clickable>élément. Ou un <clickabletim>si vous préférez. Malheureusement, l'utilisation d'une balise non standard ou d'un div simple peut rendre difficile pour les utilisateurs du clavier de concentrer l'élément.
joeytwiddle
28
Cette réponse devrait être au top. Si vous rencontrez ce dilemme, il est probable que vous ayez réellement besoin d'un button. Et IE9 perd rapidement des parts de marché, heureusement, et l'effet actif 1px ne devrait pas nous empêcher d'utiliser le balisage sémantique. <a>est un lien, il est destiné à vous envoyer quelque part, pour les actions que nous avons <button>.
mjsarfatti
141

Le premier, idéalement avec un vrai lien à suivre au cas où l'utilisateur aurait désactivé JavaScript. Assurez-vous simplement de renvoyer false pour éviter que l'événement click ne se déclenche si JavaScript s'exécute.

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

Si vous utilisez Angular2, cette méthode fonctionne:

<a [routerLink]="" (click)="passTheSalt()">Click me</a>.

Voir ici https://stackoverflow.com/a/45465728/2803344

Belter
la source
19
Donc, dans les agents utilisateurs avec JavaScript activé et la fonction prise en charge, exécutez une fonction JavaScript, retombant (pour les agents utilisateurs où le JS échoue pour une raison quelconque) sur un lien vers le haut de la page? C'est rarement une solution de rechange raisonnable.
Quentin
21
"idéalement avec un vrai lien à suivre au cas où l'utilisateur aurait désactivé JavaScript", il devrait aller sur une page utile et non #, même si c'est juste une explication que le site a besoin de JS pour fonctionner. quant à l'échec, je m'attendrais à ce que le développeur utilise une détection de fonctionnalité de navigateur appropriée, etc. avant le déploiement.
Zach
Je suppose (j'espère) que quelque chose comme ça ne serait que pour afficher une fenêtre contextuelle ou quelque chose de similaire simple. Dans ce cas, la valeur par défaut serait l'URL de la page contextuelle. Si cela fait partie d'une application Web, ou si JS est désactivé, cela casserait totalement la page, alors ce code a d'autres problèmes ...
Brian Moeskau
5
Mes applications Web sont conçues pour se dégrader gracieusement, donc le lien sera toujours une page utile. À moins que votre application Web ne soit un client de chat ou quelque chose d'aussi interactif, cela devrait fonctionner si vous prenez le temps de concevoir en pensant à la dégradation.
Zach
2
Le problème est que si myJsFunc renvoie une erreur, elle ne sera pas capturée pour le retour false.
Tracker1
106

Ni si vous me le demandez;

Si votre "lien" a pour seul but d'exécuter du code JavaScript, il n'est pas considéré comme un lien; plutôt un morceau de texte avec une fonction JavaScript qui lui est associée. Je recommanderais d'utiliser une <span>balise avec un onclick handlerattaché et quelques CSS de base pour imiter un lien. Les liens sont faits pour la navigation, et si votre code JavaScript n'est pas pour la navigation, il ne devrait pas être un<a> balise.

Exemple:

function callFunction() { console.log("function called"); }
.jsAction {
    cursor: pointer;
    color: #00f;
    text-decoration: underline;
}
<p>I want to call a JavaScript function <span class="jsAction" onclick="callFunction();">here</span>.</p>

fijter
la source
126
Cette approche limite le «lien» à une opération de souris uniquement. Une ancre peut être visitée via le clavier et son événement «onclick» est déclenché lorsque la touche Entrée est enfoncée.
AnthonyWJones
40
Le codage en dur des couleurs dans votre CSS empêcherait le navigateur d'utiliser des couleurs personnalisées que l'utilisateur peut définir, ce qui peut être un problème d'accessibilité.
Hosam Aly
30
<span>s ne sont pas censés faire quoi que ce soit. <A>nchors et <buttons>sont utilisés pour ça!
redShadow
22
Utiliser buttonsest un meilleur choix ici alors que ce spann'est pas le cas.
2012 à 8h33
1
Je pense qu'une envergure est meilleure qu'une balise d'ancrage. La balise d'ancrage existe pour vous diriger vers son attribut href obligatoire. Si vous n'utilisez pas le href, n'utilisez pas d'ancrage. Il ne limite pas le lien à la souris uniquement parce qu'il ne s'agit pas d'un lien. Il n'a pas de href. Cela ressemble plus à un bouton mais il ne s'affiche pas. L'intervalle n'étant pas censé faire quoi que ce soit est complètement invalide. Considérez un menu déroulant qui s'active lorsque vous survolez. Il s'agit probablement d'une combinaison de plages et de divisions, qui remplit la fonction d'un bouton qui élargit une zone à l'écran.
NibblyPig du
97

Idéalement, vous feriez ceci:

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

Ou, encore mieux, vous auriez le lien d'action par défaut dans le HTML, et vous ajouteriez l'événement onclick à l'élément discrètement via JavaScript après le rendu du DOM, garantissant ainsi que si JavaScript n'est pas présent / utilisé, vous ne l'avez pas ont des gestionnaires d'événements inutiles qui criblent votre code et peuvent obscurcir (ou du moins distraire) votre contenu réel.

Steve Paulo
la source
76

L'utilisation ne #fait que des mouvements amusants, donc je recommanderais d'utiliser #selfsi vous souhaitez économiser sur les efforts de frappe de JavaScript bla, bla,.

Spammer Joe
la source
7
WOW, bravo pour cette astuce. Je n'ai jamais su que vous pouviez utiliser les #selfbalises nommées et éviter le comportement ennuyeux du navigateur de sauter en haut de la page. Je vous remercie.
alonso.torres
34
Pour référence, #selfne semble pas être spécial. Tout identifiant de fragment qui ne correspond pas au nom ou à l'id d'un élément du document (et qui n'est pas vide ou "en haut") devrait avoir le même effet.
cHao
1
J'utilise généralement un nom d'ancre composé, mais je pense que je vais commencer à le faire pour être cohérent dans mon travail.
Douglas.Sesar
11
J'ai suggéré d'établir une #voidconvention dans l'autre commentaire, mais il #selfest en fait aussi court et facile à mémoriser. Tout vaut mieux que#
jakub.g
6
Mais si vous cliquez sur ce lien, il sera étrange pour l'utilisateur de voir "#void" dans l'url, ressemble à une erreur ou un bug, de même avec #self ou autre.
pmiranda
68

J'utilise ce qui suit

<a href="javascript:;" onclick="myJsFunc();">Link</a>

au lieu

<a href="javascript:void(0);" onclick="myJsFunc();">Link</a>
se_pavel
la source
2
J'utilise javascript:(pas de point-virgule) car il semble le plus net dans la barre d'état en survol.
Boann
4
Ce code peut provoquer de mauvaises surprises dans les anciens IE. À un moment donné, il cassait
Ilya Streltsyn
Vous pouvez toujours le faire ... javascript:void('Do foo')puisque void reviendra indéfini quoi qu'il en soit, cela donnera à l'utilisateur un indicateur de ce que le clic fera. Où Do foopeut être Delete record Xou ce que vous voulez.
Tracker1
53

Je suis d'accord avec les suggestions ailleurs indiquant que vous devez utiliser une URL régulière dans l' hrefattribut, puis appeler une fonction JavaScript dans onclick. Le défaut est qu'ils ajoutent automatiquement return falseaprès l'appel.

Le problème avec cette approche est que si la fonction ne fonctionne pas ou s'il y a un problème, le lien deviendra non cliquable. L'événement Onclick reviendra toujours false, donc l'URL normale ne sera pas appelée.

Il existe une solution très simple. Laissez la fonction revenir truesi elle fonctionne correctement. Utilisez ensuite la valeur renvoyée pour déterminer si le clic doit être annulé ou non:

Javascript

function doSomething() {
    alert( 'you clicked on the link' );
    return true;
}

HTML

<a href="path/to/some/url" onclick="return !doSomething();">link text</a>

Notez que je nie le résultat de la doSomething()fonction. Si cela fonctionne, il reviendra true, il sera donc annulé ( false) et le path/to/some/URLne sera pas appelé. Si la fonction revient false(par exemple, le navigateur ne prend pas en charge quelque chose utilisé dans la fonction ou quoi que ce soit d'autre ne va pas), il est annulé trueet path/to/some/URLest appelé.

Fczbkk
la source
50

#est mieux que javascript:anything, mais ce qui suit est encore mieux:

HTML:

<a href="/gracefully/degrading/url/with/same/functionality.ext" class="some-selector">For great justice</a>

JavaScript:

$(function() {
    $(".some-selector").click(myJsFunc);
});

Vous devez toujours vous efforcer d'une dégradation gracieuse (dans le cas où l'utilisateur n'a pas activé JavaScript ... et quand il est avec les spécifications et le budget). En outre, il est considéré comme une mauvaise forme d'utiliser les attributs et le protocole JavaScript directement en HTML.

Justin Johnson
la source
1
@Muhd: Le retour devrait s'activer clicksur les liens…
Ry-
50

Je recommande d'utiliser un <button> élément à la place, surtout si le contrôle est censé produire un changement dans les données. (Quelque chose comme un POST.)

C'est encore mieux si vous injectez les éléments discrètement, un type d'amélioration progressive. (Voir ce commentaire .)

traitent bien vos mods
la source
2
Je pense moi aussi que c'est la meilleure solution. Si vous avez un élément destiné à effectuer une action, il n'y a aucune raison qu'il s'agisse d'un lien.
mateuscb
Si vous posiez la question et que votre href ressemblerait à "#quelque chose", certaines des autres réponses énumérées pourraient servir, mais: Sans le href lié à quelque chose de sensé, il n'y a aucun intérêt à avoir un href, ou même un lien tout à fait. L'utilisation suggérée du bouton pourrait faire l'affaire, ou utiliser n'importe quel autre élément, mais un lien remerciant les liens nulle part.
kontur
1
Un autre avantage de cela est que Bootstrap .btndonne aux boutons et aux liens la même apparence.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Du point de vue de l'utilisateur, buttonn'introduit pas non plus de # dans l'URL ou n'affiche pas la ahref en javascript :;
Coll
39

À moins que vous n'écriviez le lien en utilisant JavaScript (afin que vous sachiez qu'il est activé dans le navigateur), vous devriez idéalement fournir un lien approprié pour les personnes qui naviguent avec JavaScript désactivé, puis empêcher l'action par défaut du lien dans votre onclick gestionnaire d'événements. De cette façon, ceux avec JavaScript activé exécuteront la fonction et ceux avec JavaScript désactivé passeront à une page appropriée (ou à un emplacement dans la même page) plutôt que de simplement cliquer sur le lien et que rien ne se passe.

Simon Forrest
la source
36

Certainement, hash ( #) est mieux car en JavaScript c'est un pseudoscheme:

  1. pollue l'histoire
  2. instancie une nouvelle copie du moteur
  3. s'exécute à l'échelle mondiale et ne respecte pas le système d'événements.

Bien sûr, "#" avec un gestionnaire onclick qui empêche l'action par défaut est [beaucoup] mieux. De plus, un lien qui a pour seul but d'exécuter JavaScript n'est pas vraiment "un lien" à moins que vous n'envoyiez l'utilisateur à une ancre sensible sur la page (juste # enverra en haut) quand quelque chose ne va pas. Vous pouvez simplement simuler l'apparence d'un lien avec une feuille de style et oublier le href.

En outre, en ce qui concerne la suggestion de cowgod, en particulier ceci: ...href="javascript_required.html" onclick="...c'est une bonne approche, mais elle ne fait pas de distinction entre les scénarios "JavaScript désactivé" et "onclick échoue".

Conseil gratuit
la source
1
@Berker Yüceer, pourquoi CW?
Conseil gratuit le
30

Je vais d'habitude pour

<a href="javascript:;" onclick="yourFunction()">Link description</a>

Il est plus court que javascript: void (0) et fait de même.

dnetix
la source
27

J'utiliserais:

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

Les raisons:

  1. Les hrefmoteurs de recherche en ont donc besoin. Si vous utilisez autre chose (comme une chaîne), cela peut provoquer une 404 not founderreur.
  2. Lorsque la souris survole le lien, cela ne montre pas qu'il s'agit d'un script.
  3. En utilisant return false;, la page ne saute pas vers le haut ou ne casse pas le backbouton.
Eric Yin
la source
je ne suis pas d'accord avec "1". car cela donne une erreur lorsque vous mettez votre lien de script lorsque les scripts ne sont pas autorisés. de sorte que ce type de liens doit être ajouté avec le code js. de cette façon, les gens peuvent éviter ces liens pendant que le script n'est pas autorisé et ne voir aucune erreur.
Berker Yüceer
25

Je choisis d'utiliser javascript:void(0), car cela pourrait empêcher un clic droit pour ouvrir le menu de contenu. Mais javascript:;est plus court et fait la même chose.

564706
la source
24

Donc, lorsque vous faites des choses JavaScript avec une <a />balise et si vous le mettez href="#"également, vous pouvez ajouter return false à la fin de l'événement (en cas de liaison d'événement en ligne) comme:

<a href="#" onclick="myJsFunc(); return false;">Run JavaScript Code</a>

Ou vous pouvez changer l' attribut href avec JavaScript comme:

<a href="javascript://" onclick="myJsFunc();">Run JavaScript Code</a>

ou

<a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>

Mais sémantiquement, toutes les façons ci-dessus pour y parvenir sont fausses (cela fonctionne bien cependant) . Si aucun élément n'est créé pour naviguer dans la page et auquel certains éléments JavaScript sont associés, il ne doit pas s'agir d'un élément<a> balise.

Vous pouvez simplement utiliser a à la <button />place pour faire des choses ou tout autre élément comme b, span ou tout ce qui vous convient, car vous êtes autorisé à ajouter des événements sur tous les éléments.


Il y a donc un avantage à utiliser <a href="#">. Vous obtenez le pointeur du curseur par défaut sur cet élément lorsque vous le faites a href="#". Pour cela, je pense que vous pouvez utiliser CSS pour cela commecursor:pointer; qui résout également ce problème.

Et à la fin, si vous liez l'événement à partir du code JavaScript lui-même, vous pouvez le faire event.preventDefault()si vous utilisez une <a>balise, mais si vous n'utilisez pas de<a> balise pour cela, vous obtenez un avantage, vous ne le faites pas '' t besoin de le faire.

Donc, si vous voyez, il vaut mieux ne pas utiliser de balise pour ce genre de choses.

Ashish Kumar
la source
23

N'utilisez pas de liens dans le seul but d'exécuter JavaScript.

L'utilisation de href = "#" fait défiler la page vers le haut; l'utilisation de void (0) crée des problèmes de navigation dans le navigateur.

Utilisez plutôt un élément autre qu'un lien:

<span onclick="myJsFunc()" class="funcActuator">myJsFunc</span>

Et stylisez-le avec CSS:

.funcActuator { 
  cursor: default;
}

.funcActuator:hover { 
  color: #900;
}
Garrett
la source
13
Utilisez un bouton, pas un span. Les boutons tombent naturellement dans l'ordre de mise au point et sont donc accessibles sans souris / trackpad / etc.
Quentin
4
Ajout du commentaire de ton Quentin: tel qu'il est actuellement écrit, les utilisateurs du clavier n'atteindront pas l' spanélément car il s'agit d'un élément non focalisable. C'est pourquoi vous avez besoin d'un bouton.
Tsundoku
1
Vous pouvez le rendre focalisable en ajoutant tabindex="0"à la durée. Cela dit, l'utilisation du bouton est meilleure car elle vous offre gratuitement les fonctionnalités souhaitées. Pour le rendre accessible à l'aide d'une plage, vous devez non seulement attacher un gestionnaire de clic, mais un gestionnaire d'événements de clavier qui recherche les pressions sur la barre d'espace ou la touche Entrée, puis déclenche le gestionnaire de clic normal. Vous souhaiterez également modifier le deuxième sélecteur CSS pour .funcActuator:hover, .funcActuator:focusque le fait que l'élément ait le focus soit apparent.
Code inutile
22

Il serait préférable d'utiliser jQuery,

$(document).ready(function() {
    $("a").css("cursor", "pointer");
});

et omettez les deux href="#"et href="javascript:void(0)".

Le balisage de la balise d'ancrage sera comme

<a onclick="hello()">Hello</a>

Assez simple!

naveen
la source
5
Voilà ce que j'allais dire. Si un lien a une URL de secours qui a du sens, utilisez-la. Sinon, omettez simplement le href ou utilisez quelque chose de plus sémantiquement approprié qu'un <a>. Si la seule raison pour laquelle tout le monde préconise l'inclusion du href est de mettre le doigt sur le survol, un simple "a {curseur: pointeur;}" fera l'affaire.
Matt Kantor
12
Cela donne une accessibilité terrible. Essayez-le dans SO: vous ne pouvez pas signaler un message sans utiliser la souris. Les liens "lien" et "modifier" sont accessibles par tabulation, mais pas "drapeau".
Nicolás
6
Je suis d'accord avec cette option. Si l'ancre n'a pas d'autre but que JavaScript, elle ne devrait pas avoir de href. @Fatih: L'utilisation de jQuery signifie que si JavaScript est désactivé, le lien n'aura PAS de pointeur.
Scott Rippey
3
Si vous allez suivre cette voie, pourquoi ne pas lier le clic à l'aide de jQuery également? Une partie du grand avantage de l'utilisation de jQuery est la possibilité de séparer votre javascript de votre balisage.
Muhd
4
Je ne peux pas croire que cette réponse ait 11 votes. C'est terrible. Pourquoi ajoutez-vous un style via Javascript (et jQuery ??), puis définissez votre action onclick en HTML? Terrible.
MMM
20

Si vous utilisez AngularJS , vous pouvez utiliser ce qui suit:

<a href="">Do some fancy JavaScript</a>

Ce qui ne fera rien.

en plus

  • Cela ne vous mènera pas en haut de la page, comme avec (#)
    • Par conséquent, vous n'avez pas besoin de retourner explicitement falseavec JavaScript
  • Il est court et concis
whirlwin
la source
6
Mais cela entraînerait le rechargement de la page, et puisque nous utilisons toujours javascript pour modifier la page, cela est inacceptable.
Henry Hu
@HenryHu J'ai compris que la raison pour laquelle il ne se rechargeait pas était à cause d'AngularJS. Voir ma réponse mise à jour.
whirlwin
19

S'il n'y a pas, il n'y a hrefpeut-être aucune raison d'utiliser une balise d'ancrage.

Vous pouvez attacher des événements (clic, survol, etc.) sur presque tous les éléments, alors pourquoi ne pas simplement utiliser un spanou un div?

Et pour les utilisateurs avec JavaScript désactivé: s'il n'y a pas de solution de rechange (par exemple, une alternative href), ils ne devraient au moins pas être en mesure de voir et d'interagir avec cet élément, quel qu'il soit <a>ou une <span>balise.

achairapart
la source
19

Habituellement, vous devriez toujours avoir un lien de secours pour vous assurer que les clients avec JavaScript désactivé ont toujours certaines fonctionnalités. Ce concept est appelé JavaScript discret.

Exemple ... Disons que vous disposez du lien de recherche suivant:

<a href="search.php" id="searchLink">Search</a>

Vous pouvez toujours effectuer les opérations suivantes:

var link = document.getElementById('searchLink');

link.onclick = function() {
    try {
        // Do Stuff Here        
    } finally {
        return false;
    }
};

De cette façon, les personnes avec JavaScript désactivé sont dirigées vers search.phptandis que vos téléspectateurs avec JavaScript voient votre fonctionnalité améliorée.

Andrew Moore
la source
17

Je les utilise personnellement en combinaison. Par exemple:

HTML

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

avec un peu de jQuery

$('a[href="#"]').attr('href','javascript:void(0);');

ou

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

Mais je l'utilise juste pour empêcher la page de sauter vers le haut lorsque l'utilisateur clique sur une ancre vide. J'utilise rarement onClick et autreson événements directement en HTML.

Ma suggestion serait d'utiliser l' <span>élément avec l' classattribut au lieu d'une ancre. Par exemple:

<span class="link">Link</span>

Attribuez ensuite la fonction à .linkavec un script enveloppé dans le corps et juste avant la </body>balise ou dans un document JavaScript externe.

<script>
    (function($) {
        $('.link').click(function() {
            // do something
        });
    })(jQuery);
</script>

* Remarque: pour les éléments créés dynamiquement, utilisez:

$('.link').on('click', function() {
    // do something
});

Et pour les éléments créés dynamiquement qui sont créés avec des éléments créés dynamiquement, utilisez:

$(document).on('click','.link', function() {
    // do something
});

Ensuite, vous pouvez styliser l'élément span pour qu'il ressemble à une ancre avec un peu de CSS:

.link {
    color: #0000ee;
    text-decoration: underline;
    cursor: pointer;
}
.link:active {
    color: red;
}

Voici un exemple jsFiddle ci-dessus.

mdesdev
la source
16

Selon ce que vous voulez accomplir, vous pouvez oublier le onclick et simplement utiliser le href:

<a href="javascript:myJsFunc()">Link Text</a>

Il contourne la nécessité de retourner faux. Je n'aime pas cette #option car, comme mentionné, elle amènera l'utilisateur en haut de la page. Si vous avez un autre endroit pour envoyer l'utilisateur si JavaScript n'est pas activé (ce qui est rare où je travaille, mais c'est une très bonne idée), la méthode proposée par Steve fonctionne très bien.

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

Enfin, vous pouvez l'utiliser javascript:void(0)si vous ne voulez pas que quelqu'un aille n'importe où et si vous ne voulez pas appeler de fonction JavaScript. Cela fonctionne très bien si vous avez une image avec laquelle vous souhaitez qu'un événement survolant, mais il n'y a rien sur quoi l'utilisateur puisse cliquer.

liront
la source
3
Le seul inconvénient de cela (de mémoire, je peux me tromper) est qu'IE ne considère pas un A comme un A si vous n'avez pas de href à l'intérieur. (Les règles CSS ne fonctionneront donc pas)
Benjol
16

Quand j'ai plusieurs faux-liens, je préfère leur donner une classe de «non-lien».

Puis dans jQuery, j'ajoute le code suivant:

$(function(){
   $('.no-link').click(function(e){
       e.preventDefault();
   });
});

Et pour le HTML, le lien est simplement

<a href="/" class="no-link">Faux-Link</a>

Je n'aime pas utiliser les Hash-Tags sauf s'ils sont utilisés pour les ancres, et je ne fais ce qui précède que lorsque j'ai plus de deux faux-liens, sinon je choisis javascript: void (0).

<a href="javascript:void(0)" class="no-link">Faux-Link</a>

En règle générale, j'aime simplement éviter d'utiliser un lien et simplement envelopper quelque chose dans un intervalle et l'utiliser comme un moyen d'activer du code JavaScript, comme une fenêtre contextuelle ou une révélation de contenu.

Stacks sur Stacks sur Stacks
la source
16

Je pense que vous présentez une fausse dichotomie. Ce ne sont pas les deux seules options.

Je suis d'accord avec M. D4V360 qui a suggéré que, même si vous utilisez la balise d'ancrage, vous n'avez pas vraiment d'ancre ici. Tout ce que vous avez est une section spéciale d'un document qui devrait se comporter légèrement différemment. Une <span>balise est beaucoup plus appropriée.

Clever Human
la source
De plus, si vous deviez remplacer un apar un span, vous devrez vous rappeler de le rendre focalisable via le clavier.
AndFisher
16

J'ai essayé les deux dans Google Chrome avec les outils de développement, et cela a id="#"pris 0,32 seconde. Alors que la javascript:void(0)méthode n'a pris que 0,18 secondes. Donc, dans Google Chrome, javascript:void(0)fonctionne mieux et plus rapidement.

6460587
la source
En fait, ils ne font pas de même. # vous fait sauter en haut de la page.
Jochen Schultz
13

Je paraphrase essentiellement cet article pratique en utilisant l'amélioration progressive . La réponse courte est que vous n'utilisez jamais javascript:void(0);ou à #moins que votre interface utilisateur n'ait déjà déduit que JavaScript est activé, auquel cas vous devez utiliserjavascript:void(0); . En outre, n'utilisez pas span comme liens, car cela est sémantiquement faux pour commencer.

L'utilisation de routes URL optimisées pour le référencement dans votre application, telles que / Accueil / Action / Paramètres est également une bonne pratique. Si vous avez d'abord un lien vers une page qui fonctionne sans JavaScript, vous pouvez améliorer l'expérience par la suite. Utilisez un vrai lien vers une page de travail, puis ajoutez un événement onlick pour améliorer la présentation.

Voici un exemple. Accueil / ChangePicture est un lien de travail vers un formulaire sur une page complète avec une interface utilisateur et des boutons de soumission HTML standard, mais il semble plus joli injecté dans une boîte de dialogue modale avec des boutons jQueryUI. Dans les deux cas, cela fonctionne, selon le navigateur, ce qui satisfait le premier développement mobile.

<p><a href="Home/ChangePicture" onclick="return ChangePicture_onClick();" title="Change Picture">Change Picture</a></p>

<script type="text/javascript">
    function ChangePicture_onClick() {
        $.get('Home/ChangePicture',
              function (htmlResult) {
                  $("#ModalViewDiv").remove(); //Prevent duplicate dialogs
                  $("#modalContainer").append(htmlResult);
                  $("#ModalViewDiv").dialog({
                      width: 400,
                      modal: true,
                      buttons: {
                          "Upload": function () {
                              if(!ValidateUpload()) return false;
                              $("#ModalViewDiv").find("form").submit();
                          },
                          Cancel: function () { $(this).dialog("close"); }
                      },
                      close: function () { }
                  });
              }
        );
        return false;
    }
</script>
Josh Simerman
la source
En termes de référencement, je préférerais cette méthode. L'utilisation d'autant d'URL conviviales améliorera certainement le facteur de valeur de la page.
Chetabahana