Fonction JavaScript dans href vs onclick
Je veux exécuter une simple fonction JavaScript sur un clic, sans redirection.
Est là toute la différence, ou de prestations entre la mise à l'appel JavaScript dans le href
attribut (comme ceci:
<a href="javascript:my_function();window.print();">....</a>
) vs de le mettre dans la onclick
attribut (qui le lie à l' onclick
événement)?
- Cette question a été discutée avant: stackoverflow.com/questions/245868/...
- Et stackoverflow.com/questions/134845/...
Vous devez vous connecter pour publier un commentaire.
Mettre le onclick dans le href irait à l'encontre de ceux qui croient fermement en la séparation du contenu et de comportement/action. L'argument est que votre contenu html devrait continuer de se concentrer uniquement sur le contenu, pas sur la présentation ou le comportement.
Le chemin d'accès standard de ces journées est d'utiliser une librairie javascript (ex. jquery) et de créer un gestionnaire d'événement à l'aide de la bibliothèque. Il ressemblerait à quelque chose comme:
href
contre inline dansonclick
? En supposant que vous alliez mettre en ligne pour une raison quelconque, ce qui devrait vous utiliser? (Dans la pratique, je ferais ce que vous l'avez suggéré, mais vous semblez avoir sauté sur la différence entre les deux attributs).mauvais:
bon:
mieux:
encore mieux 1:
encore mieux 2:
Pourquoi mieux? parce que
return false
va empêcher le navigateur d'suivant le lienmeilleur:
Utiliser jQuery ou autre cadre similaire à joindre onclick gestionnaire par l'identification de l'élément.
href
n'est pas définie à#
mais à un réel lien de la noJS navigateurs.javascript:void(0)
ne serait pas mieux que#
dans votre encore mieux 1 ?$('#myLink').click(function(){ MyFunction(); return false; });
vous pourriez ajouter à unon
fonction, comme ceci:$(document).on('click', ''#myLink', function() { MyFunction(); return false; });
bootstrap-confirmation
sur mon lien. Leonclick
version coutume de travail.a
de la balise avec l'inutilehref="#"
et d'appliquer lesonclick
gestionnaire directement sur le contenu. Si le contenu est un tag, vous pouvez simplement appliquer lamyLink
id sur elle. Si le contenu n'est pas une balise, entourent unspan
tag sur elle et d'appliquer lesmyLink
id de laspan
. Enfin, dans le CSS, ajoutercursor: pointer;
. De cette façon, le lien est très soigné comme un bouton et de ne pas ajouter une vilaine#
de l'URL ou de montrer ce vilain#
sur le lien info-bulle.#
aussi mauvais que ça a changé votre structure HTML.En termes de javascript, une différence est que le
this
mot-clé dans leonclick
gestionnaire reportez-vous à l'élément DOM dontonclick
attribut c'est (dans ce cas, le<a>
élément), alors quethis
dans lehref
attribut reportez-vous à lawindow
objet.En termes de présentation, si un
href
attribut est absent à partir d'un lien (c'est à dire<a onclick="[...]">
) puis, par défaut, les navigateurs afficheront latext
curseur (et pas souvent souhaitépointer
curseur), puisqu'il est le traitement de la<a>
comme une ancre, et non un lien.En termes de comportement, lors de la spécification d'une action par la navigation via
href
, le navigateur va prendre en charge l'ouverture de lahref
dans une fenêtre séparée à l'aide d'un raccourci ou le menu contextuel. Ce n'est pas possible lors de la spécification d'une action uniquement viaonclick
.Cependant, si vous vous demandez quelle est la meilleure façon d'obtenir des dynamiques de l'action de cliquer sur un objet DOM, puis attacher un événement à l'aide de javascript indépendamment du contenu de ce document est la meilleure façon d'aller. Vous pourriez le faire dans un certain nombre de façons. Une façon courante est d'utiliser une bibliothèque javascript comme jQuery pour lier un événement:
- Je utiliser
Un long chemin autour de lui, mais il fait le travail. utiliser Un style de simplifier
ensuite, elle devient:
nohref
attribut avant. C'est le plus logique/moyen élégant pour gérer de tels scripts javascript. Cela est compatible avec FF12 et IE8. Je vais donc remplacer toutes meshref="JavaScript:void(0);"
parnohref
. Merci beaucoup. Des acclamations.nohref
est une partie dearea
tag, pasa
! Votre exemple est le même que<a onClick="alert('Hello World')">HERE</a>
nohref
n'existe pas sur una
tag.En plus de tous ici, le href est indiqué sur la barre d'état du navigateur, et onclick pas. Je pense que ce n'est pas convivial pour afficher le code javascript n'.
la meilleure façon de le faire est:
Le problème est que cela VA ajouter un dièse (#) à la fin de l'URL de la page dans le navigateur, donc exiger de l'utilisateur cliquez sur le bouton deux fois pour aller à la page d'avant la vôtre. Considérant cela, vous devez ajouter un peu de code pour arrêter la propagation de l'évènement. La plupart des boîtes à outils javascript aura déjà une fonction pour cela. Par exemple, le dojo toolkit utilise
de le faire.
href="#"
le navigateur va chercher un nom de balise d'ancrage et depuis il ne l'a pas trouvé, alors il le fera de la fenêtre pour faire défiler vers le haut de la page, quelque chose qui pourrait ne pas être visible si vous vous êtes déjà au sommet. Pour éviter ce comportement, utilisez:href="javascript:;"
à la place.il a travaillé pour moi à l'aide de cette ligne de code:
Avoir
javascript:
dans n'importe quel attribut qui n'est pas spécifiquement pour le script est une ancienne méthode de HTML. Bien que, techniquement, cela fonctionne, vous êtes toujours à l'attribution de propriétés javascript non script attribut, ce qui n'est pas une bonne pratique. Il peut même échouer sur les anciens navigateurs, ou même de quelques modernes (googlé un post sur le forum nous a semblé indiquer que l'Opéra n'aime pas 'javascript:' url).Une meilleure pratique serait le deuxième moyen, mettez-y votre code javascript dans le
onclick
attribut, qui est ignoré si aucune fonctionnalité de script est disponible. Placer une URL valide dans le href champ (communément '#') pour la solution de repli pour ceux qui n'ont pas javascript.La réponse sommet est une très mauvaise pratique, on ne devrait jamais le lien à un hachage vide, car il peut créer des problèmes sur la route.
Le mieux est de se lier à un gestionnaire d'événement à l'élément que de nombreuses autres personnes ont déclaré, cependant,
<a href="javascript:doStuff();">do stuff</a>
fonctionne parfaitement dans tous les navigateurs actuels, et je l'utilise beaucoup quand les modèles de rendu pour éviter d'avoir à les relier pour chaque instance. Dans certains cas, cette approche offre de meilleures performances. YMMVUn autre fait intéressant tid bits....
onclick
&href
ont des comportements différents lors de l'appel javascript directement.onclick
va passerthis
contexte correctement, alors quehref
n'est pas, ou en d'autres termes<a href="javascript:doStuff(this)">no context</a>
ne fonctionne pas, alors que<a onclick="javascript:doStuff(this)">no context</a>
volonté.Oui, j'ai omis le
href
. Tout en qui ne correspond pas à la spécification, il fonctionne dans tous les navigateurs, même si, idéalement, il devrait inclure unhref="javascript:void(0);"
pour faire bonne mesureCela fonctionne
Personnellement, je trouve que mettre des appels javascript dans la balise HREF ennuyeux. D'habitude je ne fais pas vraiment attention à savoir si ou non quelque chose est un lien javascript ou pas, et très souvent l'envie d'ouvrir les choses dans une nouvelle fenêtre. Lorsque j'essaie de le faire avec un de ces types de liens, j'obtiens une page blanche avec rien et javascript dans ma barre d'adresse. Cependant, ce n'est éludée un peu à l'aide d'un onlick.
Une chose que j'ai remarqué lors de l'utilisation de "href" javascript:
Le script dans l'attribut "href" ne sera pas exécutée si la différence de temps entre 2 clics est assez courte.
Par exemple, essayez l'exemple suivant et double-cliquez sur (rapide!) sur chaque lien.
Le premier lien sera exécutée qu'une seule fois.
Le deuxième lien sera exécuté à deux reprises.
Reproduit dans Chrome (double clic) et IE11 (avec un triple clic).
Dans google Chrome, si vous cliquez sur assez rapide, vous pouvez faire 10 clics et ont seulement 1 exécution de la fonction.
Firefox fonctionne ok.
Tout d'abord, l'url dans
href
est meilleur parce qu'il permet aux utilisateurs de copier des liens, ouvrir dans un autre onglet, etc.Dans certains cas (par exemple, les sites avec de fréquentes modifications HTML) il n'est pas possible de lier des liens à chaque fois il y a une mise à jour.
Typique De La Méthode Bind
Lien Normal:
Et quelque chose comme ça pour JS:
Les avantages de cette méthode sont la séparation de balisage et de comportement et de ne pas répéter les appels de fonction dans chaque lien.
Pas De Méthode Bind
Si vous ne voulez pas de se lier à chaque fois, cependant, vous pouvez utiliser onclick et passer dans l'élément et de l'événement, par exemple:
Et ce pour JS:
L'avantage de cette méthode est que vous pouvez charger dans les nouveaux liens (par exemple via AJAX) chaque fois que vous le voulez sans avoir à vous soucier de la liaison de tous les temps.
J'ai constaté que le javascript: hrefs ne fonctionne pas lorsque la page a été intégré dans les Perspectives de la page web où un dossier de messagerie est configuré pour afficher plutôt une url