¿Deshabilitar / habilitar una entrada con jQuery?

Respuestas:

3810

jQuery 1.6+

Para cambiar la disabledpropiedad, debe usar la .prop()función.

$("input").prop('disabled', true);
$("input").prop('disabled', false);

jQuery 1.5 y abajo

La .prop()función no existe, pero .attr()es similar:

Establecer el atributo deshabilitado.

$("input").attr('disabled','disabled');

Para habilitar nuevamente, el método apropiado es usar .removeAttr()

$("input").removeAttr('disabled');

En cualquier versión de jQuery

Siempre puede confiar en el objeto DOM real y probablemente sea un poco más rápido que las otras dos opciones si solo se trata de un elemento:

// assuming an event handler thus 'this'
this.disabled = true;

La ventaja de utilizar los métodos .prop()o .attr()es que puede establecer la propiedad para un grupo de elementos seleccionados.


Nota: En 1.6 hay un .removeProp()método que se parece mucho removeAttr(), pero NO DEBE SER USADO en propiedades nativas como 'disabled' Extracto de la documentación:

Nota: No use este método para eliminar propiedades nativas como marcadas, deshabilitadas o seleccionadas. Esto eliminará la propiedad por completo y, una vez eliminada, no se puede volver a agregar al elemento. Utilice .prop () para establecer estas propiedades en falso en su lugar.

De hecho, dudo que haya muchos usos legítimos para este método, los accesorios booleanos se realizan de tal manera que debería establecerlos en falso en lugar de "eliminarlos" como sus contrapartes de "atributo" en 1.5

Gnarf
fuente
99
Por otro lado, recuerde que si desea deshabilitar TODOS los controles de entrada de formulario, incl. casillas de verificación, radios, áreas de texto, etc., debe seleccionar ':input', no solo 'input'. Este último selecciona solo elementos <input> reales.
Cornel Masson
35
@CornelMasson input,textarea,select,buttones un poco mejor de usar que :input, :inputya que un selector es bastante ineficiente porque tiene que seleccionar, *luego recorrer cada elemento y filtrar por nombre de etiqueta, si pasa los 4 selectores de nombre de etiqueta directamente, es MUCHO más rápido. Además, :inputno es un selector CSS estándar, por lo que cualquier beneficio de rendimiento que son posibles a partir querySelectorAllson perdidos
gnarf
3
¿Esto simplemente impide que el usuario acceda a él o lo elimina realmente de la solicitud web?
OneChillDude
44
El uso de .removeProp("disabled")estaba causando el problema de "la propiedad se elimina por completo y no se agrega nuevamente", como señaló @ThomasDavidBaker, en el caso de algunos navegadores como Chrome, mientras que funcionaba bien en algunos como Firefox. Realmente deberíamos tener cuidado aquí. Siempre use .prop("disabled",false)en su lugar
Sandeepan Nath
66
Ni .prop ni .attr son suficientes para deshabilitar elementos de anclaje; .prop ni siquiera atenuará el 'control' (.attr sí, pero href todavía está activo). También debe agregar un controlador de eventos de clic que llame a preventDefault ().
Jeff Lowery
61

