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: nonemas e se reutilizarmos o disabledatributo em vez de uma classe CSS? A rigor, disablednão há suporte para, <a>mas os navegadores não reclamam por atributos desconhecidos . O uso do disabledatributo IE ignorará, pointer-eventsmas honrará o disabledatributo específico do IE ; outros navegadores compatíveis com CSS ignoram atributo e honra desconhecidos . Mais fácil escrever do que explicar:disabledpointer-events
a[disabled] {
pointer-events: none;
}
Outra opção para o IE 11 é definir displayelementos de link para blockou 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-eventsdesativa 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 tabindexmaneira 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) tabindexnão pode ser alterado do CSS.
Interceptar cliques
Use a hrefpara 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") != undefinedjQuery 1.6+ sempre retornará undefinedquando o atributo não estiver definido, mas is()é muito mais claro (obrigado a Dave Stewart por esta dica). Observe aqui que estou usando o disabledatributo 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, mousedowne keydowneventos. 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 hrefnão estiver limpo, é possível que o usuário visite manualmente essa página.
Limpe o link
Limpe o hrefatributo. 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 onclickfunçã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 disabledatributo 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 disabledatributo e com .disabledclasse. 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 hrefainda 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 disabledatributo / classe.