Disons que j'ai une balise d'ancrage telle que
<a href="#" ng-click="do()">Click</a>
Comment puis-je empêcher le navigateur de naviguer vers # dans AngularJS ?
angularjs
preventdefault
Micael
la source
la source
href
.href=''
pour garder le comportement du pointeur de la souris.Réponses:
MISE À JOUR : J'ai depuis changé d'avis sur cette solution. Après plus de développement et de temps passé à travailler sur cela, je pense qu'une meilleure solution à ce problème est de procéder comme suit:
Et puis mettez
css
à jour votre pour avoir une règle supplémentaire:C'est beaucoup plus simple et offre exactement la même fonctionnalité et est beaucoup plus efficace. J'espère que cela pourrait être utile à toute personne cherchant cette solution à l'avenir.
Ce qui suit est ma solution précédente, que je laisse ici juste à des fins héritées:
Si vous rencontrez souvent ce problème, une simple directive qui permettrait de résoudre ce problème est la suivante:
Il vérifie toutes les balises d'ancrage (
<a></a>
) pour voir si leurhref
attribut est soit une chaîne vide (""
) soit un hachage ('#'
) ou s'il y a uneng-click
affectation. S'il trouve l'une de ces conditions, il intercepte l'événement et empêche le comportement par défaut.Le seul inconvénient est qu'il exécute cette directive pour toutes les balises d'ancrage. Donc, si vous avez beaucoup de balises d'ancrage sur la page et que vous ne souhaitez empêcher le comportement par défaut que pour un petit nombre d'entre elles, cette directive n'est pas très efficace. Cependant, je le veux presque toujours
preventDefault
, donc j'utilise cette directive partout dans mes applications AngularJS.la source
href
attribut vide a un comportement variable dans différents navigateurs. Bien que je convienne que c'est de loin la solution la plus propre et la plus efficace, elle a quelques problèmes entre les navigateurs. L'utilisation de l'approche directive permet au navigateur de gérer la<a>
balise comme il le ferait normalement, tout en obtenant à l'OP la réponse qu'il recherchait.Selon la documentation de ngHref, vous devriez pouvoir laisser le href ou faire href = "".
la source
Vous pouvez passer l'objet $ event à votre méthode et l'appeler
$event.preventDefault()
afin que le traitement par défaut ne se produise pas:la source
$event.preventDefault()
... la taxe IE.ng-click="do(); $event.preventDefault()
par exemple ... bien que ce ne soit pas nécessaire car la réponse de @ Chris ci-dessous est la bonne. Cela pourrait aider les gens dans des situations où ils ont imbriqué ngClicks et qu'ils souhaitent appeler$event.stopPropagation()
, cependant.Je préfère utiliser des directives pour ce genre de chose. Voici un exemple
Et le code de directive pour
eat-click
:Vous pouvez maintenant ajouter l'
eat-click
attribut à n'importe quel élément et il serapreventDefault()
automatiquement édité.Avantages:
$event
objet laid dans votredo()
fonction.$event
objetla source
Error: $ is not defined
. Qu'est-ce que je rate?angular.element(element).bind('click', function(event){...});
. Ça a marché. Ref: jQLiteBien que Renaud ait donné une excellente solution
J'ai personnellement trouvé que vous avez également besoin de $ event.stopPropagation () dans certains cas pour éviter certains des effets secondaires
sera ma solution
la source
la source
La solution la plus simple que j'ai trouvée est celle-ci:
la source
Donc, en lisant ces réponses, @Chris a toujours la réponse la plus "correcte", je suppose, mais il a un problème, il n'affiche pas le "pointeur" ....
Voici donc deux façons de résoudre ce problème sans avoir besoin d'ajouter un curseur: style de pointeur:
Utilisez
javascript:void(0)
au lieu de#
:À utiliser
$event.preventDefault()
dans lang-click
directive (pour ne pas joncher votre contrôleur avec des références DOM):Personnellement, je préfère le premier au second.
javascript:void(0)
a d'autres avantages qui sont discutés ici . Il y a également une discussion sur le «JavaScript discret» dans ce lien qui est effroyablement récent et ne s'applique pas nécessairement directement à une application angulaire.la source
javascript:;
Vous pouvez faire comme suit
1.Retirer l'
href
attribut de laa
balise anchor ( )2.Réglez le curseur du pointeur en CSS sur les éléments de clic
la source
HTML
ici pure angularjs: près de la fonction ng-click, vous pouvez écrire la fonction preventDefault () en séparant le point-virgule
JS
(ou)
vous pouvez procéder de cette façon, cela est déjà discuté ici.
HTML
JS
la source
Essayez cette option qui je vois n'est pas encore listée ci-dessus:
la source
Puisque vous créez une application Web, pourquoi avez-vous besoin de liens?
Échangez vos ancres contre des boutons!
la source
si toujours d'actualité:
la source
Le moyen le plus sûr d'éviter les événements sur un href serait de le définir comme
la source
J'irais avec:
L'ensemble de cette chose empêchant le défaut m'a dérouté, j'ai donc créé un JSFiddle pour illustrer quand et où Angular empêche le défaut .
Le JSFiddle utilise la directive a d'Angular - il devrait donc être EXACTEMENT le même. Vous pouvez voir le code source ici: un code source de balise
J'espère que cela aidera la clarification pour certains.
J'aurais aimé poster le doc sur ngHref mais je ne peux pas à cause de ma réputation.
la source
C'est ce que je fais toujours. Fonctionne comme un charme!
la source
Ou si vous avez besoin en ligne, vous pouvez le faire:
la source
Beaucoup de réponses semblent exagérées. POUR MOI, ça marche
la source
J'ai besoin d'une présence de la valeur de l'attribut href pour la dégradation (lorsque js est désactivé), donc je ne peux pas utiliser l'attribut href vide (ou "#"), mais le code ci-dessus n'a pas fonctionné pour moi, car j'ai besoin d'un événement ( e) variable. J'ai créé ma propre directive:
En HTML:
la source
Empruntant à la réponse de tennisgent. J'aime que vous n'ayez pas à créer une directive personnalisée à ajouter sur tous les liens. Cependant, je n'ai pas pu faire fonctionner son IE8. Voici ce qui a finalement fonctionné pour moi (en utilisant angulaire 1.0.6).
Notez que 'bind' vous permet d'utiliser jqLite fourni par angular donc pas besoin de boucler avec jQuery complet. Également requis la méthode stopPropogation.
la source
dropdown
, je veux la propagation mais pas le comportement par défaut. Cet extrait n'est PAS recommandé.J'ai rencontré ce même problème lors de l'utilisation d'ancres pour une liste déroulante de bootstrap angulaire. La seule solution que j'ai trouvée qui a évité les effets secondaires indésirables (c'est-à-dire la liste déroulante ne se fermant pas en raison de l'utilisation de preventDefault ()) était d'utiliser ce qui suit:
la source
si vous ne voulez jamais aller à href ... vous devez changer votre balisage et utiliser un bouton et non une balise d'ancrage car sémantiquement ce n'est pas une ancre ou un lien. Inversement, si vous avez un bouton qui vérifie puis redirige, ce devrait être un lien / une balise d'ancrage et non un bouton ... à des fins de référencement ainsi que de test [insérer la suite de tests ici].
pour les liens que vous souhaitez uniquement rediriger de manière conditionnelle comme l'invite à enregistrer les modifications ou à reconnaître l'état sale ... vous devez utiliser ng-click = "someFunction ($ event)" et dans someFunction sur votre validationError preventDefault et ou stopPropagation.
aussi parce que vous pouvez ne signifie pas que vous devriez . javascript: void (0) a bien fonctionné à l'époque ... mais à cause des hackers / crackers néfastes, les navigateurs signalent les applications / sites qui utilisent javascript dans un href ... ne voyez aucune raison de ducktype ci-dessus ..
c'est 2016 depuis 2010 ne devrait être aucune raison d'utiliser des liens qui agissent comme des boutons ... si vous devez toujours prendre en charge IE8 et ci-dessous, vous devez réévaluer votre établissement.
la source
la source
Ce que vous devez faire, c'est supprimer
href
complètement l' attribut.Si vous regardez le code source de la
a
directive élément (qui fait partie du noyau angulaire), il indique à la ligne 29 - 31:Ce qui signifie qu'Angular résout déjà le problème des liens sans href. Le seul problème que vous avez toujours est le problème css. Vous pouvez toujours appliquer le style de pointeur aux ancres avec ng-clics, par exemple:
Ainsi, vous pouvez même rendre votre site plus accessible en marquant de vrais liens avec un style subtil et différent, puis des liens qui remplissent des fonctions.
Bon codage!
la source
Vous pouvez désactiver la redirection d'URL dans le Html5Mode de $ location pour atteindre l'objectif. Vous pouvez le définir à l'intérieur du contrôleur spécifique utilisé pour la page. Quelque chose comme ça:
la source
Si vous utilisez Angular 8 ou plus, vous pouvez créer une directive:
Sur votre balise d'ancrage sur le composant, vous pouvez le câbler comme ceci:
Le module d'application doit avoir sa déclaration:
la source
Une alternative pourrait être:
la source
span
pour cliquer. Allez juste pour la réponse de @ tennisgent - ancres sanshref
défini.