Comment rendre un lien d'ancrage non cliquable ou désactivé?

89

J'ai un lien d'ancrage que je souhaite désactiver une fois que l'utilisateur clique dessus. Ou supprimez la balise d'ancrage autour du texte, mais conservez définitivement le texte.

<a href='' id='ThisLink'>some text</a>

Je peux le faire facilement avec un bouton en ajoutant que .attr("disabled", "disabled");
j'ai ajouté avec succès la propriété désactivée, mais le lien était toujours cliquable.
Je me fiche de savoir si le texte est souligné ou non.

Un indice?

Lorsque vous cliquez sur le mauvais musicien, il devrait simplement ajouter "Wrong" et ensuite devenir non cliquable.
Lorsque vous cliquez et que vous avez raison, il faut ajouter "Génial" puis désactiver toutes les <a>balises.

Evik James
la source
supprimez la partie href et ajoutez à votre CSS: "curseur: pointeur", je suppose que vous avez un $ ('# ThisLink'). click ou quelque chose comme ça?
Livre de Zeus
1
$ ("# ThisLink"). Parent (). Find ("a"). Remove ();
Adam Holmes
Adam, cette solution fonctionne presque. Cependant, il supprime tout le texte de la balise a.
Evik James
Double possible de Comment désactiver les liens HTML
Steve Chambers

Réponses:

12

