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: none
aber was ist, wenn wir das Attribut anstelle einer CSS-Klasse wiederverwendendisabled
? Genau genommen disabled
wird dies nicht unterstützt, <a>
aber Browser beschweren sich nicht über unbekannte Attribute. Wenn Sie das disabled
Attribut IE verwenden, wird es ignoriert pointer-events
, es wird jedoch das IE-spezifische disabled
Attribut 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, display
Verknüpfungselemente zu block
oder 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-events
nur ... 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 tabindex
eine 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) tabindex
kann nicht von CSS geändert werden.
Klicks abfangen
Verwenden Sie eine href
JavaScript-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, undefined
wenn das Attribut nicht festgelegt ist), is()
ist aber viel klarer (danke an Dave Stewart für diesen Tipp). Bitte beachten Sie, dass ich das disabled
Attribut 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
, mousedown
und keydown
Veranstaltungen. 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 href
der Benutzer diese Seite manuell besuchen kann, wenn sie nicht gelöscht wird.
Löschen Sie den Link
Löschen Sie das href
Attribut. 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 onclick
Funktion 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 disabled
Attribut 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 disabled
Attribut als auch mit .disabled
Klasse 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 href
weiterhin als aktiviert gezeichnet wird.
Zugängliche Rich Internet-Anwendungen (ARIA)
Vergessen Sie nicht, auch ein Attribut aria-disabled="true"
zusammen mit disabled
Attribut / Klasse anzugeben.