¿Cuál es la forma más fácil de desactivar / activar botones y enlaces (jQuery + Bootstrap)


A veces uso anclas con estilo como botones y a veces solo uso botones. Quiero desactivar clicky-cosas específicas para que:

  • Parecen deshabilitados
  • Dejan de hacer clic

¿Cómo puedo hacer esto?

Author: biofractal, 2013-05-27

15 answers

Botones

Los botones son fáciles de desactivar ya que disabled es una propiedad de botón que es manejada por el navegador:

<input type="submit" class="btn" value="My Input Submit" disabled/>
<input type="button" class="btn" value="My Input Button" disabled/>
<button class="btn" disabled>My Button</button>

Para deshabilitar estos con una función jQuery personalizada, simplemente debe hacer uso de fn.extend():

// Disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            this.disabled = state;
        });
    }
});

// Disabled with:
$('input[type="submit"], input[type="button"], button').disable(true);

// Enabled with:
$('input[type="submit"], input[type="button"], button').disable(false);

JSFiddle deshabilitado botón y entrada demo.

De lo contrario, haría uso de jQuery prop() método:

$('button').prop('disabled', true);
$('button').prop('disabled', false);

Etiquetas de anclaje

Vale la pena señalar que disabled no es un válido propiedad para las etiquetas de anclaje. Por esta razón, Bootstrap utiliza el siguiente estilo en sus elementos .btn:

.btn.disabled, .btn[disabled] {
    cursor: default;
    background-image: none;
    opacity: 0.65;
    filter: alpha(opacity=65);
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    box-shadow: none;
    color: #333;
    background-color: #E6E6E6;
}

Tenga en cuenta cómo se dirige la propiedad [disabled], así como una clase .disabled. La clase .disabled es lo que se necesita para que una etiqueta de anclaje aparezca deshabilitada.

<a href="http://example.com" class="btn">My Link</a>

Por supuesto, esto no impedirá que los enlaces funcionen cuando se hace clic. El enlace anterior nos llevará a http://example.com. Para evitar esto, podemos agregar un simple fragmento de código jQuery al objetivo etiquetas de anclaje con la clase disabled a llamar event.preventDefault():

$('body').on('click', 'a.disabled', function(event) {
    event.preventDefault();
});

Podemos alternar la clase disabled usando toggleClass():

jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            $this.toggleClass('disabled', state);
        });
    }
});

// Disabled with:
$('a').disable(true);

// Enabled with:
$('a').disable(false);

JSFiddle disabled link demo.


Combinados

Luego podemos extender la anterior función de desactivación realizada anteriormente para verificar el tipo de elemento que estamos intentando deshabilitar usando is(). De esta manera podemos toggleClass() si no es un elemento input o button, o alternar la propiedad disabled si is:

// Extended disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            if($this.is('input, button, textarea, select'))
              this.disabled = state;
            else
              $this.toggleClass('disabled', state);
        });
    }
});

// Disabled on all:
$('input, button, a').disable(true);

// Enabled on all:
$('input, button, a').disable(false);

Demostración completa combinada de JSFiddle.

Vale la pena señalar que la función anterior también funcionará en todos los tipos de entrada.

 565
Author: James Donnelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-19 17:28:21

No puedo pensar en una manera más simple/más fácil! ;-)


Usando etiquetas de anclaje (Enlaces) :

<a href="#delete-modal" class="btn btn-danger" id="delete">Delete</a>

Para habilitar la etiqueta de anclaje:

 $('#delete').removeClass('disabled');
 $('#delete').attr("data-toggle", "modal");

introduzca la descripción de la imagen aquí


Para desactivar la etiqueta de anclaje:

 $('#delete').addClass('disabled');
 $('#delete').removeAttr('data-toggle');

introduzca la descripción de la imagen aquí

 43
Author: oikonomopo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-10 12:51:48

Supongamos que tiene un campo de texto y un botón de envío,

<input type="text" id="text-field" />
<input type="submit" class="btn" value="Submit"/>

Desactivación:

Para desactivar cualquier botón, por ejemplo, enviar botón solo tiene que agregar deshabilitado atributo como,

$('input[type="submit"]').attr('disabled','disabled');

Después de ejecutar la línea anterior, la etiqueta html del botón enviar se vería así:

<input type="submit" class="btn" value="Submit" disabled/>

Observe que el atributo' disabled ' ha agregado .

