Sie können einen Link nicht deaktivieren (auf tragbare Weise). Sie können eine dieser Techniken verwenden (jede mit ihren eigenen Vor- und Nachteilen).
CSS Weg
Dies sollte der richtige Weg sein (siehe aber später), wenn die meisten Browser dies unterstützen:
a.disabled {
pointer-events: none;
}
Dies ist beispielsweise das, was Bootstrap 3.x tut. Derzeit (2016) wird es nur von Chrome, FireFox und Opera (19+) gut unterstützt. Internet Explorer unterstützt dies ab Version 11, jedoch nicht für Links. Es ist jedoch in einem äußeren Element wie dem folgenden verfügbar:
span.disable-links {
pointer-events: none;
}
Mit:
<span class="disable-links"><a href="#">...</a></span>
Problemumgehung
Wir müssen wahrscheinlich eine CSS-Klasse definieren, pointer-events: noneaber was ist, wenn wir das Attribut anstelle einer CSS-Klasse wiederverwendendisabled ? Genau genommen disabledwird dies nicht unterstützt, <a>aber Browser beschweren sich nicht über unbekannte Attribute. Wenn Sie das disabledAttribut IE verwenden, wird es ignoriert pointer-events, es wird jedoch das IE-spezifische disabledAttribut berücksichtigt. Andere CSS-kompatible Browser ignorieren unbekannte disabled Attribute und Ehren pointer-events. Einfacher zu schreiben als zu erklären:
a[disabled] {
pointer-events: none;
}
Eine weitere Option für IE 11 besteht darin, displayVerknüpfungselemente zu blockoder festzulegen inline-block:
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
Beachten Sie, dass dies eine tragbare Lösung sein kann, wenn Sie IE unterstützen müssen (und Ihren HTML-Code ändern können), aber ...
Bitte beachten Sie, dass pointer-eventsnur ... Zeigerereignisse deaktiviert werden. Links können weiterhin über die Tastatur navigiert werden. Dann müssen Sie auch eine der anderen hier beschriebenen Techniken anwenden.
Fokus
In Verbindung mit der oben beschriebenen CSS-Technik können Sie tabindexeine nicht standardmäßige Methode verwenden, um zu verhindern, dass ein Element fokussiert wird:
<a href="#" disabled tabindex="-1">...</a>
Ich habe die Kompatibilität mit vielen Browsern nie überprüft. Vielleicht möchten Sie sie selbst testen, bevor Sie sie verwenden. Es hat den Vorteil, ohne JavaScript zu arbeiten. Leider (aber offensichtlich) tabindexkann nicht von CSS geändert werden.
Klicks abfangen
Verwenden Sie eine hrefJavaScript-Funktion, überprüfen Sie die Bedingung (oder das deaktivierte Attribut selbst) und tun Sie für den Fall nichts.
$("td > a").on("click", function(event){
if ($(this).is("[disabled]")) {
event.preventDefault();
}
});
So deaktivieren Sie Links:
$("td > a").attr("disabled", "disabled");
So aktivieren Sie sie erneut:
$("td > a").removeAttr("disabled");
Wenn Sie möchten .is("[disabled]"), können Sie stattdessen verwenden .attr("disabled") != undefined(jQuery 1.6+ wird immer zurückgegeben, undefinedwenn das Attribut nicht festgelegt ist), is()ist aber viel klarer (danke an Dave Stewart für diesen Tipp). Bitte beachten Sie, dass ich das disabledAttribut nicht standardmäßig verwende. Wenn Sie sich dafür interessieren, ersetzen Sie das Attribut durch eine Klasse und ersetzen Sie es .is("[disabled]")durch .hasClass("disabled")(Hinzufügen und Entfernen mit addClass()und removeClass()).
Zoltán Tamási bemerkte in einem Kommentar, dass "in einigen Fällen das Klickereignis bereits an eine" echte "Funktion gebunden ist (z. B. mithilfe von knockoutjs). In diesem Fall kann die Reihenfolge der Ereignishandler einige Probleme verursachen. Daher habe ich deaktivierte Links implementiert, indem ich eine Rückgabe gebunden habe falsche Handler zu den wichtigsten Link touchstart, mousedownund keydownVeranstaltungen. es hat einige Nachteile (es wird verhindert Touch auf den Link gestartet Scrollen)“ aber Tastaturereignisse Handhabung hat auch den Vorteil Navigation mit der Tastatur zu verhindern.
Beachten Sie, dass hrefder Benutzer diese Seite manuell besuchen kann, wenn sie nicht gelöscht wird.
Löschen Sie den Link
Löschen Sie das hrefAttribut. Mit diesem Code fügen Sie keinen Ereignishandler hinzu, sondern ändern den Link selbst. Verwenden Sie diesen Code, um Links zu deaktivieren:
$("td > a").each(function() {
this.data("href", this.attr("href"))
.attr("href", "javascript:void(0)")
.attr("disabled", "disabled");
});
Und dieser, um sie wieder zu aktivieren:
$("td > a").each(function() {
this.attr("href", this.data("href")).removeAttr("disabled");
});
Persönlich mag ich diese Lösung nicht sehr (wenn Sie nicht mehr mit deaktivierten Links tun müssen), aber sie kann aufgrund verschiedener Möglichkeiten, einem Link zu folgen, kompatibler sein.
Fake Click Handler
Hinzufügen / Entfernen einer onclickFunktion return false, bei der der Link nicht befolgt wird. So deaktivieren Sie Links:
$("td > a").attr("disabled", "disabled").on("click", function() {
return false;
});
So aktivieren Sie sie erneut:
$("td > a").removeAttr("disabled").off("click");
Ich glaube nicht, dass es einen Grund gibt, diese Lösung der ersten vorzuziehen.
Styling
Das Styling ist noch einfacher, unabhängig davon, welche Lösung Sie zum Deaktivieren des Links verwenden. Wir haben ein disabledAttribut hinzugefügt , damit Sie die folgende CSS-Regel verwenden können:
a[disabled] {
color: gray;
}
Wenn Sie eine Klasse anstelle eines Attributs verwenden:
a.disabled {
color: gray;
}
Wenn Sie ein UI-Framework verwenden, stellen Sie möglicherweise fest, dass deaktivierte Links nicht richtig gestaltet sind. Bootstrap 3.x behandelt beispielsweise dieses Szenario und die Schaltfläche ist sowohl mit disabledAttribut als auch mit .disabledKlasse korrekt gestaltet . Wenn Sie stattdessen den Link löschen (oder eine der anderen JavaScript-Techniken verwenden), müssen Sie auch das Styling übernehmen, da ein <a>ohne hrefweiterhin als aktiviert gezeichnet wird.
Zugängliche Rich Internet-Anwendungen (ARIA)
Vergessen Sie nicht, auch ein Attribut aria-disabled="true"zusammen mit disabledAttribut / Klasse anzugeben.