¿Cómo se puede hacer que no se pueda hacer clic en un enlace de anclaje o que esté inhabilitado?

92

Tengo un enlace de ancla que quiero deshabilitar una vez que el usuario hace clic en él. O elimine la etiqueta de anclaje alrededor del texto, pero definitivamente conserve el texto.

<a href='' id='ThisLink'>some text</a>

Puedo hacer esto fácilmente con un botón agregando .attr("disabled", "disabled");
que agregué con éxito la propiedad deshabilitada, pero aún se podía hacer clic en el enlace.
Realmente no me importa si el texto está subrayado o no.

¿Cualquier pista?

Cuando haces clic en el músico equivocado, debería simplemente agregar "Wrong" y luego no se puede hacer clic.
Cuando hace clic y está en lo correcto, debe agregar "Impresionante" y luego deshabilitar todas las <a>etiquetas.

Evik James
fuente
elimine la parte href y agregue a su CSS: "cursor: pointer", supongo que tiene un $ ('# ThisLink'). clic o algo así
Libro de Zeus
1
$ ("# ThisLink"). Parent (). Find ("a"). Remove ();
Adam Holmes
Adam, esta solución casi funciona. Sin embargo, elimina todo el texto dentro de la etiqueta a.
Evik James
Posible duplicado de Cómo deshabilitar los enlaces HTML
Steve Chambers

Respuestas:

12

Me acabo de dar cuenta de lo que estabas pidiendo (espero). Aquí hay una fea solución

var preventClick = false;

$('#ThisLink').click(function(e) {
    $(this)
       .css('cursor', 'default')
       .css('text-decoration', 'none')

    if (!preventClick) {
        $(this).html($(this).html() + ' lalala');
    }

    preventClick = true;

    return false;
});
MSI
fuente
Esto realmente podría resolver el problema, algo así como ... En lugar de .click, use .on en el cuerpo y delegue a 'a [disabled]'. Luego coloque el código css en el css real usando el mismo selector. Entonces, prevenir el clic es tan simple como event.preventDefault () y devolver falso
lassombra
2
No estoy de acuerdo, use CSS "pointer-events: none;" en cambio, al igual que en otras respuestas.
vitrilo
200

El método más limpio sería agregar una clase con eventos de puntero: ninguno cuando desee deshabilitar un clic. Funcionaría como una etiqueta normal.

.disableClick{
    pointer-events: none;
}
mvinayakam
fuente
19
Usando esta idea, una manera aún más fácil sería usar un [deshabilitado] como selector para el CSS para que no sea necesario agregar la clase .disableClick al ancla
Ferran Salguero
15
Sin embargo, tenga cuidado, ya que aún puede tabular las cosas deshabilitadas con eventos de puntero: ninguno
Mike Mellor
esta solución es buena para mí en los navegadores modernos. Tengo etiquetas de ancla utilizables que están destinadas a hacer clic en eventos, y para desalentar el envío de correo no deseado a medida que sus procesos hacen lo suyo, agrego esto mediante programación y luego lo elimino cuando finaliza el proceso. tabular a una etiqueta de ancla deshabilitada en mi caso tampoco es una preocupación, pero puede serlo para otros. YMMV
Stephen Tetreault
2
El uso pointer-events:nonetambién desactivará el cursortexto del título y otros eventos de mouseover.
Keith
el valor none indica al evento del mouse que pase "a través" del elemento y apunte a lo que esté "debajo" de ese elemento. developer.mozilla.org/en-US/docs/Web/CSS/pointer-events Eso podría ser un problema en algunos diseños
user2988142
33
<a href='javascript:void(0);'>some text</a>
Shiv Kumar Sah
fuente
8
Explique su solución para que los futuros visitantes de esta pregunta comprendan cómo resuelve el problema en cuestión.
War10ck
3
De: MDN: The void Operator . Cuando un navegador sigue a javascript: URI, evalúa el código en el URI y luego reemplaza el contenido de la página con el valor devuelto, a menos que el valor devuelto sea undefined. El voidoperador se puede utilizar para regresar undefined. Por ejemplo: tenga en <a href="javascript:void(0);"> Click here to do nothing </a> cuenta, sin embargo, que javascript:se desaconseja el pseudo protocolo frente a otras alternativas, como los controladores de eventos discretos.
Lenin
29

Utilice el estilo CSS de eventos de puntero . (como sugirió Jason MacDonald)

Consulte MDN https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events . Es compatible con la mayoría de los navegadores.

La simple adición del atributo "deshabilitado" al ancla hará el trabajo si tiene una regla CSS global como la siguiente:

a[disabled], a[disabled]:hover {
   pointer-events: none;
   color: #e1e1e1;
}
vitrilo
fuente
3
+1 para agregar el estilo a través del atributo [deshabilitado] en lugar de una clase. Cabe señalar que pointer-events: none; Sin embargo, no funciona en nada más antiguo que IE11.
Daniel Tonon
Todos los IE tienen su propia lógica patentada para deshabilitar el ancla, los botones e incluso otros elementos de forma predeterminada. Esta solución es necesaria para los navegadores que no son IE.
vitrilo
3
+1. Solo para no tener que buscarlo nuevamente la próxima vez: el javascript requerido (usando jQuery) sería $("#elementid").attr("disabled", "disabled");. También puede ser útil incluirlo cursor: defaulten el CSS (como sugirió Muhammad Nasir).
ASL
Un elemento no tiene un atributo deshabilitado , usarlo como selector puede o no funcionar.
RobG
1
Intuitivo: buena solución. De hecho, me sorprendió descubrir que los <a />elementos no tienen un atributo deshabilitado, parece extraño.
Morvael
12
$('a').removeAttr('href')