Je viens de réaliser ce que vous demandiez (j'espère). Voici une solution moche

var preventClick = false;

$('#ThisLink').click(function(e) {
    $(this)
       .css('cursor', 'default')
       .css('text-decoration', 'none')

    if (!preventClick) {
        $(this).html($(this).html() + ' lalala');
    }

    preventClick = true;

    return false;
});
MSI
la source
Cela pourrait vraiment résoudre le problème, en quelque sorte ... Au lieu de .click, utilisez .on sur le corps et déléguez à 'a [disabled]'. Ensuite, placez le code css dans le css réel en utilisant le même sélecteur. Ensuite, empêcher le clic est aussi simple que event.preventDefault () et renvoie false
lassombra
2
Pas d'accord, utilisez CSS "pointer-events: none;" au lieu de cela, tout comme dans d'autres unswers.
vitrilo
200

La méthode la plus propre serait d'ajouter une classe avec des événements de pointeur: aucun lorsque vous souhaitez désactiver un clic. Cela fonctionnerait comme une étiquette normale.

.disableClick{
    pointer-events: none;
}
mvinayakam
la source
19
Utiliser cette idée un moyen encore plus simple serait d'utiliser un [désactivé] comme sélecteur pour le css afin de ne pas avoir besoin d'ajouter la classe .disableClick à l'ancre
Ferran Salguero
15
Soyez prudent, car vous pouvez toujours accéder aux choses désactivées avec les événements de pointeur: aucun
Mike Mellor
cette solution est bonne pour moi dans les navigateurs modernes. J'ai des balises d'ancrage utilisables qui sont liées pour cliquer sur les événements, et pour décourager les spammer pendant que leurs processus font leur travail, j'ajoute ceci par programme, puis je le supprime lorsque le processus est terminé. la tabulation vers une balise d'ancrage désactivée dans mon cas n'est pas non plus un problème, mais peut-être pour d'autres. YMMV
Stephen Tetreault
2
L'utilisation pointer-events:nonedésactivera également le cursortexte du titre et d'autres événements de survol de la souris.
Keith
la valeur aucun indique à l'événement de souris de passer "à travers" l'élément et de cibler ce qui se trouve "sous" cet élément à la place. developer.mozilla.org/en-US/docs/Web/CSS/pointer-events Cela pourrait poser des problèmes sur certaines mises en page
user2988142
33
<a href='javascript:void(0);'>some text</a>
Shiv Kumar Sah
la source
8
Veuillez expliquer votre solution afin que les futurs visiteurs de cette question comprennent comment elle résout le problème en question.
War10ck
3
De: MDN: l'opérateur du vide . Lorsqu'un navigateur suit a javascript: URI, il évalue le code dans l'URI, puis remplace le contenu de la page par la valeur renvoyée, sauf si la valeur renvoyée est undefined. L' voidopérateur peut être utilisé pour revenir undefined. Par exemple: <a href="javascript:void(0);"> Click here to do nothing </a> notez cependant que le javascript:pseudo protocole est déconseillé par rapport à d'autres alternatives, telles que les gestionnaires d'événements discrets.
Lénine
28

Utilisez le style CSS pointeur-événements . (comme l'a suggéré Jason MacDonald)

Voir MDN https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events . Il est pris en charge dans la plupart des navigateurs.

L'ajout simple d'un attribut "désactivé" à l'ancrage fera l'affaire si vous avez une règle CSS globale comme suit:

a[disabled], a[disabled]:hover {
   pointer-events: none;
   color: #e1e1e1;
}
vitrilo
la source
3
+1 pour ajouter le style via l'attribut [disabled] plutôt qu'une classe. Il convient de noter que les événements de pointeur: aucun; ne fonctionne pas dans quelque chose de plus ancien que IE11 cependant.
Daniel Tonon
Tous les IE ont leur propre logique propriétaire de désactivation par défaut de l'ancre, des boutons et même d'autres éléments.Cette solution de contournement est nécessaire pour les navigateurs non IE.
vitrilo
3
+1. Juste pour ne pas avoir à le chercher à nouveau la prochaine fois: javascript requis (en utilisant jQuery) serait $("#elementid").attr("disabled", "disabled");. Peut également être utile à inclure cursor: defaultdans le CSS (comme suggéré par Muhammad Nasir).
ASL
Un élément n'a pas d' attribut désactivé , l'utiliser comme sélecteur peut ou non fonctionner.
RobG
1
Intuitif - bonne solution. J'ai été en fait surpris de constater que les <a />éléments n'ont pas d'attribut désactivé - cela semble étrange.
Morvael
11
$('a').removeAttr('href')

ou

$('a').click(function(){ return false})

Cela dépend de la situation

Un coup de feu
la source
La suppression du a via le removeAttr ne fonctionne pas pour moi. .removeAttr ( "href") awesomealbums.info/?WhoAmI
Evik James
10

Bootstrap nous fournit la .disabledclasse. Veuillez l'utiliser.

Mais la .disabledclasse ne fonctionne que lorsque la balise «a» a déjà la classe «btn». Cela ne fonctionne pas sur les anciennes balises «a». La btnclasse peut ne pas être appropriée dans certains contextes car elle a des connotations de style. Sous les couvertures, la .disabledclasse est définie pointer-eventssur none, vous pouvez donc faire en sorte que CSS fasse la même chose que Saroj Aryal et Vitrilo l'ont suggéré. (Merci, Les Nightingill pour ce conseil).

Yevgeniy Afanasyev
la source
3
la classe .disabled ne fonctionne que lorsque la balise 'a' a déjà la classe 'btn'. Cela ne fonctionne pas sur les anciennes balises «a». La classe 'btn' peut ne pas convenir dans certains contextes car elle a des connotations de style. Sous les couvertures, la classe .disabled définit les événements de pointeur sur aucun, vous pouvez donc faire en sorte que css fasse la même chose que Saroj Aryal et Vitrilo l'ont suggéré.
Les Nightingill
Merci pour votre commentaire détaillé. Cela clarifie beaucoup pour de nombreux utilisateurs. Puis-je utiliser un texte de votre commentaire pour étendre ma réponse?
Yevgeniy Afanasyev
9

Ajouter une cssclasse:

.disable_a_href{
    pointer-events: none;
}

Ajoutez ceci jquery:

$("#ThisLink").addClass("disable_a_href"); 
Jason MacDonald
la source
5

Supprimez simplement l' hrefattribut de la balise d'ancrage.

Pilules d'explosion
la source
2
Dans certains navigateurs, la suppression de href définit simplement href sur / ou la page actuelle.
Polynôme du
Je pense que cela devrait être la première approche
Bas Slagter
5

Le meilleur moyen est d'empêcher l'action par défaut. Dans le cas de la balise d'ancrage, le comportement par défaut est la redirection vers l' hrefadresse spécifiée.

Donc, le javascript suivant fonctionne mieux dans la situation:

$('#ThisLink').click(function(e)
{
    e.preventDefault();
});
Kedar.Aitawdekar
la source
4

Vous pouvez utiliser l'événement onclick pour désactiver l'action de clic:

<a href='' id='ThisLink' onclick='return false'>some text</a>

Ou vous pouvez simplement utiliser autre chose qu'une <a>balise.

Polynôme
la source
Vous pouvez le combiner avec text-decoration: noneet .disabledLink { color: #000 !important; }pour le faire apparaître comme du texte normal.
Polynôme du
1
javascript importun est une solution terrible.
jahrichie
4

Les commentaires de Jason MacDonald ont fonctionné pour moi, testés dans Chrome, Mozila et IE.

Ajout de la couleur grise pour afficher l'effet de désactivation.

.disable_a_href{
    pointer-events: none;
    **color:#c0c0c0 !important;**
}

Jquery sélectionnait uniquement le premier élément de la liste d'ancrage, a ajouté un méta-caractère (*) pour sélectionner et désactiver tous les éléments avec un identifiant #ThisLink.

$("#ThisLink*").addClass("disable_a_href"); 
Pankaj
la source
4

Écrivez ceci une seule ligne de code jQuery

$('.hyperlink').css('pointer-events','none');

si vous voulez écrire dans un fichier css

.hyperlink{
    pointer-events: none;
}
Shaik Md N Rasool
la source
3

Créez la classe suivante dans la feuille de style:

  .ThisLink{
           pointer-events: none;
           cursor: default;
    }

Ajoutez cette classe à votre lien dynamiquement comme suit.

 <a href='' id='elemID'>some text</a>

    //   or using jquery
<script>
    $('#elemID').addClass('ThisLink');
 </script>
Muhammad Nasir
la source
En quoi est-ce différent de la réponse de Jason MacDonald ?
Tous les travailleurs sont essentiels
1

Essaye ça:

$('a').contents().unwrap();
Hari Pachuveetil
la source
quelle est l'ancre contient des règles de style qui sont essentielles à leur programme, c'est un correctif qui ne tient pas compte du css
Trevor Rudolph
1

Simplement dans SASS:

.some_class{
     // styles...

     &.active {
       pointer-events:none;
     }
}
Saroj Aryal
la source
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la raison et / ou la manière dont il répond à la question améliorerait considérablement sa valeur à long terme. Veuillez modifier votre réponse pour ajouter des explications.
Toby Speight
1

C'est la méthode que j'ai utilisée pour désactiver. J'espère que cela aide.

$("#ThisLink").attr("href","javascript:;");
Black Mamba
la source
1
C'est la solution simple et facile et doit être acceptée!
Si8
-1
$('#ThisLink').one('click',function(){
  $(this).bind('click',function(){
    return false;
  });
});

Ce serait une autre façon de faire cela, le gestionnaire avec return false, qui désactivera le lien, sera ajouté après un clic.

GNi33
la source
-4

Le moyen le plus simple

Dans votre html:

<a id="foo" disabled="true">xxxxx<a>

Dans votre js:

$('#foo').attr("disabled", false);

Si vous l'utilisez comme attribut fonctionne parfaitement

Nathre
la source
3
disabled n'est pas un attribut valide pour la balise <a>
Josepas