Vous ne pouvez pas désactiver un lien (de manière portable). Vous pouvez utiliser l'une de ces techniques (chacune ayant ses propres avantages et inconvénients).
Méthode CSS
Cela devrait être la bonne façon (mais voir plus loin) pour le faire quand la plupart des navigateurs le supporteront :
a.disabled {
pointer-events: none;
}
C'est ce que fait, par exemple, Bootstrap 3.x. Actuellement (2016), il n'est bien supporté que par Chrome, FireFox et Opera (19+). Internet Explorer a commencé à le prendre en charge à partir de la version 11 mais pas pour les liens cependant, il est disponible dans un élément extérieur comme :
span.disable-links {
pointer-events: none;
}
Avec :
<span class="disable-links"><a href="#">...</a></span>
Solution de rechange
Nous devons probablement définir une classe CSS pour pointer-events: none
mais si nous réutiliser le site disabled
au lieu d'une classe CSS ? À proprement parler disabled
n'est pas pris en charge pour <a>
mais les navigateurs ne se plaindront pas pour inconnu attributs. En utilisant le disabled
IE ignorera l'attribut pointer-events
mais il honorera l'IE spécifique disabled
Les autres navigateurs conformes à la norme CSS ne tiendront pas compte de cet attribut. inconnu disabled
attribut et honneur pointer-events
. Plus facile à écrire qu'à expliquer :
a[disabled] {
pointer-events: none;
}
Une autre option pour IE 11 est de définir display
d'éléments de liaison à block
ou inline-block
:
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
Notez que cela peut être un portable solution si vous devez supporter IE (et vous pouvez changer votre HTML) mais...
Tout ceci étant dit, veuillez noter que pointer-events
ne désactive que les événements liés aux pointeurs. Les liens seront toujours navigables au moyen du clavier alors vous devez également appliquer l'une des autres techniques décrites ici.
Focus
En conjonction avec la technique CSS décrite ci-dessus, vous pouvez utiliser tabindex
d'une manière non standard pour empêcher la mise au point d'un élément :
<a href="#" disabled tabindex="-1">...</a>
Je n'ai jamais vérifié sa compatibilité avec de nombreux navigateurs. Vous pouvez donc la tester vous-même avant de l'utiliser. Il a l'avantage de fonctionner sans JavaScript. Malheureusement (mais évidemment) tabindex
ne peut être modifié à partir de CSS.
Clics d'interception
Utilisez un href
à une fonction JavaScript, vérifier la condition (ou l'attribut désactivé lui-même) et ne rien faire dans ce cas.
$("td > a").on("click", function(event){
if ($(this).is("[disabled]")) {
event.preventDefault();
}
});
Pour désactiver les liens, procédez comme suit :
$("td > a").attr("disabled", "disabled");
Pour les réactiver :
$("td > a").removeAttr("disabled");
Si vous voulez, au lieu de .is("[disabled]")
vous pouvez utiliser .attr("disabled") != undefined
(jQuery 1.6+ retournera toujours undefined
lorsque l'attribut n'est pas défini) mais is()
est beaucoup plus claire (merci à Dave Stewart pour cette astuce). Veuillez noter qu'ici j'utilise l'option disabled
d'une manière non standard, si vous y tenez, remplacez l'attribut par une classe et l'attribut .is("[disabled]")
avec .hasClass("disabled")
(ajout et suppression avec addClass()
et removeClass()
).
Zoltán Tamási a noté dans un commentaire que "dans certains cas, l'événement de clic est déjà lié à une fonction "réelle" (par exemple en utilisant knockoutjs). Dans ce cas, l'ordre des gestionnaires d'événements peut causer des problèmes. C'est pourquoi j'ai implémenté des liens désactivés en liant un gestionnaire de retour faux à la fonction touchstart
, mousedown
et keydown
événements. Il a quelques inconvénients (il empêchera le défilement tactile commencé sur le lien)" mais le traitement des événements clavier a également l'avantage d'empêcher la navigation au clavier.
Notez que si href
n'est pas autorisé, il est possible pour l'utilisateur de visiter manuellement cette page.
Effacer le lien
Effacer le href
attribut. Avec ce code, vous n'ajoutez pas un gestionnaire d'événement mais vous modifiez le lien lui-même. Utilisez ce code pour désactiver les liens :
$("td > a").each(function() {
this.data("href", this.attr("href"))
.attr("href", "javascript:void(0)")
.attr("disabled", "disabled");
});
Et celui-ci pour les réactiver :
$("td > a").each(function() {
this.attr("href", this.data("href")).removeAttr("disabled");
});
Personnellement, je n'aime pas beaucoup cette solution (si vous ne devez pas en faire plus avec les liens désactivés) mais elle mai être plus compatible en raison des différentes manières de suivre un lien.
Faux gestionnaire de clics
Ajouter/supprimer un onclick
fonction où vous return false
Le lien ne sera pas suivi. Pour désactiver les liens :
$("td > a").attr("disabled", "disabled").on("click", function() {
return false;
});
Pour les réactiver :
$("td > a").removeAttr("disabled").off("click");
Je ne pense pas qu'il y ait une raison de préférer cette solution à la première.
Styling
Le style est encore plus simple, quelle que soit la solution que vous utilisez pour désactiver le lien, nous avons ajouté une balise disabled
afin que vous puissiez utiliser la règle CSS suivante :
a[disabled] {
color: gray;
}
Si vous utilisez une classe au lieu d'un attribut :
a.disabled {
color: gray;
}
Si vous utilisez un cadre UI, vous pouvez voir que désactivé les liens ne sont pas stylisés correctement. Bootstrap 3.x, par exemple, gère ce scénario et le bouton est correctement stylé à la fois avec disabled
et avec l'attribut .disabled
classe. Si, au contraire, vous effacez le lien (ou si vous utilisez l'une des autres techniques JavaScript), vous devez également gérer le style car une classe <a>
sans href
est toujours peint comme activé.
Applications Internet riches accessibles (ARIA)
N'oubliez pas d'inclure également un attribut aria-disabled="true"
en même temps que disabled
attribut/classe.
0 votes
CSS seule question : stackoverflow.com/questions/2091168/disable-a-link-using-css