¿Cómo habilitar o deshabilitar un ancla usando jQuery?


150

¿Cómo habilitar o deshabilitar un ancla usando jQuery?


Gracias por toda su respuesta. Aún no funciona, así que puede hacerlo funcionar con la función document.ready
Senthil Kumar Bhaskaran

Puede ser útil si publica el fragmento de código que no funciona.
Hooray Im Helping

En realidad, mi codificación está en Rails y mi codificación es <% = foo.add_associated_link ('Agregar correo electrónico', @ project.email.build)%> cuando lo visualizo en el navegador puedo ver el correo electrónico, pero ni siquiera puedo desactivarlo. intentado con codificación como e.preventDefault () pero sin resultado
Senthil Kumar Bhaskaran

Respuestas:


194

Para evitar que un ancla siga lo especificado href, sugeriría usar preventDefault():

// jQuery 1.7+
$(function () {
    $('a.something').on("click", function (e) {
        e.preventDefault();
    });
});

// jQuery < 1.7
$(function () {
    $('a.something').click(function (e) {
        e.preventDefault();
    });

    // or 

    $('a.something').bind("click", function (e) {
        e.preventDefault();
    });
});

Ver:

http://docs.jquery.com/Events/jQuery.Event#event.preventDefault.28.29

Consulte también esta pregunta anterior sobre SO:

jQuery deshabilita un enlace


Intenté con esos "attr", solo funciona en el elemento de formulario, no en la etiqueta Anchor.
Senthil Kumar Bhaskaran

1
@senthil - preventDefault se considera la forma 'adecuada' de hacer esto, vea mi edición (enlace a otro Q + A)
karim79

En realidad, mi codificación está en Rails y mi codificación es <% = foo.add_associated_link ('Agregar correo electrónico', @ project.email.build)%> cuando lo visualizo en el navegador puedo ver el correo electrónico, pero ni siquiera puedo desactivarlo. intentado con codificación como e.preventDefault () pero sin resultado
Senthil Kumar Bhaskaran

2
¿Cómo puedo revertir $('a.something').on("click", function (e) { e.preventDefault(); });?
ア レ ッ ク ス

2
En desacuerdo, use CSS "eventos de puntero: ninguno;" en cambio, al igual que en otras respuestas.
vitrilo

116

La aplicación en la que estoy trabajando actualmente lo hace con un estilo CSS en combinación con JavaScript.

a.disabled { color:gray; }

Luego, cuando quiera deshabilitar un enlace, llamo

$('thelink').addClass('disabled');

Luego, en el controlador de clics para 'thelink', una etiqueta siempre ejecuto un cheque primero

if ($('thelink').hasClass('disabled')) return;

66
¿No debería esa última línea decir "return false"?
Prestaul

