Non è possibile disabilitare un collegamento (in modo portatile). È possibile utilizzare una di queste tecniche (ognuna con i propri vantaggi e svantaggi).
Modo CSS
Questo dovrebbe essere il modo giusto (ma vedi più avanti) di farlo quando la maggior parte dei browser lo supporterà:
a.disabled {
pointer-events: none;
}
È ciò che fa Bootstrap 3.x, ad esempio. Attualmente (2016) è ben supportato solo da Chrome, FireFox e Opera (19+). Internet Explorer ha iniziato a supportarlo dalla versione 11 ma non per i collegamenti, tuttavia è disponibile in un elemento esterno come:
span.disable-links {
pointer-events: none;
}
Con:
<span class="disable-links"><a href="#">...</a></span>
Soluzione
Probabilmente abbiamo bisogno di definire una classe CSS per, pointer-events: none
ma cosa succede se riutilizziamo l' disabled
attributo anziché una classe CSS? A rigor di termini disabled
non è supportato, <a>
ma i browser non si lamentano di attributi sconosciuti . L'uso disabled
dell'attributo IE ignorerà pointer-events
ma onorerà l' disabled
attributo specifico di IE ; altri browser conformi a CSS ignoreranno l' attributo e l'onore sconosciuti . Più facile da scrivere che da spiegare:disabled
pointer-events
a[disabled] {
pointer-events: none;
}
Un'altra opzione per IE 11 è quella di impostare display
degli elementi di collegamento a block
o inline-block
:
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
Tieni presente che questa potrebbe essere una soluzione portatile se devi supportare IE (e puoi cambiare il tuo HTML) ma ...
Detto questo, tieni presente che pointer-events
disabilita solo ... eventi puntatore. I collegamenti saranno comunque navigabili tramite tastiera, quindi è necessario applicare anche una delle altre tecniche descritte qui.
Messa a fuoco
In combinazione con la tecnica CSS sopra descritta, è possibile utilizzare tabindex
in modo non standard per impedire la messa a fuoco di un elemento:
<a href="#" disabled tabindex="-1">...</a>
Non ho mai verificato la sua compatibilità con molti browser, quindi potresti voler testarlo da solo prima di utilizzare questo. Ha il vantaggio di lavorare senza JavaScript. Purtroppo (ma ovviamente) tabindex
non può essere modificato dal CSS.
Intercetta i clic
Utilizzare href
a una funzione JavaScript, verificare la condizione (o l'attributo disabilitato stesso) e non fare nulla nel caso.
$("td > a").on("click", function(event){
if ($(this).is("[disabled]")) {
event.preventDefault();
}
});
Per disabilitare i collegamenti, procedere come segue:
$("td > a").attr("disabled", "disabled");
Per riattivarli:
$("td > a").removeAttr("disabled");
Se vuoi invece di .is("[disabled]")
te puoi usare .attr("disabled") != undefined
(jQuery 1.6+ tornerà sempre undefined
quando l'attributo non è impostato) ma is()
è molto più chiaro (grazie a Dave Stewart per questo suggerimento). Nota che qui sto usando l' disabled
attributo in modo non standard, se ti interessa, sostituisci l'attributo con una classe e sostituiscilo .is("[disabled]")
con .hasClass("disabled")
(aggiungendo e rimuovendo con addClass()
e removeClass()
).
Zoltán Tamási ha osservato in un commento che "in alcuni casi l'evento click è già associato a qualche funzione" reale "(ad esempio utilizzando knockoutjs) In tal caso l'ordinamento del gestore eventi può causare alcuni problemi. Quindi ho implementato collegamenti disabilitati vincolando un ritorno falso gestore per il collegamento touchstart
, mousedown
e keydown
gli eventi. ha alcuni svantaggi (impedirà tocco scrolling iniziato sul link)" , ma la gestione di eventi di tastiera ha anche il vantaggio di evitare la navigazione da tastiera.
Nota che se href
non viene cancellato è possibile che l'utente visiti manualmente quella pagina.
Cancella il collegamento
Cancella l' href
attributo. Con questo codice non si aggiunge un gestore eventi ma si modifica il collegamento stesso. Utilizzare questo codice per disabilitare i collegamenti:
$("td > a").each(function() {
this.data("href", this.attr("href"))
.attr("href", "javascript:void(0)")
.attr("disabled", "disabled");
});
E questo per riabilitarli:
$("td > a").each(function() {
this.attr("href", this.data("href")).removeAttr("disabled");
});
Personalmente questa soluzione non mi piace molto (se non devi fare di più con i link disabilitati) ma potrebbe essere più compatibile a causa di vari modi per seguire un link.
Gestore di clic falso
Aggiungi / rimuovi una onclick
funzione in cui il return false
collegamento non verrà seguito. Per disabilitare i collegamenti:
$("td > a").attr("disabled", "disabled").on("click", function() {
return false;
});
Per riattivarli:
$("td > a").removeAttr("disabled").off("click");
Non credo che ci sia un motivo per preferire questa soluzione anziché la prima.
Messa in piega
Lo styling è ancora più semplice, qualunque sia la soluzione che stai utilizzando per disabilitare il collegamento che abbiamo aggiunto un disabled
attributo in modo da poter utilizzare la seguente regola CSS:
a[disabled] {
color: gray;
}
Se stai usando una classe anziché l'attributo:
a.disabled {
color: gray;
}
Se si utilizza un framework dell'interfaccia utente, è possibile notare che i collegamenti disabilitati non sono stati disegnati correttamente. Bootstrap 3.x, ad esempio, gestisce questo scenario e il pulsante ha uno stile corretto sia con disabled
attributo che con .disabled
classe. Se, invece, stai cancellando il collegamento (o usando una delle altre tecniche JavaScript) devi anche gestire lo stile perché un <a>
senza href
è ancora dipinto come abilitato.
Applicazioni accessibili per Internet (ARIA)
Non dimenticare di includere anche un attributo aria-disabled="true"
insieme a disabled
attributo / classe.