Você não pode desativar um link (de maneira portátil). Você pode usar uma dessas técnicas (cada uma com seus próprios benefícios e desvantagens).
Maneira CSS
Esse deve ser o caminho certo (mas veja mais adiante) quando a maioria dos navegadores oferecer suporte:
a.disabled {
pointer-events: none;
}
É o que, por exemplo, o Bootstrap 3.x faz. Atualmente (2016), é bem suportado apenas pelo Chrome, FireFox e Opera (19+). O Internet Explorer começou a oferecer suporte a partir da versão 11, mas não para links, mas está disponível em um elemento externo como:
span.disable-links {
pointer-events: none;
}
Com:
<span class="disable-links"><a href="#">...</a></span>
Gambiarra
Provavelmente, precisamos definir uma classe CSS para, pointer-events: none
mas e se reutilizarmos o disabled
atributo em vez de uma classe CSS? A rigor, disabled
não há suporte para, <a>
mas os navegadores não reclamam por atributos desconhecidos . O uso do disabled
atributo IE ignorará, pointer-events
mas honrará o disabled
atributo específico do IE ; outros navegadores compatíveis com CSS ignoram atributo e honra desconhecidos . Mais fácil escrever do que explicar:disabled
pointer-events
a[disabled] {
pointer-events: none;
}
Outra opção para o IE 11 é definir display
elementos de link para block
ou inline-block
:
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
Observe que essa pode ser uma solução portátil se você precisar dar suporte ao IE (e pode alterar seu HTML), mas ...
Tudo isso dito, observe que pointer-events
desativa apenas ... eventos de ponteiro. Os links ainda poderão ser navegados pelo teclado; também é necessário aplicar uma das outras técnicas descritas aqui.
Foco
Em conjunto com a técnica CSS descrita acima, você pode usar de tabindex
maneira não padrão para impedir que um elemento seja focado:
<a href="#" disabled tabindex="-1">...</a>
Nunca verifiquei sua compatibilidade com muitos navegadores; talvez você queira testá-lo antes de usar isso. Tem a vantagem de trabalhar sem JavaScript. Infelizmente (mas obviamente) tabindex
não pode ser alterado do CSS.
Interceptar cliques
Use a href
para uma função JavaScript, verifique a condição (ou o próprio atributo desativado) e não faça nada.
$("td > a").on("click", function(event){
if ($(this).is("[disabled]")) {
event.preventDefault();
}
});
Para desativar os links, faça o seguinte:
$("td > a").attr("disabled", "disabled");
Para reativá-los:
$("td > a").removeAttr("disabled");
Se você quiser, em vez de .is("[disabled]")
usar, o .attr("disabled") != undefined
jQuery 1.6+ sempre retornará undefined
quando o atributo não estiver definido, mas is()
é muito mais claro (obrigado a Dave Stewart por esta dica). Observe aqui que estou usando o disabled
atributo de uma maneira não padrão; se você se importa com isso, substitua o atributo por uma classe e substitua .is("[disabled]")
por .hasClass("disabled")
(adicionando e removendo com addClass()
e removeClass()
).
Zoltán Tamási observou em um comentário que "em alguns casos o evento click já está vinculado a alguma função" real "(por exemplo, usando knockoutjs). Nesse caso, a ordem do manipulador de eventos pode causar alguns problemas. Portanto, implementei links desabilitados vinculando um retorno falsa manipulador do link touchstart
, mousedown
e keydown
eventos. ele tem alguns inconvenientes (que irá impedir toque rolagem começou no link)" , mas lidar com eventos de teclado também tem a vantagem de evitar a navegação pelo teclado.
Observe que, se href
não estiver limpo, é possível que o usuário visite manualmente essa página.
Limpe o link
Limpe o href
atributo. Com esse código, você não adiciona um manipulador de eventos, mas altera o próprio link. Use este código para desativar os links:
$("td > a").each(function() {
this.data("href", this.attr("href"))
.attr("href", "javascript:void(0)")
.attr("disabled", "disabled");
});
E este para reativá-los:
$("td > a").each(function() {
this.attr("href", this.data("href")).removeAttr("disabled");
});
Pessoalmente, eu não gosto muito dessa solução (se você não precisar fazer mais com links desabilitados), mas ela pode ser mais compatível por causa de várias maneiras de seguir um link.
Manipulador de clique falso
Adicione / remova uma onclick
função em que você return false
, o link não será seguido. Para desativar os links:
$("td > a").attr("disabled", "disabled").on("click", function() {
return false;
});
Para reativá-los:
$("td > a").removeAttr("disabled").off("click");
Não acho que exista uma razão para preferir esta solução em vez da primeira.
Styling
O estilo é ainda mais simples, qualquer que seja a solução usada para desativar o link, adicionamos um disabled
atributo para que você possa usar a seguinte regra CSS:
a[disabled] {
color: gray;
}
Se você estiver usando uma classe em vez de atributo:
a.disabled {
color: gray;
}
Se você estiver usando uma estrutura de interface do usuário, poderá ver que os links desabilitados não estão estilizados corretamente. O Bootstrap 3.x, por exemplo, lida com esse cenário e o botão é estilizado corretamente com disabled
atributo e com .disabled
classe. Se, em vez disso, você estiver limpando o link (ou usando uma das outras técnicas de JavaScript), também deverá manipular o estilo, porque um <a>
sem href
ainda será pintado como ativado.
Aplicativos avançados para Internet acessíveis (ARIA)
Não se esqueça de incluir também um atributo aria-disabled="true"
junto com o disabled
atributo / classe.