¿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


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');   
});

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


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

o

$("input")[0].disabled = false;

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();

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') );

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.


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);

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>

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.

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);

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);

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);

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.




-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>

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');
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.