Comment activer ou désactiver une ancre à l'aide de jQuery?

150

Comment activer ou désactiver une ancre à l'aide de jQuery?

Senthil Kumar Bhaskaran
la source
Merci pour toute votre réponse, cela ne fonctionne toujours pas, alors pouvez-vous s'il vous plaît le faire fonctionner avec la fonction document.ready
Senthil Kumar Bhaskaran
Cela peut aider si vous publiez l'extrait de code qui ne fonctionne pas.
Hourra Im Helping
En fait, mon codage est dans Rails et mon codage est <% = foo.add_associated_link ('Add email', @ project.email.build)%> quand je le rend dans le navigateur, je peux voir l'e-mail mais je ne peux pas le désactiver même si essayé avec un codage tel que e.preventDefault () mais sans résultat
Senthil Kumar Bhaskaran

Réponses:

194

Pour empêcher une ancre de suivre le spécifié href, je suggérerais d'utiliser preventDefault():

// jQuery 1.7+
$(function () {
    $('a.something').on("click", function (e) {
        e.preventDefault();
    });
});

// jQuery < 1.7
$(function () {
    $('a.something').click(function (e) {
        e.preventDefault();
    });

    // or 

    $('a.something').bind("click", function (e) {
        e.preventDefault();
    });
});

Voir:

http://docs.jquery.com/Events/jQuery.Event#event.preventDefault.28.29

Voir également cette question précédente sur SO:

jQuery désactiver un lien

karim79
la source
J'ai essayé avec ces "attr", cela ne fonctionne que sur l'élément de formulaire et non sur la balise Anchor.
Senthil Kumar Bhaskaran
1
@senthil - preventDefault est considéré comme la `` bonne '' façon de faire cela, voir ma modification (lien vers un autre Q + A)
karim79
En fait, mon codage est dans Rails et mon codage est <% = foo.add_associated_link ('Add email', @ project.email.build)%> quand je le rend dans le navigateur, je peux voir l'e-mail mais je ne peux pas le désactiver même si essayé avec un codage tel que e.preventDefault () mais sans résultat
Senthil Kumar Bhaskaran
2
comment inverser $('a.something').on("click", function (e) { e.preventDefault(); });?
ア レ ッ ク ス
2
Pas d'accord, utilisez CSS "pointer-events: none;" au lieu de cela, tout comme dans d'autres unswers.
vitrilo
116

L'application sur laquelle je travaille actuellement le fait avec un style CSS en combinaison avec javascript.

a.disabled { color:gray; }

Ensuite, chaque fois que je veux désactiver un lien que j'appelle

$('thelink').addClass('disabled');

Ensuite, dans le gestionnaire de clics pour 'thelink' une balise, j'exécute toujours une vérification en premier

