87 votes

Quelle est la différence entre les différentes méthodes pour mettre du code JavaScript dans un <a> ?

J'ai vu les méthodes suivantes pour mettre du code JavaScript dans un fichier de type <a> étiquette :

function DoSomething() { ... return false; }
  1. <a href="javascript:;" onClick="return DoSomething();">link</a>
  2. <a href="javascript:DoSomething();">link</a>
  3. <a href="javascript:void(0);" onClick="return DoSomething();">link</a>
  4. <a href="#" onClick="return DoSomething();">link</a>

Je comprends l'idée d'essayer de mettre une URL valide au lieu d'un simple code JavaScript, juste au cas où l'utilisateur n'aurait pas activé JavaScript. Mais pour les besoins de cette discussion, je dois supposer que JavaScript est activé (ils ne peuvent pas se connecter sans).

Personnellement, j'aime l'option 2 car elle vous permet de voir ce qui va être exécuté, ce qui est particulièrement utile pour le débogage lorsque des paramètres sont passés à la fonction. Je l'ai utilisé assez souvent et je n'ai pas rencontré de problèmes de navigation.

J'ai lu que les gens recommandent 4, parce que cela donne à l'utilisateur un vrai lien à suivre, mais vraiment, # n'est pas "réel". Il n'ira absolument nulle part.

Y en a-t-il un qui n'est pas pris en charge ou qui est vraiment mauvais, lorsque vous savez que l'utilisateur a activé JavaScript ?

Question connexe : Href pour les liens JavaScript : "#" ou "javascript:void(0)" ? .

0 votes

Petit problème de syntaxe : Le choix n°2 devrait être - <a href="javascript:DoSomething() ;">lien</a> sans le "return".

0 votes

Veuillez changer la réponse acceptée par la réponse de @eyelidlessness. Je pense que c'est la meilleure approche, car elle se soucie de la sémantique.

69voto

cowgod Points 5330

J'apprécie beaucoup L'article de Matt Kruse sur les meilleures pratiques Javascript . Dans ce document, il affirme que l'utilisation du href pour exécuter du code JavaScript est une mauvaise idée. Même si vous avez déclaré que vos utilisateurs doivent avoir JavaScript activé, il n'y a aucune raison pour que vous ne puissiez pas avoir une simple page HTML vers laquelle tous vos liens JavaScript peuvent pointer pour leur href au cas où quelqu'un désactiverait JavaScript après s'être connecté. Je vous encourage vivement à autoriser ce mécanisme de repli. Un tel mécanisme permettra de respecter les "meilleures pratiques" et d'atteindre votre objectif :

<a href="javascript_required.html" onclick="doSomething(); return false;">go</a>

4 votes

Car la valeur du href sera affichée à l'utilisateur dans la barre d'état ? (la barre en bas), j'envisagerais d'utiliser un lien un peu plus convivial, par exemple "js.html?doSomething", la page pouvant toujours être en html statique. De cette façon, l'utilisateur verra clairement la différence entre les liens.

7 votes

Vous pouvez remplacer cette valeur par l'attribut title, par exemple : <a href="javascript_required.html" title="Does Something" onclick="doSomething() ; return false ;">go</a>

0 votes

La meilleure pratique consiste à enregistrer les requêtes sur la page javascript_required.html et à enregistrer la fonction qui a provoqué l'erreur.

10voto

eyelidlessness Points 28034

Pourquoi faire ça alors que vous pouvez utiliser addEventListener / attachEvent ? S'il n'y a pas href -équivalente, n'utilisez pas une <a> utiliser un <button> et le styliser en conséquence.

9 votes

L'utilisation d'un bouton au lieu d'un lien n'est pas une option réalisable dans de nombreux cas.

2 votes

Parce que c'est moche. Vous pouvez ajouter une icône à côté du lien. Il est difficile de les formater de la même manière dans tous les navigateurs. Et en général, les gens préfèrent les liens aux boutons - regardez la plupart des flux de piles.

2 votes

C'est moche ? Il ressemble à ce que vous voulez qu'il ressemble. En fait, je pense que les boutons ont une plus grande souplesse de style que les liens, dans la mesure où ils sont en ligne mais peuvent prendre correctement le padding dans tous les navigateurs. Tout ce qui peut être fait avec un lien peut être fait avec un bouton, en ce qui concerne les CSS.

5voto

nickf Points 185423

Vous avez oublié une autre méthode :

5: <a href="#" id="myLink">Link</a>

Avec le code JavaScript :

document.getElementById('myLink').onclick = function() {
    // Do stuff.
};

Je ne peux pas me prononcer sur l'option qui bénéficie du meilleur support ou qui est sémantiquement la meilleure, mais je dirai simplement que je préfère de loin ce style parce qu'il sépare votre contenu de votre code JavaScript. Il permet de garder tout le code JavaScript ensemble, ce qui est beaucoup plus facile à maintenir (surtout si vous l'appliquez à de nombreux liens), et vous pouvez même le mettre dans un fichier externe qui peut ensuite être emballé pour réduire la taille des fichiers et mis en cache par les navigateurs clients.

7 votes

Si vous avez 20 ou 30 liens différents avec JS, cela peut devenir assez fastidieux et se terminer avec beaucoup de JS.

0 votes

Ce n'est pas plus fastidieux que de patauger dans le HTML pour modifier le javascript. ...ou vous pouvez utiliser quelque chose comme jQuery qui peut facilement modifier les événements sur plusieurs éléments à la fois... $('#menu a').click(function() { ... })

1 votes

@JKirchartz Je ne vois pas en quoi c'est un prêche s'il y a des raisons derrière la réponse. Si vous lisez la question, c'est vraiment un "lequel de ces 4 est le meilleur", et j'ai juste fait remarquer qu'il y avait une autre option qu'il n'avait pas considérée.

3voto

nlaq Points 11379
<a href="#" onClick="DoSomething(); return false;">link</a>

Je vais faire ça, ou :

<a href="#" id = "Link">link</a>
(document.getElementById("Link")).onclick = function() {
    DoSomething();
    return false;
};

En fonction de la situation. Pour les applications plus importantes, la deuxième solution est la meilleure car elle permet de consolider le code de l'événement.

0 votes

Si vous avez 20 ou 30 liens différents avec JS, cela peut devenir assez fastidieux et se terminer avec beaucoup de JS.

0 votes

Et les bogues qui se glissent dans votre code peuvent être TRÈS difficiles à déboguer. Ces bugs apparaissent très facilement, comme le prouve votre premier exemple :)

1voto

Pier Luigi Points 4428

La méthode n° 2 présente une erreur de syntaxe dans FF3 et IE7. Je préfère les méthodes #1 et #3, car la #4 salit l'URI avec '#' bien qu'elle provoque moins de saisie... Évidemment, comme indiqué dans d'autres réponses, la meilleure solution est de séparer le html de la gestion des événements.

0 votes

Méthode n° 2 de quoi ? Les questions ne restent pas dans le même ordre que lorsque VOUS les avez vues.

0 votes

Méthode n°4 ne le fera pas perturber l'URI si vous veillez à return false . C'est pourquoi la méthode n° 4 est probablement la meilleure (parmi celles énumérées).

2 votes

@Diodeus, je pense que Pier faisait référence à la liste numérotée dans la question qui est en fait là depuis que la question a été posée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X