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>
javascript
html
performance
optimization
href
Peter Mortensen
la source
la source
<a href="javascript:void(0)" onclick="myJsFunc();">
cela n'a absolument aucun sens. Si vous devez utiliser lejavascript:
protocole psuedo, vous n'avez pas non plus besoin de l'onclick
attribut.<a href="javascript:myJsFunc();">
fera très bien.myJsFunc()
a une valeur de retour, votre page se cassera. jsfiddle.net/jAd9G Vous souhaitez toujours avoir à utiliservoid
comme 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.<a href="javascript:;" onclick="myEvent()"
?javascript:;
est beaucoup plus rapide à taper quejavascript:void(0)
<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 unespan
balise avec une classe dejs-trigger
serait probablement beaucoup mieux ". Ou est-ce que je manque quelque chose?Réponses:
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:Mais ensuite, ils oublient d'utiliser
return doSomething()
dans le onclick et utilisent simplementdoSomething()
.Une deuxième raison pour éviter
#
est que la finalereturn 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
onclick
proprié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, mononclick
(ou n'importe quoi) dans le balisage HTML ressemble à ceci:OU
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 queonclick
contient toujoursreturn false;
à la fin, que toute fonction appelée neonclick
renvoie 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 retournefalse
.OU
Utilisation
href="javascript:void(0)"
La seconde est clairement beaucoup plus facile à communiquer.
la source
href="javascript:void(0)"
méthodejavascript:
devrait être considérée comme une mauvaise pratique, importune et ne dégrade pas gracieusement.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 lareturn false;
folie.javascript:void(0)
enfreint la politique de sécurité du contenu sur les pages HTTPS compatibles CSP. Une option serait alors d'utiliserhref='#'
etevent.preventDefault()
dans le gestionnaire, mais je n'aime pas beaucoup ça. Vous pouvez peut-être établir une convention à utiliserhref='#void'
et vous assurer qu'aucun élément de la page ne l'aid="void"
. De cette façon, cliquer sur un lien vers une ancre non existante ne fera pas défiler la page.href
. Cela se ferait dans jQuery avec:$('a[href="#"]').click(function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; });
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).
la source
javascript:
ou de l'autre ou de#
mauvaises pratiques et ne doit pas être encouragé. Beaux articles btw.<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.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 unonclick
attribut - c'était bien il y a cinq ans, bien que maintenant cela puisse être une mauvaise pratique. Voici pourquoi:Il promeut la pratique du JavaScript intrusif - qui s'est avéré difficile à maintenir et à mettre à l'échelle. Plus à ce sujet dans JavaScript discret .
Vous passez votre temps à écrire du code incroyablement trop verbeux - ce qui a très peu (voire aucun) avantage pour votre base de code.
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'
href
attribut 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 échelleExemple de code simple
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'
href
attribut sur l'a
élément rendra l'élément inaccessible à l'aide de latab
navigation par clé. Si vous souhaitez que ces éléments soient accessibles via latab
clé, vous pouvez définir l'tabindex
attribut ou utiliser desbutton
é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'
href
attribut sur l'a
élément empêchera Internet Explorer 6 et Internet Explorer 7 de prendre lea:hover
style, c'est pourquoi nous avons ajouté un simple cale JavaScript pour accomplir cela viaa.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 unhref
attribut 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 unevent.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.la source
button
approche de type lien suggérée ici est en proie à l' état actif "3d" inévitable dans IE9 et inférieur .javascript:void(0)
. Telle est la réponse pragmatique et la seule réponse sensée dans le monde réel.'#'
ramènera l'utilisateur en haut de la page, donc je vais généralement avecvoid(0)
.javascript:;
se comporte également commejavascript:void(0);
la source
#
ou vous#something
amènera à cette ancre sur la base href page de , plutôt que sur la page en cours.#!
) fait l'affaire mais c'est définitivement une mauvaise pratique.Je ne dirais honnêtement ni l'un ni l'autre. J'utiliserais un stylisé
<button></button>
pour ce comportement.De cette façon, vous pouvez attribuer votre onclick. Je suggère également une liaison via un script, sans utiliser l'
onclick
attribut 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.REMARQUE: vous pouvez remplacer le
0
par une chaîne telle quejavascript:void('Delete record 123')
qui peut servir d'indicateur supplémentaire qui montrera ce que le clic fera réellement.la source
<button>
mais un à lainput type=button
place?<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.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>
.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.
Si vous utilisez Angular2, cette méthode fonctionne:
<a [routerLink]="" (click)="passTheSalt()">Click me</a>
.Voir ici https://stackoverflow.com/a/45465728/2803344
la source
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 unonclick handler
attaché 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:
la source
<span>
s ne sont pas censés faire quoi que ce soit.<A>
nchors et<buttons>
sont utilisés pour ça!buttons
est un meilleur choix ici alors que cespan
n'est pas le cas.Idéalement, vous feriez ceci:
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.
la source
L'utilisation ne
#
fait que des mouvements amusants, donc je recommanderais d'utiliser#self
si vous souhaitez économiser sur les efforts de frappe deJavaScript bla, bla,
.la source
#self
balises nommées et éviter le comportement ennuyeux du navigateur de sauter en haut de la page. Je vous remercie.#self
ne 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.#void
convention dans l'autre commentaire, mais il#self
est en fait aussi court et facile à mémoriser. Tout vaut mieux que#
J'utilise ce qui suit
au lieu
la source
javascript:
(pas de point-virgule) car il semble le plus net dans la barre d'état en survol.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 foo
peut êtreDelete record X
ou ce que vous voulez.Je suis d'accord avec les suggestions ailleurs indiquant que vous devez utiliser une URL régulière dans l'
href
attribut, puis appeler une fonction JavaScript dans onclick. Le défaut est qu'ils ajoutent automatiquementreturn false
aprè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
true
si elle fonctionne correctement. Utilisez ensuite la valeur renvoyée pour déterminer si le clic doit être annulé ou non:Javascript
HTML
Notez que je nie le résultat de la
doSomething()
fonction. Si cela fonctionne, il reviendratrue
, il sera donc annulé (false
) et lepath/to/some/URL
ne sera pas appelé. Si la fonction revientfalse
(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étrue
etpath/to/some/URL
est appelé.la source
#
est mieux quejavascript:anything
, mais ce qui suit est encore mieux:HTML:
JavaScript:
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.
la source
click
sur les liens…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 .)
la source
.btn
donne aux boutons et aux liens la même apparence.button
n'introduit pas non plus de # dans l'URL ou n'affiche pas laa
href en javascript :;À 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.
la source
Certainement, hash (
#
) est mieux car en JavaScript c'est un pseudoscheme: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".la source
Je vais d'habitude pour
Il est plus court que javascript: void (0) et fait de même.
la source
J'utiliserais:
Les raisons:
href
moteurs de recherche en ont donc besoin. Si vous utilisez autre chose (comme une chaîne), cela peut provoquer une404 not found
erreur.return false;
, la page ne saute pas vers le haut ou ne casse pas leback
bouton.la source
Je choisis d'utiliser
javascript:void(0)
, car cela pourrait empêcher un clic droit pour ouvrir le menu de contenu. Maisjavascript:;
est plus court et fait la même chose.la source
Donc, lorsque vous faites des choses JavaScript avec une
<a />
balise et si vous le mettezhref="#"
également, vous pouvez ajouter return false à la fin de l'événement (en cas de liaison d'événement en ligne) comme:Ou vous pouvez changer l' attribut href avec JavaScript comme:
ou
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 faitesa 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.
la source
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:
Et stylisez-le avec CSS:
la source
span
élément car il s'agit d'un élément non focalisable. C'est pourquoi vous avez besoin d'un bouton.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:focus
que le fait que l'élément ait le focus soit apparent.Il serait préférable d'utiliser jQuery,
et omettez les deux
href="#"
ethref="javascript:void(0)"
.Le balisage de la balise d'ancrage sera comme
Assez simple!
la source
Si vous utilisez AngularJS , vous pouvez utiliser ce qui suit:
Ce qui ne fera rien.
en plus
false
avec JavaScriptla source
S'il n'y a pas, il n'y a
href
peut-ê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
span
ou undiv
?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.la source
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:
Vous pouvez toujours effectuer les opérations suivantes:
De cette façon, les personnes avec JavaScript désactivé sont dirigées vers
search.php
tandis que vos téléspectateurs avec JavaScript voient votre fonctionnalité améliorée.la source
Je les utilise personnellement en combinaison. Par exemple:
HTML
avec un peu de jQuery
ou
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 autres
on
événements directement en HTML.Ma suggestion serait d'utiliser l'
<span>
élément avec l'class
attribut au lieu d'une ancre. Par exemple:Attribuez ensuite la fonction à
.link
avec un script enveloppé dans le corps et juste avant la</body>
balise ou dans un document JavaScript externe.* Remarque: pour les éléments créés dynamiquement, utilisez:
Et pour les éléments créés dynamiquement qui sont créés avec des éléments créés dynamiquement, utilisez:
Ensuite, vous pouvez styliser l'élément span pour qu'il ressemble à une ancre avec un peu de CSS:
Voici un exemple jsFiddle ci-dessus.
la source
Selon ce que vous voulez accomplir, vous pouvez oublier le onclick et simplement utiliser le href:
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.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.la source
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:
Et pour le HTML, le lien est simplement
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).
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.
la source
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.la source
a
par unspan
, vous devrez vous rappeler de le rendre focalisable via le clavier.J'ai essayé les deux dans Google Chrome avec les outils de développement, et cela a
id="#"
pris 0,32 seconde. Alors que lajavascript:void(0)
méthode n'a pris que 0,18 secondes. Donc, dans Google Chrome,javascript:void(0)
fonctionne mieux et plus rapidement.la source
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.
la source