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: noneale co jeśli mamy ponowne ten disabledatrybut zamiast klasy CSS? Ściśle mówiąc, disablednie jest obsługiwane, <a>ale przeglądarki nie będą narzekać na nieznane atrybuty. Użycie disabledatrybutu IE zignoruje, pointer-eventsale będzie honorować określony disabledatrybut 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 displayelementów łącza do blocklub 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-eventswyłą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ć tabindexw 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) tabindexnie można go zmienić z CSS.
Przechwytuj kliknięcia
Użyj hreffunkcji 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, undefinedgdy 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 disabledatrybut 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, mousedowni keydownwydarzeń. 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 hrefnie zostanie wyczyszczone, użytkownik może ręcznie odwiedzić tę stronę.
Wyczyść link
Wyczyść hrefatrybut. 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ń onclickfunkcję, w której return falselink 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 disabledatrybut, 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 disabledatrybutem, jak iz .disabledklasą. Jeśli zamiast tego usuwasz link (lub używasz jednej z innych technik JavaScript), musisz również obsługiwać stylizację, ponieważ <a>bez hrefjest nadal malowane jako włączone.
Dostępne bogate aplikacje internetowe (ARIA)
Nie zapomnij również dołączyć atrybutu aria-disabled="true"wraz z disabledatrybutem / klasą.