Tengo un botón de enlace dentro de uno <td>
que tengo que deshabilitar. Esto funciona en IE pero no funciona en Firefox y Chrome. Estructura es - Enlace dentro de a <td>
. No puedo agregar ningún contenedor en el <td>
(como div / span)
Intenté todo lo siguiente pero no funcionaba en Firefox (usando 1.4.2 js):
$(td).children().each(function () {
$(this).attr('disabled', 'disabled');
});
$(td).children().attr('disabled', 'disabled');
$(td).children().attr('disabled', true);
$(td).children().attr('disabled', 'true');
Nota: No puedo cancelar el registro de la función de clic para la etiqueta de anclaje, ya que se registra dinámicamente. Y DEBO MOSTRAR EL ENLACE EN MODO DESACTIVADO.
javascript
jquery
html
css
Ankit
fuente
fuente
Respuestas:
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:
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:
Con:
Solución alterna
Probablemente, necesitemos definir una clase CSS para,
pointer-events: none
pero ¿qué pasa si reutilizamos eldisabled
atributo en lugar de una clase CSS? Estrictamente hablandodisabled
no es compatible,<a>
pero los navegadores no se quejarán por atributos desconocidos . Usar eldisabled
atributo IE ignorarápointer-events
pero honrará eldisabled
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
Otra opción para IE 11 es establecer
display
elementos de enlace parablock
oinline-block
: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: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.Para deshabilitar los enlaces, haga esto:
Para volver a habilitarlos:
Si lo desea
.is("[disabled]")
, puede usar.attr("disabled") != undefined
(jQuery 1.6+ siempre volveráundefined
cuando el atributo no esté configurado) perois()
es mucho más claro (gracias a Dave Stewart por este consejo). Tenga en cuenta que estoy usando eldisabled
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 conaddClass()
yremoveClass()
).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
ykeydown
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:Y este para volver a habilitarlos:
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 sereturn false
seguirá el enlace. Para deshabilitar enlaces:Para volver a habilitarlos:
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:Si está utilizando una clase en lugar de un atributo:
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>
sinhref
todavía se pinta como habilitado.Aplicaciones de Internet enriquecidas accesibles (ARIA)
No olvide incluir también un atributo
aria-disabled="true"
junto condisabled
atributo / clase.fuente
td a
los mensajes de correo electrónico que podrían estar deshabilitados, que llamaránevent.preventDefault()
si$(this).data('disabled')
es verdadero y luego establecerándata('disabled', true)
cualquier enlace que quiera deshabilitar (falso para habilitar, etc.)$(this).is('[disabled]')
podría ser una mejor manera de detectar el atributo deshabilitadoTengo la solución en CSS.
Por encima de css cuando se aplica a la etiqueta de anclaje, se deshabilitará el evento de clic.
Para más detalles, consulte este enlace
fuente
Gracias a todos los que publicaron soluciones (especialmente @AdrianoRepetti), combiné varios enfoques para proporcionar una
disabled
funcionalidad más avanzada (y funciona en varios navegadores). El código está debajo (tanto ES2015 como coffeescript según su preferencia).Esto proporciona múltiples niveles de defensa para que las Anclas marcadas como deshabilitadas realmente se comporten como tales. Con este enfoque, obtienes un ancla que no puedes:
Cómo
Incluya este CSS, ya que es la primera línea de defensa. Esto supone que el selector que usa es
a.disabled
A continuación, cree una instancia de esta clase en lista (con selector opcional):
Clase ES2015
npm install -S key.js
Clase de Coffescript:
fuente
Prueba el elemento:
Deshabilitar un enlace me funciona en Chrome: http://jsfiddle.net/KeesCBakker/LGYpz/ .
Firefox no parece jugar bien. Este ejemplo funciona:
Nota: se agregó una declaración 'en vivo' para futuros enlaces deshabilitados / habilitados.
Nota 2: cambió 'live' a 'on'.
fuente
Bootstrap 4.1 proporciona una clase con nombre
disabled
yaria-disabled="true"
atributo.ejemplo"
Más está en getbootstrap.com
Entonces, si desea hacerlo dinámicamente, y
you don't want to care if it is button or ancor
que en el script JS necesita algo asíPero ten cuidado
La solución solo funciona en enlaces con clases
btn btn-link
.A veces, bootstrap recomienda usar
card-link
class, en este caso la solución no funcionará .fuente
Terminé con la solución a continuación, que puede funcionar con un atributo
<a href="..." disabled="disabled">
o una clase<a href="..." class="disabled">
:Estilos CSS:
Javascript (en jQuery listo):
fuente
no se puede deshabilitar un enlace, si quieres ese evento de clic no debe disparar a continuación, simplemente
Remove
laaction
de ese enlace.Para más información: - Elementos que se pueden deshabilitar
fuente
Haría algo como
Algo como esto debería funcionar. Agrega una clase para los enlaces que desea deshabilitar y luego devuelve falso cuando alguien hace clic en ellos. Para habilitarlos simplemente elimine la clase.
fuente
Para deshabilitar el enlace para acceder a otra página en el dispositivo táctil:
fuente
setAttribute('href', '');
y la URL de la página eshttp://example.com/page/?query=something
el enlace al hacer clic en IE11 iría ahttp://example.com/page/
. Una solución podría ser usarsetAttribute('href', '#');
En Razor (.cshtml) puedes hacer:
fuente
Puede usar esto para deshabilitar el hipervínculo de asp.net o los botones de enlace en html.
fuente
Hay otra forma posible, y la que más me gusta. Básicamente, es la misma forma en que lightbox desactiva una página completa, colocando un div y jugando con el índice z. Aquí hay fragmentos relevantes de un proyecto mío. ¡Esto funciona en todos los navegadores!
Javascript (jQuery):
y en html
Entonces, el redimensionador encuentra las ubicaciones del ancla (las imágenes son solo flechas) y coloca el desactivador en la parte superior. La imagen del desactivador es un cuadrado gris translúcido (cambie el ancho / alto de los desactivadores en el html para que coincida con su enlace) para mostrar que está desactivado. El flotante permite que la página cambie de tamaño dinámicamente, y los desactivadores seguirán su ejemplo en windowResizer (). Puede encontrar imágenes adecuadas a través de google. He colocado el css relevante en línea para simplificar.
luego basado en alguna condición,
fuente
Creo que muchos de estos han terminado de pensar. Agrega una clase de lo que quieras, como
disabled_link
.Luego, haga que css tenga
.disabled_link { display: none }
Boom ahora, el usuario no puede ver el enlace para que no tenga que preocuparse de que hagan clic en él. Si hacen algo para satisfacer el enlace de ser puede hacer clic, basta con quitar la clase con jQuery:
$("a.disabled_link").removeClass("super_disabled")
. ¡Auge hecho!fuente
$("td a").each(function(i,v){ $(this).data('href',this.href); $(this).attr('href','#').css('color','grey'); });
Entonces, cuando desee deshacerse de uno:$(this).attr('href',$(this).data('href')).css('color','blue');