o

$('a').click(function(){ return false})

Depende de la situación

Un disparo
fuente
Eliminar el a a través de removeAttr no funciona para mí. .removeAttr ("href") awesomealbums.info/?WhoAmI
Evik James
10

Bootstrap nos da .disabledclase. Por favor utilícelo.

Pero la .disabledclase solo funciona cuando la etiqueta 'a' ya tiene la clase 'btn'. No funciona con ninguna etiqueta "a" antigua. La btnclase puede no ser apropiada en algún contexto ya que tiene connotaciones de estilo. Bajo las sábanas, la .disabledclase se establece pointer-eventsen none, por lo que puede hacer que CSS haga lo mismo que Saroj Aryal y Vitrilo han sugerido. (Gracias, Les Nightingill por este consejo).

Yevgeniy Afanasyev
fuente
3
la clase .disabled solo funciona cuando la etiqueta 'a' ya tiene la clase 'btn'. No funciona con ninguna etiqueta "a" antigua. La clase 'btn' puede no ser apropiada en algún contexto ya que tiene connotaciones de estilo. Bajo las sábanas, la clase .disabled establece pointer-events en none, por lo que puede hacer que css haga lo mismo que han sugerido Saroj Aryal y Vitrilo.
Les Nightingill
Gracias por tu comentario detallado. Aclara mucho para muchos usuarios. ¿Puedo utilizar algún texto de su comentario para ampliar mi respuesta?
Yevgeniy Afanasyev
9

Agregar una cssclase:

.disable_a_href{
    pointer-events: none;
}

Agrega esto jquery:

$("#ThisLink").addClass("disable_a_href"); 
Jason MacDonald
fuente
5

Simplemente elimine el hrefatributo de la etiqueta de anclaje.

Pastillas de explosión
fuente
2
En algunos navegadores, la eliminación de href simplemente establece href en / o la página actual.
Polinomio
Creo que este debería ser el primer enfoque
Bas Slagter
5

La mejor forma es evitar la acción predeterminada. En el caso de la etiqueta de ancla, el comportamiento predeterminado es redirigir a la hrefdirección especificada.

Entonces, seguir javascript funciona mejor en la situación:

$('#ThisLink').click(function(e)
{
    e.preventDefault();
});
Kedar.Aitawdekar
fuente
4

Puede usar el evento onclick para deshabilitar la acción de clic:

<a href='' id='ThisLink' onclick='return false'>some text</a>

O simplemente podría usar algo más que una <a>etiqueta.

Polinomio
fuente
Puede combinar esto con text-decoration: noney .disabledLink { color: #000 !important; }para que parezca texto normal.
Polinomio
1
javascript intrusivo es una solución terrible.
jahrichie
4

Los comentarios de Jason MacDonald funcionaron para mí, probados en Chrome, Mozila e IE.

Se agregó color gris para mostrar el efecto de desactivación.

.disable_a_href{
    pointer-events: none;
    **color:#c0c0c0 !important;**
}

Jquery estaba seleccionando solo el primer elemento en la lista de anclajes, agregó metacarácter (*) para seleccionar y deshabilitar todos los elementos con id #ThisLink.

$("#ThisLink*").addClass("disable_a_href"); 
Pankaj
fuente
4

Escriba esto una sola línea de código jQuery

$('.hyperlink').css('pointer-events','none');

si quieres escribir en un archivo css

.hyperlink{
    pointer-events: none;
}
Shaik Md N Rasool
fuente
3

Cree la siguiente clase en la hoja de estilo:

  .ThisLink{
           pointer-events: none;
           cursor: default;
    }

Agregue esta clase a su enlace dinámicamente de la siguiente manera.

 <a href='' id='elemID'>some text</a>

    //   or using jquery
<script>
    $('#elemID').addClass('ThisLink');
 </script>
Muhammad Nasir
fuente
¿En qué se diferencia esto de la respuesta de Jason MacDonald ?
Todos los trabajadores son esenciales
1

Prueba esto:

$('a').contents().unwrap();
Hari Pachuveetil
fuente
lo que es el ancla tiene reglas de estilo que son esenciales para su programa, esta es una solución que ignora css
Trevor Rudolph
1

Simplemente en SASS:

.some_class{
     // styles...

     &.active {
       pointer-events:none;
     }
}
Saroj Aryal
fuente
Aunque este código puede responder a la pregunta, proporcionar un contexto adicional sobre por qué y / o cómo responde la pregunta mejoraría significativamente su valor a largo plazo. Por favor, editar su respuesta a añadir un poco de explicación.
Toby Speight
1

Este es el método que utilicé para desactivar. Espero que ayude.

$("#ThisLink").attr("href","javascript:;");
Mamba negro
fuente
1
¡Esta es la solución simple y fácil y debe aceptarse!
Si8
-1
$('#ThisLink').one('click',function(){
  $(this).bind('click',function(){
    return false;
  });
});

Esta sería otra forma de hacer esto, el controlador con return false, que deshabilitará el enlace, se agregará después de un clic.

GNi33
fuente
-4

La forma mas facil

En tu html:

<a id="foo" disabled="true">xxxxx<a>

En tu js:

$('#foo').attr("disabled", false);

Si lo usas como atributo funciona perfectamente

Nathre
fuente
3
disabled no es un atributo válido para la etiqueta <a>
Josepas