No puede deshabilitar un enlace (de forma portátil). Puede usar una de estas técnicas (cada una con sus propios beneficios y desventajas).
Forma CSS
Esta debería ser la forma correcta (pero ver más adelante) de hacerlo cuando la mayoría de los navegadores lo admitirán:
a.disabled {
pointer-events: none;
}
Es lo que, por ejemplo, Bootstrap 3.x hace. Actualmente (2016) solo es compatible con Chrome, Firefox y Opera (19+). Internet Explorer comenzó a admitir esto desde la versión 11, pero no para enlaces, sin embargo, está disponible en un elemento externo como:
span.disable-links {
pointer-events: none;
}
Con:
<span class="disable-links"><a href="#">...</a></span>
Solución alterna
Probablemente, necesitemos definir una clase CSS para, pointer-events: none
pero ¿qué pasa si reutilizamos el disabled
atributo en lugar de una clase CSS? Estrictamente hablando disabled
no es compatible, <a>
pero los navegadores no se quejarán por atributos desconocidos . Usar el disabled
atributo IE ignorará pointer-events
pero honrará el disabled
atributo específico de IE ; otros navegadores compatibles con CSS ignorarán los atributos y el honor desconocidos . Más fácil de escribir que explicar:disabled
pointer-events
a[disabled] {
pointer-events: none;
}
Otra opción para IE 11 es establecer display
elementos de enlace para block
o inline-block
:
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
Tenga en cuenta que esta puede ser una solución portátil si necesita admitir IE (y puede cambiar su HTML) pero ...
Dicho todo esto, tenga en cuenta que pointer-events
solo desactiva ... eventos de puntero. Los enlaces seguirán siendo navegables a través del teclado, entonces también debe aplicar una de las otras técnicas descritas aquí.
Atención
En combinación con la técnica CSS descrita anteriormente, puede usarla tabindex
de una manera no estándar para evitar que un elemento se enfoque:
<a href="#" disabled tabindex="-1">...</a>
Nunca verifiqué su compatibilidad con muchos navegadores, entonces es posible que desee probarlo usted mismo antes de usar esto. Tiene la ventaja de trabajar sin JavaScript. Desafortunadamente (pero obviamente) tabindex
no se puede cambiar de CSS.
Interceptar clics
Use una función href
a a JavaScript, verifique la condición (o el atributo deshabilitado en sí) y no haga nada en el caso.
$("td > a").on("click", function(event){
if ($(this).is("[disabled]")) {
event.preventDefault();
}
});
Para deshabilitar los enlaces, haga esto:
$("td > a").attr("disabled", "disabled");
Para volver a habilitarlos:
$("td > a").removeAttr("disabled");
Si lo desea .is("[disabled]")
, puede usar .attr("disabled") != undefined
(jQuery 1.6+ siempre volverá undefined
cuando el atributo no esté configurado) pero is()
es mucho más claro (gracias a Dave Stewart por este consejo). Tenga en cuenta que estoy usando el disabled
atributo de una manera no estándar, si le importa esto, reemplace el atributo con una clase y reemplace .is("[disabled]")
con .hasClass("disabled")
(agregar y eliminar con addClass()
y removeClass()
).
Zoltán Tamási señaló en un comentario que "en algunos casos, el evento click ya está vinculado a alguna función" real "(por ejemplo, usando knockoutjs). En ese caso, la ordenación del controlador de eventos puede causar algunos problemas. Por lo tanto, implementé enlaces deshabilitados vinculando un retorno falsa controlador de enlace del touchstart
, mousedown
y keydown
eventos. tiene algunos inconvenientes (que evitará que toque scrolling comenzó en el enlace)" , pero el manejo de eventos de teclado también tiene la ventaja de evitar la navegación por teclado.
Tenga en cuenta que si href
no se borra, es posible que el usuario visite manualmente esa página.
Borrar el enlace
Borrar el href
atributo Con este código no agrega un controlador de eventos, sino que cambia el enlace en sí. Use este código para deshabilitar los enlaces:
$("td > a").each(function() {
this.data("href", this.attr("href"))
.attr("href", "javascript:void(0)")
.attr("disabled", "disabled");
});
Y este para volver a habilitarlos:
$("td > a").each(function() {
this.attr("href", this.data("href")).removeAttr("disabled");
});
Personalmente, no me gusta mucho esta solución (si no tiene que hacer más con los enlaces deshabilitados), pero puede ser más compatible debido a varias formas de seguir un enlace.
Controlador de clic falso
Agregue / elimine una onclick
función donde no se return false
seguirá el enlace. Para deshabilitar enlaces:
$("td > a").attr("disabled", "disabled").on("click", function() {
return false;
});
Para volver a habilitarlos:
$("td > a").removeAttr("disabled").off("click");
No creo que haya una razón para preferir esta solución en lugar de la primera.
Estilo
El estilo es aún más simple, independientemente de la solución que esté utilizando para deshabilitar el enlace, agregamos un disabled
atributo para que pueda usar la siguiente regla CSS:
a[disabled] {
color: gray;
}
Si está utilizando una clase en lugar de un atributo:
a.disabled {
color: gray;
}
Si está utilizando un marco de interfaz de usuario, puede ver que los enlaces deshabilitados no tienen el estilo adecuado. Bootstrap 3.x, por ejemplo, maneja este escenario y el botón tiene el estilo correcto tanto con disabled
atributo como con .disabled
clase. Si, en cambio, está borrando el enlace (o está utilizando una de las otras técnicas de JavaScript), también debe manejar el estilo porque un <a>
sin href
todavía se pinta como habilitado.
Aplicaciones de Internet enriquecidas accesibles (ARIA)
No olvide incluir también un atributo aria-disabled="true"
junto con disabled
atributo / clase.