¿Cómo eliminar el atributo "deshabilitado" usando jQuery?

394

Tengo que deshabilitar las entradas al principio y luego al hacer clic en un enlace para habilitarlas.

Esto es lo que he intentado hasta ahora, pero no funciona.

HTML:

<input type="text" disabled="disabled" class="inputDisabled" value="">

jQuery:

$("#edit").click(function(event){
   event.preventDefault();
   $('.inputDisabled').removeAttr("disabled")
});


Esto me muestra truey luego, falsepero nada cambia para las entradas:

$("#edit").click(function(event){
   alert('');
   event.preventDefault();
   alert($('.inputDisabled').attr('disabled'));
   $('.inputDisabled').removeAttr("disabled");
   alert($('.inputDisabled').attr('disabled'));
});
fatiDev
fuente
2
No veo tu problema. ¿Que estas preguntando?
nicosantangelo
entonces cuál es la pregunta? Me refiero a qué problema estás enfrentando
Satya Teja
77
Use prop () - .prop ('disabled', false)
Jay Blanchard el
Si su problema se resolvió, marque la respuesta aceptada (Real) para que otros sepan ...
Dhamu
el problema es que no se desactiva después del clic
fatiDev

Respuestas:

817

Siempre use elprop() método para habilitar o deshabilitar elementos cuando use jQuery (vea a continuación por qué).

En su caso, sería:

$("#edit").click(function(event){
   event.preventDefault();
   $('.inputDisabled').prop("disabled", false); // Element(s) are now enabled.
});

Ejemplo de jsFiddle aquí.


¿Por qué usar prop()cuando podrías usar attr()/ removeAttr()para hacer esto?

Básicamente, prop()se debe utilizar cuando obtener o establecer propiedades (como autoplay, checked, disabledy required, entre otros).

Al usar removeAttr(), está eliminando completamente el disabledatributo en sí mismo, mientras prop()que simplemente está configurando el valor booleano subyacente de la propiedad en falso.

Si bien lo que desea hacer se puede hacer con attr()/ removeAttr(), no significa que se deba hacer (y puede causar un comportamiento extraño / problemático, como en este caso).

Los siguientes extractos (tomados de la documentación de jQuery para prop () ) explican estos puntos con mayor detalle:

"La diferencia entre atributos y propiedades puede ser importante en situaciones específicas. Antes de jQuery 1.6, el .attr()método a veces tomaba en cuenta los valores de propiedad al recuperar algunos atributos, lo que podría causar un comportamiento inconsistente. A partir de jQuery 1.6, el .prop() método proporciona una forma de recuperar explícitamente valores de propiedad, mientras .attr()recupera atributos ".

"Las propiedades generalmente afectan el estado dinámico de un elemento DOM sin cambiar el atributo HTML serializado. Los ejemplos incluyen la value propiedad de los elementos de entrada, la disabledpropiedad de las entradas y los botones, o la checkedpropiedad de una casilla de verificación. El .prop()método debe usarse para establecer disabledy checkedno el .attr() método. El .val()método debe usarse para obtener y configurar value".