if ($('thelink').hasClass('disabled')) return;
AgileJon
la source
6
Cette dernière ligne ne devrait-elle pas dire "return false;"?
Prestaul
1
Bon appel, Prestaul. Lorsqu'il est lié à une balise <a>, j'utilise: <a href="wwhat" onclick="return disableLink(this)"> .. then: function disableLink (node) {if (dojo.hasClass (node, 'disabled') return false; dojo.addClass (node, 'disabled'); return true;} .. cela permet de cliquer une fois sur le lien et d'action (return true) et après cela il n'autorise pas l'action (retourne false).
Neek
Notez que dans le gestionnaire, vous devriez probablement utiliser $ (this) au lieu de $ ("thelink") car cela pourrait changer ou l'utilisateur pourrait ainsi facilement copier / coller le code.
Alexis Wilke
2
Vous suggérons également d'ajouter «curseur: par défaut» au style désactivé.
Stuart Hallows
40

J'ai trouvé une réponse que j'aime beaucoup mieux ici

Ressemble à ça:

$(document).ready(function(){
    $("a").click(function () { 
        $(this).fadeTo("fast", .5).removeAttr("href"); 
    });
});

L'activation impliquerait de définir l'attribut href

$(document).ready(function(){
    $("a").click(function () { 
        $(this).fadeIn("fast").attr("href", "http://whatever.com/wherever.html"); 
    });
});

Cela vous donne l'impression que l'élément d'ancrage devient du texte normal, et vice versa.

Michael Meadows
la source
12
$("a").click(function(){
                alert('disabled');
                return false;

}); 
AlexC
la source
12

Je pense qu'une meilleure solution consiste à définir l'attribut de données désactivé et à ancrer une vérification pour celui-ci au clic. De cette façon, nous pouvons désactiver temporairement une ancre jusqu'à ce que, par exemple, le javascript soit terminé avec un appel ajax ou certains calculs. Si nous ne le désactivons pas, nous pouvons rapidement cliquer dessus quelques fois, ce qui n'est pas souhaitable ...

$('a').live('click', function () {
    var anchor = $(this);

    if (anchor.data("disabled")) {
        return false;
    }

    anchor.data("disabled", "disabled");

    $.ajax({
        url: url,
        data: data,
        cache: false,
        success: function (json) {
            // when it's done, we enable the anchor again
            anchor.removeData("disabled");
        },
        error: function () {
             // there was an error, enable the anchor
            anchor.removeData("disabled");
        }
    });

    return false;
});

J'ai fait un exemple jsfiddle: http://jsfiddle.net/wgZ59/76/

Michal B.
la source
11

La réponse sélectionnée n'est pas bonne.

Utilisez le style CSS pointeur-événements . (Comme Rashad Annara l'a suggéré)

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'ancre 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
De plus, avec les événements de pointeur, vous n'aurez pas besoin d'inclure l'état: hover car il s'agit d'un événement de pointeur. Il vous suffit d'inclure le sélecteur a [désactivé].
Larry Dukek
10

Essayez les lignes ci-dessous

$("#yourbuttonid").attr("disabled", "disabled");
$("#yourbuttonid").removeAttr("href");

Coz, même si vous désactivez la <a>balise hreffonctionnera donc vous devez hrefégalement supprimer .

Lorsque vous voulez activer, essayez ci-dessous les lignes

$("#yourbuttonid").removeAttr("disabled");
$("#yourbuttonid").attr("href", "#nav-panel");
Victor AJ
la source
1
C'est exactement ce dont j'avais besoin lors de l'utilisation de JQuery avec ASP.net MVC ActionLink. Merci!
eaglei22
8

C'est aussi simple que de retourner false;

ex.

jQuery("li a:eq(0)").click(function(){
   return false;
})

ou

jQuery("#menu a").click(function(){
   return false;
})
Kim Edgard
la source
8
$('#divID').addClass('disabledAnchor');

Dans un fichier css

.disabledAnchor a{
       pointer-events: none !important;
       cursor: default;
       color:white;
}
Rashad Valliyengal
la source
5
$("a").click(function(event) {
  event.preventDefault();
});

Si cette méthode est appelée, l'action par défaut de l'événement ne sera pas déclenchée.

Mohssen Beiranvand
la source
4

Vous n'avez jamais vraiment spécifié comment vous vouliez les désactiver, ou ce qui provoquerait la désactivation.

Tout d'abord, vous voulez savoir comment définir la valeur sur désactivé, pour cela, vous utiliseriez les fonctions d'attribut de JQuery , et que cette fonction se produise sur un événement , comme un clic , ou le chargement du document.

Sournoiserie
la source
1

Pour les situations où vous devez placer du texte ou du contenu html dans une balise d'ancrage, mais vous ne voulez tout simplement pas qu'une action soit entreprise lorsque vous cliquez sur cet élément (comme lorsque vous voulez qu'un lien de pagination soit à l'état désactivé car il est la page courante), découpez simplement le href. ;)

<a>3 (current page, I'm totally disabled!)</a>

La réponse de @ michael-meadows m'a averti, mais il traitait toujours de scénarios dans lesquels vous devez / travaillez toujours avec jQuery / JS. Dans ce cas, si vous avez le contrôle sur l'écriture du html lui-même, il vous suffit de xer la balise href, la solution est donc purement HTML!

D'autres solutions sans jQuery finagling qui conservent le href vous obligent à mettre un # dans le href, mais cela fait rebondir la page vers le haut, et vous voulez juste qu'elle soit complètement désactivée. Ou le laisser vide, mais selon le navigateur, cela fait toujours des choses comme sauter vers le haut, et c'est du HTML invalide selon les IDE. Mais apparemment, une abalise est du HTML totalement valide sans HREF.

Enfin, vous pourriez dire: D'accord, pourquoi ne pas simplement vider complètement le tag a? Parce que souvent vous ne pouvez pas, la abalise est utilisée à des fins de style dans le framework CSS ou le contrôle que vous utilisez, comme le paginateur de Bootstrap:

http://twitter.github.io/bootstrap/components.html#pagination

Nicholas Petersen
la source
1

Donc, avec une combinaison des réponses ci-dessus, je suis venu avec ceci.

a.disabled { color: #555555; cursor: default; text-decoration: none; }

$(".yourClass").addClass("disabled").click(function(e){ e.preventDefault(); 
LawMan
la source
0

Si vous n'en avez pas besoin pour se comporter comme une balise d'ancrage, je préférerais le remplacer du tout. Par exemple, si votre balise d'ancrage est comme

<a class="MyLink" href="http://www.google.com"><span>My</span> <strong>Link</strong></a>

puis en utilisant jquery, vous pouvez le faire lorsque vous avez besoin d'afficher du texte au lieu d'un lien.

var content = $(".MyLink").text(); // or .html()
$(".MyLink").replaceWith("<div>" + content + "</div>")

Ainsi, nous pouvons simplement remplacer la balise d'ancrage par une balise div. C'est beaucoup plus facile (juste 2 lignes) et sémantiquement correct aussi (parce que nous n'avons pas besoin d'un lien maintenant donc ne devrait pas avoir de lien)

adeel41
la source
0

Désactivez ou activez tout élément avec la propriété disabled.

// Disable 
$("#myAnchor").prop( "disabled", true );

// Enable
$( "#myAnchor" ).prop( "disabled", false );
RitchieD
la source
Pourquoi cette réponse est-elle rejetée? Il répond à la question "Comment activer ou désactiver une ancre en utilisant jQuery?"
RitchieD
Je pense que c'est parce que les liens sont toujours ouverts lorsque vous cliquez sur l'ancre.
Zombaya