Alternar el atributo de entrada deshabilitado con jQuery


191

Aquí está mi código:

$("#product1 :checkbox").click(function(){
    $(this)
        .closest('tr') // Find the parent row.
            .find(":input[type='text']") // Find text elements in that row.
                .attr('disabled',false).toggleClass('disabled') // Enable them.
                .end() // Go back to the row.
            .siblings() // Get its siblings
                .find(":input[type='text']") // Find text elements in those rows.
                .attr('disabled',true).removeClass('disabled'); // Disable them.
});

¿Cómo alternar .attr('disabled',false);?

Parece que no puedo encontrarlo en Google.


¿Alguna razón por la que no puede usar la propiedad deshabilitada del campo? $("input").get(0).disabled = isFalse;// jsfiddle.net/uAfhj
Shanimal

Encontré el plugin DependsOn que puede ser útil
Onshop

Respuestas:


447
$('#el').prop('disabled', function(i, v) { return !v; });

El .prop()método acepta dos argumentos:

  • Nombre de propiedad (deshabilitado, verificado, seleccionado) cualquier cosa que sea verdadera o falsa
  • El valor de la propiedad puede ser:
    • ( vacío ): devuelve el valor actual.
    • boolean (verdadero / falso): establece el valor de la propiedad.
    • función : se ejecuta para cada elemento encontrado, el valor devuelto se usa para establecer la propiedad. Hay dos argumentos pasados; El primer argumento es el índice (0, 1, 2, aumenta para cada elemento encontrado). El segundo argumento es el valor actual del elemento (verdadero / falso).

Entonces, en este caso, utilicé una función que me proporcionó el índice (i) y el valor actual (v), luego devolví lo opuesto al valor actual, por lo que el estado de la propiedad se invierte.


2
Votado como (creo) .prop () es la forma correcta de hacer esto y se agregó precisamente con el propósito de configurar cosas como disabled = "disabled" + its elegant
Morvael

55
¿Qué es iy v?
Matt R

@MattR He agregado una breve explicación.
Arne

¡Esta es una respuesta genial!
LeBlaireau

66
Como actualización, esto se ve muy bien usando las funciones de flecha:$('#el').prop('disabled', (i, v) => !v);
igneosaur

101

¡ Supongo que para obtener la comparabilidad completa del navegador disableddebe establecer el valor disabledo eliminarlo!
Aquí hay un pequeño complemento que acabo de hacer:

(function($) {
    $.fn.toggleDisabled = function() {
        return this.each(function() {
            var $this = $(this);
            if ($this.attr('disabled')) $this.removeAttr('disabled');
            else $this.attr('disabled', 'disabled');
        });
    };
})(jQuery);

Enlace de ejemplo .

EDITAR: ¡se actualizó el enlace / código de ejemplo para mantener la viabilidad!
EDIT 2:
Basado en el comentario de @lonesomeday, aquí hay una versión mejorada:

(function($) {
    $.fn.toggleDisabled = function(){
        return this.each(function(){
            this.disabled = !this.disabled;
        });
    };
})(jQuery);

28
Esto puede funcionar, pero va a ser lento, porque constantemente estás creando nuevos objetos jQuery. $.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });}es todo lo que necesitas.
lonesomeday

@lonesomeday: iba a publicar esto, pero tiendo a pensar que esta no es la forma correcta de establecer / deshabilitar el disabledatributo. De todos modos, si puede confirmar que esta es una solución de navegador cruzado ... actualizaré mi respuesta.
ifaour

2
Para cualquier futuro googlers, esta solución funciona igualmente bien para el atributo 'requerido'.
skybondsor

propes el mejor método desde 1.6 como lo dijo Arne.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功


5

Otra opción simple que se actualiza con un clic de la casilla de verificación.

HTML:

<input type="checkbox" id="checkbox/>
<input disabled type="submit" id="item"/>

jQuery:

$('#checkbox').click(function() {
    if (this.checked) {
        $('#item').prop('disabled', false); // If checked enable item       
    } else {
        $('#item').prop('disabled', true); // If checked disable item                   
    }
});

En acción: enlace


77
Deshazte del ifbloqueo con$('#item').prop('disabled', this.checked);
Naeem Sarfraz

2

Un poco más tarde, y gracias a @arne, creé esta pequeña función similar para manejar dónde la entrada debería deshabilitarse y ocultarse, o habilitarse Y mostrarse:

function toggleInputState(el, on) {
  // 'on' = true(visible) or false(hidden)
  // If a field is to be shown, enable it; if hidden, disable it.
  // Disabling will prevent the field's value from being submitted
  $(el).prop('disabled', !on).toggle(on);
}

Luego, un objeto jQuery (como $ ('input [name = "something"]')) simplemente se cambia usando:

toggleInputState(myElement, myBoolean)

1

Esto es bastante simple con la sintaxis de devolución de llamada de attr:

$("#product1 :checkbox").click(function(){
  $(this)
   .closest('tr') // find the parent row
       .find(":input[type='text']") // find text elements in that row
           .attr('disabled',function(idx, oldAttr) {
               return !oldAttr; // invert disabled value
           })
           .toggleClass('disabled') // enable them
       .end() // go back to the row
       .siblings() // get its siblings
           .find(":input[type='text']") // find text elements in those rows
               .attr('disabled',function(idx, oldAttr) {
                   return !oldAttr; // invert disabled value
               })
               .removeClass('disabled'); // disable them
});
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.