¿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.


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

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;
});

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;
}

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>

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;
}

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


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).


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"); 

5

Simplemente elimine el hrefatributo de la etiqueta de anclaje.


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();
});

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.


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"); 

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;
}

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>

¿En qué se diferencia esto de la respuesta de Jason MacDonald ?
Todos los trabajadores son esenciales

1

Prueba esto:

$('a').contents().unwrap();

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;
     }
}

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:;");

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.


-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


3
disabled no es un atributo válido para la etiqueta <a>
Josepas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.