dsgriffin
fuente
3
La gente también debe saber tope con la bandera sucia checkedness, que rompe por completo attrversus proppara casillas de verificación: w3.org/TR/html5/forms.html#concept-input-checked-dirty excepto para jQuery interno Solución alternativa mágica.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
19
Hmm, .prop ("disabled", false) no parece funcionar para mí en un botón: deja el atributo 'disabled' en la etiqueta sin valor.
UpTheCreek
3
@UpTheCreek tampoco estaba funcionando para mí. Pero descubrí que era un problema de alcance con la cláusula 'this' (como de costumbre). En el caso específico, .prop()se ejecutó en el elemento señalado por this( this.prop("disabled", false)pero al estar en una devolución de llamada estaba vinculado al elemento incorrecto, así que tuve que hacer la var that = thissolución común . Intentar jugar con .apply()/ .call()no funcionaba bien; no sé por qué. Verifique con un console.log(this)si está configurado para su objeto deseado, justo antes de llamarthis.prop(...)
Kamafeather
3
Nomino esta respuesta como candidato para la conversión a la sección del documento. Claro, completo, bien escrito.
Anne Gunn el
44
Al usar removeAttr (), está eliminando por completo el atributo deshabilitado en sí mismo, mientras que prop () simplemente establece el valor booleano subyacente de la propiedad en falso. No creo que esto sea cierto. En HTML, la mera presencia de la disabledpropiedad deshabilitará el elemento. Por ejemplo, tener una <button disabled="false"></button> voluntad no habilitará el botón, la propiedad debe ser eliminada. Al llamar a $('button').prop('disabled', false);jQuery eliminará la propiedad por usted, como lo observé en este código (inspeccione para ver la eliminación de la propiedad).
Naftali
42
<input type="text" disabled="disabled" class="inputDisabled" value="">
​<button id="edit">Edit</button>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

$("#edit").click(function(event){
    event.preventDefault();
    $('.inputDisabled').removeAttr("disabled")
});​

http://jsfiddle.net/ZwHfY/

Muthu Kumaran
fuente
42

para eliminar el uso de atributos deshabilitados,

 $("#elementID").removeAttr('disabled');

y para agregar el uso de atributos deshabilitados,

$("#elementID").prop("disabled", true);

Disfruta :)

Umesh Patil
fuente
44
O simplemente element.removeAttribute ('desactivado') en vanilla js
Dragos Rusu
16

Usar así,

HTML:

<input type="text" disabled="disabled" class="inputDisabled" value="">

<div id="edit">edit</div>

JS:

 $('#edit').click(function(){ // click to
            $('.inputDisabled').attr('disabled',false); // removing disabled in this class
 });
Dhamu
fuente
66
Este realmente está trabajando para mí. El accesorio ('deshabilitado', falso) sorprendentemente no funcionó.
Stefan
@Stefan lo mismo aquí! ¿Descubriste por qué?
Alexander Suraphel el
1
Sé que este es un hilo antiguo, pero si alguien todavía lucha con esto, mi problema es que el elemento era un <a>, en el que .prop('disabled', false)no funciona. Lo cambié a a <button>y funciona ahora
Oliver Nagy
3

Pensé que esto puede configurar fácilmente

$(function(){
$("input[name^=radio_share]").click
(
    function()
    {
        if($(this).attr("id")=="radio_share_dependent")
        {
            $(".share_dependent_block input, .share_dependent_block select").prop("disabled",false);   
        }
        else
        {
            $(".share_dependent_block input, .share_dependent_block select").prop("disabled",true);   
        }
    }
 );
});
Er.gaurav soni
fuente
3

Este fue el único código que funcionó para mí:

element.removeProp('disabled')

Tenga en cuenta que es removePropy no removeAttr.

Estoy usando jQuery 2.1.3aqui

Leniel Maccaferri
fuente
12
De la documentación de jQuery: Importante: el método .removeProp () no debe usarse para establecer estas propiedades en falso. Una vez que se elimina una propiedad nativa, no se puede agregar nuevamente. Ver .removeProp () para más información.
XanatosLightfiren
2

2018, sin JQuery

Sé que la pregunta es sobre JQuery: esta respuesta es solo para su información.

document.getElementById('edit').addEventListener(event => {
    event.preventDefault();
    [...document.querySelectorAll('.inputDisabled')].map(e => e.disabled = false);
}); 
rap-2-h
fuente
0

Esta pregunta menciona específicamente jQuery, pero si está buscando lograr esto sin jQuery, el equivalente en JavaScript vainilla es:

elem.removeAttribute('disabled');
jdgregson
fuente
elem.removeAttr('disabled');funciona para mí
Cheng Hui Yuan