Habilitando:

Para habilitar el botón, como cuando tiene algo de texto en el campo de texto. Usted tendrá que quitar el deshabilitar el atributo para habilitar el botón como,

 if ($('#text-field').val() != '') {
     $('input[type="submit"]').removeAttr('disabled');
 }

Ahora el código anterior eliminará el atributo' disabled'.

 26
Author: Sohail xIN3N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-04 10:02:08

Sé que llego tarde a la fiesta, pero para responder específicamente a las dos preguntas:

"Solo quiero desactivar clicky-cosas específicas para que:

  • Dejan de hacer clic
  • Parecen discapacitados

¿Qué tan difícil puede ser esto?"

Dejan de hacer clic

1.  Para botones como <button> o <input type="button"> se añade el atributo: disabled.

<button type="submit" disabled>Register</button>
<input type="button" value="Register" disabled>

2.  Para enlaces, CUALQUIER enlace... en realidad, cualquier HTML elemento, puede utilizar CSS3 eventos de puntero.

.selector { pointer-events:none; }

El soporte del navegador para eventos de puntero es impresionante por el estado actual del arte (5/12/14). Pero por lo general tenemos que soportar navegadores heredados en el reino de IE, por lo que IE10 y por debajo NO soportan eventos de puntero: http://caniuse.com/pointer-events . Así que el uso de una de las soluciones de JavaScript mencionadas por otros aquí puede ser el camino a seguir para los navegadores heredados.

Más información sobre pointer eventos:

Parecen discapacitados

Obviamente esta es una respuesta CSS, así que:

1.  Para botones como <button> o <input type="button"> use el selector [attribute]:

button[disabled] { ... }

input[type=button][disabled] { ... }

--

Aquí hay una demostración básica con las cosas que mencioné aquí: http://jsfiddle.net/bXm5B/4/

Espero que esto ayude.

 21
Author: Ricardo Zea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-12 03:46:38

Si, como yo, solo quieres desactivar un botón, no te pierdas la respuesta simple sutilmente oculta en este largo hilo:

 $("#button").prop('disabled', true);
 16
Author: Graham Laight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-31 15:20:13

@James Donnelly ha proporcionado una respuesta completa que se basa en extender jQuery con una nueva función. Esa es una gran idea, así que voy a adaptar su código para que funcione de la manera que lo necesito.

JQuery es un juego de palabras.]}

$.fn.disable=-> setState $(@), true
$.fn.enable =-> setState $(@), false
$.fn.isDisabled =-> $(@).hasClass 'disabled'

setState=($el, state) ->
    $el.each ->
        $(@).prop('disabled', state) if $(@).is 'button, input'
        if state then $(@).addClass('disabled') else $(@).removeClass('disabled')

    $('body').on('click', 'a.disabled', -> false)

Uso

$('.btn-stateful').disable()
$('#my-anchor').enable()

El código procesará un solo elemento o una lista de elementos.

Los botones y las entradas admiten la propiedad disabled y, si se establecen en true, se verán deshabilitados (gracias a bootstrap) y no disparar cuando se hace clic.

Los anclajes no admiten la propiedad disabled, por lo que en su lugar vamos a confiar en la clase .disabled para que se vean deshabilitados (gracias a bootstrap de nuevo) y conectaremos un evento de clic predeterminado que evita el clic devolviendo false (no es necesario preventDefault ver aquí).

Nota: No es necesario desenganchar este evento al volver a habilitar los anclajes. Simplemente eliminar la clase .disabled hace el truco.

Por supuesto, esto no ayuda si ha adjuntado un controlador de clics personalizado al enlace, algo que es muy común cuando se usa bootstrap y jQuery. Así que para lidiar con esto vamos a usar la extensión isDisabled() para probar la clase .disabled, así:

$('#my-anchor').click -> 
    return false if $(@).isDisabled()
    # do something useful

Espero que eso ayude a simplificar un poco las cosas.

 7
Author: biofractal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-28 15:37:46

Tenga en cuenta que hay un problema extraño si está utilizando los botones JS de Bootstrap y el estado 'loading'. No se porque sucede esto, pero aqui esta como arreglarlo.

Digamos que tienes un botón y lo pones en el estado de carga:

var myButton = $('#myBootstrapButton');
myButton.button('loading');

