Vous ne pouvez pas désactiver un lien (de manière portable). Vous pouvez utiliser l'une de ces techniques (chacune avec ses propres avantages et inconvénients).
Manière CSS
Cela devrait être la bonne façon (mais voir plus loin) de le faire lorsque la plupart des navigateurs le prendront en charge:
a.disabled {
pointer-events: none;
}
C'est ce que fait, par exemple, Bootstrap 3.x. Actuellement (2016), il est bien pris en charge uniquement par Chrome, FireFox et Opera (19+). Internet Explorer a commencé à prendre en charge cela à partir de la version 11, mais pas pour les liens, mais il est disponible dans un élément externe comme:
span.disable-links {
pointer-events: none;
}
Avec:
<span class="disable-links"><a href="#">...</a></span>
solution de contournement
Nous devons probablement définir une classe CSS, pointer-events: none
mais que faire si nous réutilisons l' disabled
attribut au lieu d'une classe CSS? À proprement parler, ce disabled
n'est pas pris en charge, <a>
mais les navigateurs ne se plaindront pas d' attributs inconnus . L'utilisation de l' disabled
attribut IE ignorera pointer-events
mais il honorera l' disabled
attribut spécifique IE ; les autres navigateurs compatibles CSS ignoreront les attributs et l'honneur inconnus . Plus facile à écrire qu'à expliquer:disabled
pointer-events
a[disabled] {
pointer-events: none;
}
Une autre option pour IE 11 consiste à définir display
des éléments de lien vers block
ou inline-block
:
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
Notez que cela peut être une solution portable si vous devez prendre en charge IE (et vous pouvez changer votre HTML) mais ...
Tout cela dit, veuillez noter que pointer-events
ne désactive que ... les événements de pointeur. Les liens seront toujours navigables via le clavier, vous devez également appliquer l'une des autres techniques décrites ici.
Concentrer
En conjonction avec la technique CSS décrite ci-dessus, vous pouvez utiliser tabindex
de manière non standard pour empêcher la focalisation d'un élément:
<a href="#" disabled tabindex="-1">...</a>
Je n'ai jamais vérifié sa compatibilité avec de nombreux navigateurs, alors vous voudrez peut-être le tester par vous-même avant de l'utiliser. Il a l'avantage de fonctionner sans JavaScript. Malheureusement (mais évidemment) tabindex
ne peut pas être changé depuis CSS.
Intercepter les clics
Utilisez a href
pour une fonction JavaScript, vérifiez la condition (ou l'attribut désactivé lui-même) et ne faites rien au cas où.
$("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 le souhaitez, .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 clair (merci à Dave Stewart pour cette astuce). Veuillez noter ici que j'utilise l' disabled
attribut d'une manière non standard, si vous vous souciez de cela, remplacez l'attribut par une classe et remplacez .is("[disabled]")
par .hasClass("disabled")
(en ajoutant et en supprimant avec addClass()
et removeClass()
).
Zoltán Tamási a noté dans un commentaire que "dans certains cas, l'événement click est déjà lié à une fonction" réelle "(par exemple en utilisant knockoutjs) Dans ce cas, la commande du gestionnaire d'événements peut causer des problèmes. faux gestionnaire à l'lien touchstart
, mousedown
et les keydown
événements. il a quelques inconvénients (elle permet d' éviter le défilement tactile a commencé sur le lien) » , mais la gestion des événements de clavier a également l'avantage d'éviter la navigation du clavier.
Notez que s'il href
n'est pas effacé, il est possible que l'utilisateur visite manuellement cette page.
Supprimer le lien
Effacez l' href
attribut. Avec ce code, vous n'ajoutez pas de gestionnaire d'événements 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 n'avez pas à en faire plus avec les liens désactivés) mais elle peut être plus compatible en raison des différentes manières de suivre un lien.
Gestionnaire de faux clics
Ajoutez / supprimez une 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.
Coiffant
Le style est encore plus simple, quelle que soit la solution que vous utilisez pour désactiver le lien, nous avons ajouté un disabled
attribut 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 d'interface utilisateur, vous pouvez constater que les liens désactivés ne sont pas correctement stylisés. Bootstrap 3.x, par exemple, gère ce scénario et le bouton est correctement stylisé à la fois avec disabled
attribut et avec .disabled
classe. Si, au lieu de cela, vous effacez le lien (ou utilisez l'une des autres techniques JavaScript), vous devez également gérer le style car un <a>
sans href
est toujours peint comme activé.
Applications Internet riches accessibles (ARIA)
N'oubliez pas d'inclure également un attribut aria-disabled="true"
avec l' disabled
attribut / classe.