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: nonepero ¿qué pasa si reutilizamos eldisabledatributo en lugar de una clase CSS? Estrictamente hablandodisabledno es compatible,<a>pero los navegadores no se quejarán por atributos desconocidos . Usar eldisabledatributo IE ignorarápointer-eventspero honrará eldisabledatributo 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:disabledpointer-eventsOtra opción para IE 11 es establecer
displayelementos de enlace parablockoinline-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-eventssolo 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
tabindexde 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)
tabindexno se puede cambiar de CSS.Interceptar clics
Use una función
hrefa 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áundefinedcuando el atributo no esté configurado) perois()es mucho más claro (gracias a Dave Stewart por este consejo). Tenga en cuenta que estoy usando eldisabledatributo 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,mousedownykeydowneventos. 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
hrefno se borra, es posible que el usuario visite manualmente esa página.Borrar el enlace
Borrar el
hrefatributo 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
onclickfunción donde no sereturn falseseguirá 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
disabledatributo 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
disabledatributo como con.disabledclase. 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>sinhreftodavía se pinta como habilitado.Aplicaciones de Internet enriquecidas accesibles (ARIA)
No olvide incluir también un atributo
aria-disabled="true"junto condisabledatributo / clase.fuente
td alos 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
disabledfuncionalidad 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.disabledA continuación, cree una instancia de esta clase en lista (con selector opcional):
Clase ES2015
npm install -S key.jsClase 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
disabledyaria-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 ancorque 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-linkclass, 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
Removelaactionde 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=somethingel 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');