Solo por las nuevas convenciones && haciéndolo adaptable en el futuro (a menos que las cosas cambien drásticamente con ECMA6 (????):

$(document).on('event_name', '#your_id', function() {
    $(this).removeAttr('disabled');
});

y

$(document).off('event_name', '#your_id', function() {
    $(this).attr('disabled','disabled');   
});
geekbuntu
fuente
12
¡Chistes! ¿Por qué en $(document).on('event_name', '#your_id', function() {...})lugar de $('#your_id').on('event_name', function() {...})? Como se describe en la documentación de jQuery .on (), el primero usa la delegación y escucha todos los event_name eventos que surgen documenty comprueba que coincidan #your_id. Este último escucha específicamente $('#your_id')eventos solamente y eso se escala mejor.
Peter V. Mørch
23
El primero funciona para elementos insertados en el DOM en cualquier momento, el último solo para aquellos existentes en ese momento.
crazymykl
1
@crazymykl Correcto, pero no debe agregar elementos con una identificación ya presente en su página.
SepehrM
33
    // Disable #x
    $( "#x" ).prop( "disabled", true );
    // Enable #x
    $( "#x" ).prop( "disabled", false );

A veces necesita deshabilitar / habilitar el elemento de formulario como input o textarea Jquery te ayuda a hacer esto fácilmente con la configuración del atributo desactivado en "desactivado". Por ejemplo:

  //To disable 
  $('.someElement').attr('disabled', 'disabled');

Para habilitar el elemento deshabilitado debe eliminar el atributo "deshabilitado" de este elemento o vaciar su cadena. Por ejemplo:

//To enable 
$('.someElement').removeAttr('disabled');

// OR you can set attr to "" 
$('.someElement').attr('disabled', '');

consulte: http://garmoncheg.blogspot.fr/2011/07/how-to-disableenable-element-with.html

Harini Sekar
fuente
13
$("input")[0].disabled = true;

o

$("input")[0].disabled = false;
Sajjad Shirazy
fuente
2
Por supuesto, la pregunta pedía jQuery y esto está cambiando el estado en JavaScript simple, pero funciona.
básico6
1
Esto cambia el estado en JavaScript, pero aún utiliza un selector jQuery para obtener la primera entrada.
cjsimon
3
Pero no creo que estemos haciendo una enciclopedia de jquery aquí, si una respuesta funciona, está bien
Sajjad Shirazy
8

Puede poner esto en algún lugar global en su código:

$.prototype.enable = function () {
    $.each(this, function (index, el) {
        $(el).removeAttr('disabled');
    });
}

$.prototype.disable = function () {
    $.each(this, function (index, el) {
        $(el).attr('disabled', 'disabled');
    });
}

Y luego puedes escribir cosas como:

$(".myInputs").enable();
$("#otherInput").disable();
Nicu Surdu
fuente
3
Si bien la funcionalidad de ajuste es útil, debería haber utilizado propy no attr con la disabledpropiedad para que funcione correctamente (suponiendo que jQuery 1.6 o superior).
Se fue la codificación
1
@TrueBlueAussie ¿Cuál es la desventaja de usar attr? Utilizo el código anterior en algunos proyectos y, por lo que recuerdo, funciona bien
Nicu Surdu
1
Las excepciones obvias son los controles con propiedades detrás de escena. El más famoso es checkedpropiedad de casillas de verificación. Usar attrno dará el mismo resultado.
Gone Coding
7

Si solo desea invertir el estado actual (como el comportamiento de un botón de alternar):

$("input").prop('disabled', ! $("input").prop('disabled') );
dave
fuente
1
gracias tengo lo mismo por la palanca que es; $ ("input"). prop ('disabled', function (i, v) {return! v;});
Floww
5

Hay muchas formas de usarlos: puede habilitar / deshabilitar cualquier elemento :

Enfoque 1

$("#txtName").attr("disabled", true);

Enfoque 2

$("#txtName").attr("disabled", "disabled");

Si está utilizando jQuery 1.7 o una versión superior, use prop (), en lugar de attr ().

$("#txtName").prop("disabled", "disabled");

Si desea habilitar cualquier elemento, solo tiene que hacer lo contrario de lo que hizo para que se desactive. Sin embargo, jQuery proporciona otra forma de eliminar cualquier atributo.

Enfoque 1

$("#txtName").attr("disabled", false);

Enfoque 2

$("#txtName").attr("disabled", "");

Enfoque 3

$("#txtName").removeAttr("disabled");

Nuevamente, si está utilizando jQuery 1.7 o una versión superior, use prop (), en lugar de attr (). Esto es. Así es como habilita o deshabilita cualquier elemento usando jQuery.

codificador salvaje
fuente
2

Actualización para 2018:

Ahora no hay necesidad de jQuery y que ha sido un tiempo desde document.querySelector o document.querySelectorAll(para múltiples elementos) hacer casi exactamente el mismo trabajo como $, además de los más explícitos getElementById, getElementsByClassName,getElementsByTagName

Deshabilitar un campo de la clase "input-checkbox"

document.querySelector('.input-checkbox').disabled = true;

o elementos múltiples

document.querySelectorAll('.input-checkbox').forEach(el => el.disabled = true);
Pawel
fuente
1
la pregunta se refiere específicamente a jQuery ... pero igualmente su declaración es correcta, y vale la pena saber que jQuery ya no necesita usarse para esto cuando ya hay múltiples elementos.
ADyson
2

Puede usar el método jQuery prop () para deshabilitar o habilitar el elemento de formulario o controlar dinámicamente usando jQuery. El método prop () requiere jQuery 1.6 y superior.

Ejemplo:

<script type="text/javascript">
        $(document).ready(function(){
            $('form input[type="submit"]').prop("disabled", true);
            $(".agree").click(function(){
                if($(this).prop("checked") == true){
                    $('form input[type="submit"]').prop("disabled", false);
                }
                else if($(this).prop("checked") == false){
                    $('form input[type="submit"]').prop("disabled", true);
                }
            });
        });
    </script>
ESPARTANO
fuente
1

Inhabilitar:

$('input').attr('readonly', true); // Disable it.
$('input').addClass('text-muted'); // Gray it out with bootstrap.

Habilitar:

$('input').attr('readonly', false); // Enable it.
$('input').removeClass('text-muted'); // Back to normal color with bootstrap.
Tomer Ben David
fuente
1

Desactivar verdadero para el tipo de entrada:

En caso de un tipo de entrada específico ( Ej. Entrada de tipo de texto )

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

Para todo tipo de entrada

$("input").attr('disabled', true);
Hasib Kamal
fuente
1
Gracias, esto me ayudó a aislar a un nombre de entrada. $("input[name=method]").prop('disabled', true);
Harry Bosh el
1

esto funciona para mi

$("#values:input").attr("disabled",true);
$("#values:input").attr("disabled",false);
aprenderkevin
fuente
0

Usé @gnarf answer y lo agregué como función

   $.fn.disabled = function (isDisabled) {
     if (isDisabled) {
       this.attr('disabled', 'disabled');
     } else {
       this.removeAttr('disabled');
     }
   };

Luego usa así

$('#myElement').disable(true);
Imants Volkovs
fuente
0

2018, sin JQuery (ES6)

Deshabilitar todo input:

[...document.querySelectorAll('input')].map(e => e.disabled = true);

Deshabilitar inputconid="my-input"

document.getElementById('my-input').disabled = true;

La pregunta es con JQuery, es solo para su información.

rap-2-h
fuente
0

Usar así,

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

 $( "#id" ).prop( "disabled", false );
Abdus Salam Azad
fuente
-1
<html>
<body>

Name: <input type="text" id="myText">



<button onclick="disable()">Disable Text field</button>
<button onclick="enable()">Enable Text field</button>

<script>
function disable() {
    document.getElementById("myText").disabled = true;
}
function enable() {
    document.getElementById("myText").disabled = false;
}
</script>

</body>
</html>

fuente
1
De la cola de revisión : ¿Puedo solicitarle que agregue un poco más de contexto alrededor de su respuesta? Las respuestas de solo código son difíciles de entender. Ayudará tanto al autor de la pregunta como a los futuros lectores si puede agregar más información en su publicación.
RBT
-1

En jQuery Mobile:

Para deshabilitar

$('#someselectElement').selectmenu().selectmenu('disable').selectmenu('refresh', true);
$('#someTextElement').textinput().textinput('disable');

Para habilitar

$('#someselectElement').selectmenu().selectmenu('enable').selectmenu('refresh', true);
$('#someTextElement').textinput('enable');
Atif Hussain
fuente