1
Buena llamada, Prestaul. Cuando estoy vinculado a una etiqueta <a>, estoy usando: <a href="whatever" onclick="return disableLink(this)"> .. luego: function disableLink (node) {if (dojo.hasClass (node, 'disabled') devuelve false; dojo.addClass (nodo, 'disabled'); devuelve true;} .. esto permite hacer clic en el enlace una vez y acción (return true) y luego no permite la acción (devuelve falso).
Neek

Tenga en cuenta que en el controlador probablemente debería usar $ (this) en lugar de $ ("thelink") ya que eso podría cambiar o el usuario podría copiar / pegar fácilmente el código.
Alexis Wilke

2
Sugiero que también agregue 'cursor: predeterminado' al estilo deshabilitado.
Stuart Hallows

40

Encontré una respuesta que me gusta mucho más aquí

Se ve como esto:

$(document).ready(function(){
    $("a").click(function () { 
        $(this).fadeTo("fast", .5).removeAttr("href"); 
    });
});

La habilitación implicaría establecer el atributo href

$(document).ready(function(){
    $("a").click(function () { 
        $(this).fadeIn("fast").attr("href", "http://whatever.com/wherever.html"); 
    });
});

Esto le da la apariencia de que el elemento de anclaje se convierte en texto normal y viceversa.


12
$("a").click(function(){
                alert('disabled');
                return false;

}); 

12

Creo que una mejor solución es establecer el atributo de datos deshabilitado y anclar una verificación al hacer clic. De esta manera, podemos deshabilitar temporalmente un ancla hasta que, por ejemplo, el javascript termine con una llamada ajax o algunos cálculos. Si no lo deshabilitamos, podemos hacer clic rápidamente en él varias veces, lo que es indeseable ...

$('a').live('click', function () {
    var anchor = $(this);

    if (anchor.data("disabled")) {
        return false;
    }

    anchor.data("disabled", "disabled");

    $.ajax({
        url: url,
        data: data,
        cache: false,
        success: function (json) {
            // when it's done, we enable the anchor again
            anchor.removeData("disabled");
        },
        error: function () {
             // there was an error, enable the anchor
            anchor.removeData("disabled");
        }
    });

    return false;
});

Hice un ejemplo de jsfiddle: http://jsfiddle.net/wgZ59/76/


11

La respuesta seleccionada no es buena.

Utilice el estilo CSS de puntero-eventos . (Como sugirió Rashad Annara)

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

Además, con los eventos de puntero no necesitará incluir el estado: hover, ya que es un evento de puntero. Solo necesita incluir un selector [deshabilitado].
Larry Dukek

10

Prueba las siguientes líneas

$("#yourbuttonid").attr("disabled", "disabled");
$("#yourbuttonid").removeAttr("href");

Coz, incluso si deshabilita la <a>etiqueta hreffuncionará, por lo que hreftambién debe eliminarla .

Cuando desee habilitar intente debajo de las líneas

$("#yourbuttonid").removeAttr("disabled");
$("#yourbuttonid").attr("href", "#nav-panel");

1
Esto es exactamente lo que necesitaba cuando usaba JQuery con ASP.net MVC ActionLink. ¡Gracias!
eaglei22

8

Es tan simple como return false;

ex.

jQuery("li a:eq(0)").click(function(){
   return false;
})

o

jQuery("#menu a").click(function(){
   return false;
})

8
$('#divID').addClass('disabledAnchor');

En el archivo css

.disabledAnchor a{
       pointer-events: none !important;
       cursor: default;
       color:white;
}

5
$("a").click(function(event) {
  event.preventDefault();
});

Si se llama a este método, la acción predeterminada del evento no se activará.



4

Nunca especificó realmente cómo deseaba que se desactivaran, o qué causaría la desactivación.

Primero, desea descubrir cómo establecer el valor en deshabilitado, para eso usaría las funciones de atributo de JQuery y hacer que esa función suceda en un evento , como un clic o la carga del documento.


1

Para situaciones en las que debe colocar texto o contenido html dentro de una etiqueta de anclaje, pero simplemente no desea que se realice ninguna acción cuando se hace clic en ese elemento (como cuando desea que un enlace de paginador esté en estado deshabilitado porque está la página actual), simplemente recorte el href. ;)

<a>3 (current page, I'm totally disabled!)</a>

La respuesta de @ michael-meadows me dio una pista sobre esto, pero todavía estaba abordando escenarios en los que todavía tienes que / estás trabajando con jQuery / JS. En este caso, si tiene control sobre cómo escribir el html en sí mismo, simplemente hacer una x-href de la etiqueta href es todo lo que necesita hacer, ¡entonces la solución es HTML puro!

Otras soluciones sin jQuery finagling que mantienen el href requieren que coloque un # en el href, pero eso hace que la página rebote a la parte superior, y solo quiere que esté simplemente deshabilitado. O dejándolo vacío, pero dependiendo del navegador, eso todavía hace cosas como saltar a la parte superior y, según los IDE, es HTML no válido. Pero aparentemente una aetiqueta es HTML totalmente válido sin HREF.

Por último, podría decir: De acuerdo, ¿por qué no simplemente volcar la etiqueta a por completo? Debido a que a menudo no puede, la aetiqueta se usa para propósitos de estilo en el marco CSS o el control que está usando, como el paginador de Bootstrap:

http://twitter.github.io/bootstrap/components.html#pagination


1

Entonces, con una combinación de las respuestas anteriores, se me ocurrió esto.

a.disabled { color: #555555; cursor: default; text-decoration: none; }

$(".yourClass").addClass("disabled").click(function(e){ e.preventDefault(); 

0

Si no necesita que se comporte como una etiqueta de anclaje, preferiría reemplazarlo. Por ejemplo, si su etiqueta de anclaje es como

<a class="MyLink" href="http://www.google.com"><span>My</span> <strong>Link</strong></a>

luego, utilizando jquery, puede hacerlo cuando necesite mostrar texto en lugar de un enlace.

var content = $(".MyLink").text(); // or .html()
$(".MyLink").replaceWith("<div>" + content + "</div>")

De esta manera, simplemente podemos reemplazar la etiqueta de anclaje con una etiqueta div. Esto es mucho más fácil (solo 2 líneas) y semánticamente correcto también (porque no necesitamos un enlace ahora, por lo tanto, no debería tener un enlace)


0

Deshabilitar o habilitar cualquier elemento con la propiedad deshabilitada.

// Disable 
$("#myAnchor").prop( "disabled", true );

// Enable
$( "#myAnchor" ).prop( "disabled", false );

¿Por qué se vota esta respuesta? Responde a la pregunta "¿Cómo habilitar o deshabilitar un ancla usando jQuery?"
RitchieD

Creo que es porque los enlaces aún se abren cuando se hace clic en el ancla.
Zombaya
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.