Ahora desea sacarlo del estado de carga, pero también deshabilitarlo (por ejemplo, el botón era un botón de guardar, el estado de carga indicaba una validación en curso y la validación falló). Esto parece un Bootstrap razonable JS:

myButton.button('reset').prop('disabled', true); // DOES NOT WORK

Desafortunadamente, eso restablecerá el botón, pero no lo deshabilitará. Aparentemente, button() realiza alguna tarea retrasada. Así que también tendrás que posponer tu desactivación:

myButton.button('reset');
setTimeout(function() { myButton.prop('disabled', true); }, 0);

Un poco molesto, pero es un patrón que estoy usando mucho.

 7
Author: Henrik Heimbuerger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-18 09:05:46

¡Gran respuesta y contribuciones de todos! Tuve que extender esta función ligeramente para incluir la desactivación de elementos selectos:

jQuery.fn.extend({
disable: function (state) {
    return this.each(function () {
        var $this = jQuery(this);
        if ($this.is('input, button'))
            this.disabled = state;
        else if ($this.is('select') && state)
            $this.attr('disabled', 'disabled');
        else if ($this.is('select') && !state)
            $this.removeAttr('disabled');
        else
            $this.toggleClass('disabled', state);
    });
}});

Parece estar funcionando para mí. Gracias a todos!

 6
Author: Brandon Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-11 01:07:29

Para ese tipo de comportamiento siempre uso el widget jQueryUI button, lo uso para enlaces y botones.

Define la etiqueta dentro de HTML:

<button id="sampleButton">Sample Button</button>
<a id="linkButton" href="yourHttpReferenceHere">Link Button</a>

Use jQuery para inicializar los botones:

$("#sampleButton").button();
$("#linkButton").button();

Use los métodos del widget button para deshabilitarlos/habilitarlos:

$("#sampleButton").button("enable"); //enable the button
$("#linkButton").button("disable"); //disable the button

Eso se encargará del comportamiento del botón y el cursor, pero si necesita profundizar y cambiar el estilo del botón cuando esté deshabilitado, entonces sobrescriba las siguientes clases CSS dentro del estilo CSS de su página file.

.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
      background-color:aqua;
      color:black;
 }

Pero recuerde: esas clases CSS (si se cambian) también cambiarán el estilo de otros widgets.

 5
Author: El Bayames,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-05 00:03:53

Lo siguiente me ha funcionado muy bien:

$("#button").attr('disabled', 'disabled');
 3
Author: Raptor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-02 04:06:39

Esta es una respuesta bastante tardía, sin embargo, me topé con esta pregunta mientras buscaba una manera de desactivar los botones boostrap después de hacer clic en ellos y tal vez agregar un efecto agradable (por ejemplo, un spinner). He encontrado una gran biblioteca que hace exactamente eso:

Http://msurguy.github.io/ladda-bootstrap /

Solo incluye el css y js necesarios, agrega algunas propiedades a tus botones y habilita lada con javascript... ¡Presto ! Sus botones tienen una nueva vida (por favor, compruebe la demo para ver lo hermoso que es) !

 2
Author: Serafeim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-19 20:12:26

Esto anterior no funciona porque a veces

$(this).attr('checked') == undefined

Ajuste su código con

if(!$(this).attr('checked') || $(this).attr('checked') == false){
 2
Author: Kiko Seijo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-15 18:56:43

Sé que mi respuesta es tardía, pero IMO esta es la forma más fácil de alternar un botón 'habilitar' y el botón 'deshabilitar'

function toggleButtonState(button){

  //If button is enabled, -> Disable
  if (button.disabled === false) {
    button.disabled = true;

  //If button is disabled, -> Enable
  } else if (button.disabled === true) {
    button.disabled = false;
  }
}
 2
Author: jward01,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-19 20:00:42

Supongamos que tienes estos botones en la página como:

<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit"value="Enable All" onclick="change()"/>

El código js:

function change(){
   var toenable = document.querySelectorAll(".byBtn");        
    for (var k in toenable){
         toenable[k].removeAttribute("disabled");
    }
}
 1
Author: Samit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-21 07:45:18

Digamos que tienes que se parece a esto que está actualmente activado.

<button id="btnSave" class="btn btn-info">Save</button>

Solo agrega esto:

$("#btnSave").prop('disabled', true);

Y obtendrá esto que desactivará el botón

<button id="btnSave" class="btn btn-primary" disabled>Save</button>
 1
Author: Apollo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-03 19:24:28