Nie możesz wyłączyć linku (w przenośny sposób). Możesz użyć jednej z tych technik (każda ma swoje zalety i wady).
Sposób CSS
Powinien to być właściwy sposób (ale zobacz później), aby to zrobić, gdy większość przeglądarek będzie go obsługiwać:
a.disabled {
pointer-events: none;
}
Tak działa na przykład Bootstrap 3.x. Obecnie (2016) jest dobrze obsługiwany tylko przez Chrome, FireFox i Opera (19+). Internet Explorer zaczął obsługiwać to od wersji 11, ale nie dla linków, jednak jest dostępny w elemencie zewnętrznym, takim jak:
span.disable-links {
pointer-events: none;
}
Z:
<span class="disable-links"><a href="#">...</a></span>
Obejście
My, prawdopodobnie, trzeba zdefiniować klasę CSS pointer-events: none
ale co jeśli mamy ponowne ten disabled
atrybut zamiast klasy CSS? Ściśle mówiąc, disabled
nie jest obsługiwane, <a>
ale przeglądarki nie będą narzekać na nieznane atrybuty. Użycie disabled
atrybutu IE zignoruje, pointer-events
ale będzie honorować określony disabled
atrybut IE ; inne przeglądarki zgodne z CSS zignorują nieznany disabled
atrybut i honor pointer-events
. Łatwiej pisać niż wyjaśniać:
a[disabled] {
pointer-events: none;
}
Inną opcją dla IE 11 jest zestaw display
elementów łącza do block
lub inline-block
:
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
Pamiętaj, że może to być przenośne rozwiązanie, jeśli potrzebujesz obsługi IE (i możesz zmienić swój HTML), ale ...
Wszystko to powiedział, proszę pamiętać, że pointer-events
wyłącza tylko ... zdarzenia wskaźnika. Łącza będą nadal można nawigować za pomocą klawiatury, wówczas musisz również zastosować jedną z innych opisanych tutaj technik.
Skupiać
W połączeniu z opisaną powyżej techniką CSS możesz użyć tabindex
w niestandardowy sposób, aby zapobiec koncentracji elementu:
<a href="#" disabled tabindex="-1">...</a>
Nigdy nie sprawdzałem jego kompatybilności z wieloma przeglądarkami, więc możesz przetestować go sam przed użyciem. Ma tę zaletę, że działa bez JavaScript. Niestety (ale oczywiście) tabindex
nie można go zmienić z CSS.
Przechwytuj kliknięcia
Użyj href
funkcji JavaScript, sprawdź warunek (lub sam wyłączony atrybut) i nic nie rób.
$("td > a").on("click", function(event){
if ($(this).is("[disabled]")) {
event.preventDefault();
}
});
Aby wyłączyć łącza, wykonaj następujące czynności:
$("td > a").attr("disabled", "disabled");
Aby je ponownie włączyć:
$("td > a").removeAttr("disabled");
Jeśli chcesz zamiast tego .is("[disabled]")
możesz użyć .attr("disabled") != undefined
(jQuery 1.6+ zawsze zwróci, undefined
gdy atrybut nie jest ustawiony), ale is()
jest znacznie bardziej przejrzysty (dzięki Dave'owi Stewartowi za tę wskazówkę). Należy pamiętać, tutaj używam disabled
atrybut w niestandardowy sposób, jeśli dbasz o to następnie zastąpić atrybut z klasą i wymienić .is("[disabled]")
z .hasClass("disabled")
(dodawanie i usuwanie z addClass()
a removeClass()
).
Zoltán Tamási zauważył w komentarzu, że „w niektórych przypadkach zdarzenie kliknięcia jest już powiązane z jakąś„ rzeczywistą ”funkcją (na przykład za pomocą knockoutjs). W takim przypadku zamawianie procedury obsługi zdarzeń może powodować pewne problemy. Dlatego zaimplementowałem wyłączone linki, wiążąc zwrot false obsługi do tego linku touchstart
, mousedown
i keydown
wydarzeń. to ma pewne wady (uniemożliwi to dotykowy przewijania rozpoczęto link)” ale obsługi zdarzeń klawiaturowych ma również korzyści, aby zapobiec nawigację za pomocą klawiatury.
Pamiętaj, że jeśli href
nie zostanie wyczyszczone, użytkownik może ręcznie odwiedzić tę stronę.
Wyczyść link
Wyczyść href
atrybut. Za pomocą tego kodu nie dodajesz modułu obsługi zdarzeń, ale zmieniasz sam link. Użyj tego kodu, aby wyłączyć linki:
$("td > a").each(function() {
this.data("href", this.attr("href"))
.attr("href", "javascript:void(0)")
.attr("disabled", "disabled");
});
A ten, aby je ponownie włączyć:
$("td > a").each(function() {
this.attr("href", this.data("href")).removeAttr("disabled");
});
Osobiście nie podoba mi się to rozwiązanie (jeśli nie musisz robić więcej z wyłączonymi linkami), ale może być bardziej kompatybilne z powodu różnych sposobów podążania za linkiem.
Fałszywy moduł obsługi kliknięć
Dodaj / usuń onclick
funkcję, w której return false
link nie będzie śledzony. Aby wyłączyć linki:
$("td > a").attr("disabled", "disabled").on("click", function() {
return false;
});
Aby je ponownie włączyć:
$("td > a").removeAttr("disabled").off("click");
Nie sądzę, aby istniał powód, aby preferować to rozwiązanie zamiast pierwszego.
Stylizacja
Stylizacja jest jeszcze prostsza, bez względu na to, jakiego rozwiązania użyjesz do wyłączenia łącza, dodaliśmy disabled
atrybut, dzięki czemu możesz użyć następującej reguły CSS:
a[disabled] {
color: gray;
}
Jeśli używasz klasy zamiast atrybutu:
a.disabled {
color: gray;
}
Jeśli używasz frameworku interfejsu użytkownika, możesz zauważyć, że wyłączone linki nie są poprawnie stylizowane. Na przykład Bootstrap 3.x obsługuje ten scenariusz, a przycisk ma poprawną stylizację zarówno z disabled
atrybutem, jak iz .disabled
klasą. Jeśli zamiast tego usuwasz link (lub używasz jednej z innych technik JavaScript), musisz również obsługiwać stylizację, ponieważ <a>
bez href
jest nadal malowane jako włączone.
Dostępne bogate aplikacje internetowe (ARIA)
Nie zapomnij również dołączyć atrybutu aria-disabled="true"
wraz z disabled
atrybutem / klasą.