Desativar / ativar uma entrada com jQuery?


Respostas:


3810

jQuery 1.6+

Para alterar a disabledpropriedade, você deve usar a .prop()função

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

jQuery 1.5 e abaixo

A .prop()função não existe, mas .attr()é semelhante:

Defina o atributo desativado.

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

Para ativar novamente, o método adequado é usar .removeAttr()

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

Em qualquer versão do jQuery

Você sempre pode confiar no objeto DOM real e provavelmente é um pouco mais rápido que as outras duas opções se estiver lidando apenas com um elemento:

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

A vantagem de usar os métodos .prop()ou .attr()é que você pode definir a propriedade para vários itens selecionados.


Nota: Na versão 1.6, existe um .removeProp()método que se parece muito removeAttr(), mas NÃO DEVE SER USADO em propriedades nativas como o 'disabled' trecho da documentação:

Nota: Não use este método para remover propriedades nativas como marcada, desativada ou selecionada. Isso removerá a propriedade completamente e, uma vez removida, não poderá ser adicionada novamente ao elemento. Use .prop () para definir essas propriedades como false.

Na verdade, duvido que haja muitos usos legítimos para esse método, adereços booleanos são feitos de tal maneira que você deve configurá-los para false em vez de "removê-los" como seus equivalentes "atributo" na versão 1.5.


9
Como um aparte, lembre-se de que, se você deseja desativar TODOS os controles de entrada de formulário - incl. caixas de seleção, rádios, áreas de texto etc. - você precisa selecionar ':input', não apenas 'input'. O último seleciona apenas elementos <input> reais.
Cornel Masson

35
O @CornelMasson input,textarea,select,buttoné um pouco melhor de usar do que :input- :inputcomo um seletor é bastante ineficiente porque ele precisa selecionar um *loop sobre cada elemento e filtrar por tagname - se você passar os 4 seletores de tagname diretamente, será MUITO mais rápido. Além disso, :inputnão é um seletor CSS padrão, então os ganhos de desempenho que são possíveis de querySelectorAllse perdeu
gnarf

3
Isso apenas impede o usuário de acessá-lo ou realmente o remove da solicitação da web?
OneChillDude

4
O uso do .removeProp("disabled")estava causando o problema de "propriedade sendo removida completamente e não sendo adicionada novamente", como apontado por @ThomasDavidBaker, no caso de alguns navegadores como o Chrome, enquanto estava funcionando bem em alguns como o Firefox. Deveríamos realmente ter cuidado aqui. Sempre use em .prop("disabled",false)vez disso
Sandeepan Nath

6
Nem .prop ou .attr são suficientes para desativar elementos âncora; .prop nem acinzentará o 'controle' (.attr sim, mas o href ainda está ativo). Você também deve adicionar um manipulador de eventos de clique que chama preventDefault ().
Jeff Lowery

61

Apenas para novas convenções e para torná-lo adaptável no futuro (a menos que as coisas mudem drasticamente com o ECMA6 (????)):

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

e

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

12
Jikes! Por que ao $(document).on('event_name', '#your_id', function() {...})invés de $('#your_id').on('event_name', function() {...}). Conforme descrito na documentação do jQuery .on (), o primeiro usa a delegação e escuta todos os event_name eventos que chegam à bolha documente verifica se há uma correspondência #your_id. O último ouve especificamente $('#your_id')apenas os eventos e isso escala melhor.
Peter V. Mørch 31/07

23
O primeiro funciona para elementos inseridos no DOM a qualquer momento, o último apenas para os existentes naquele momento.
22613 crazymykl

1
@crazymykl Correto, mas você não deve adicionar elementos com um ID já presente em sua página.
SepehrM

33
    // Disable #x
    $( "#x" ).prop( "disabled", true );
    // Enable #x
    $( "#x" ).prop( "disabled", false );

Às vezes, você precisa desativar / ativar o elemento do formulário, como entrada ou área de texto. O Jquery ajuda você a fazer isso facilmente com a configuração do atributo desativado como "desativado". Por exemplo:

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

Para habilitar o elemento desativado, você precisa remover o atributo "disabled" desse elemento ou esvaziar sua string. Por exemplo:

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

ou

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

2
Claro que a pergunta foi feita pelo jQuery e isso está mudando o estado no JavaScript simples, mas funciona.
usar o seguinte comando

1
Isso altera o estado do JavaScript, mas ainda usa um seletor de jQuery para obter a primeira entrada.
Cjsimon #

3
Mas eu não acho que nós estamos fazendo enciclopédia do jQuery aqui, se uma resposta funciona, é bom
Sajjad Shirazy

8

Você pode colocar isso em algum lugar global no seu 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');
    });
}

E então você pode escrever coisas como:

$(".myInputs").enable();
$("#otherInput").disable();

3
Embora a disposição da funcionalidade seja útil, você deve ter usado prope não attr a disabledpropriedade para que ela funcione corretamente (assumindo o jQuery 1.6 ou superior).
Gone Coding

1
@TrueBlueAussie Qual é a desvantagem de usar attr? Eu uso o código acima em alguns projetos e, tanto quanto eu me lembro ele funciona ok
Nicu Surdu

1
As exceções óbvias são controles com propriedades nos bastidores. O mais famoso é a checkedpropriedade de caixas de seleção. Usar attrnão dará o mesmo resultado.
Gone Coding

7

Se você deseja apenas inverter o estado atual (como o comportamento de um botão de alternância):

$("input").prop('disabled', ! $("input").prop('disabled') );

1
obrigado, tenho a mesma coisa pela alternância; $ ("input"). prop ('desativado', function (i, v) {return! v;});
Floww

5

Existem várias maneiras de usá-los. Você pode ativar / desativar qualquer elemento :

Abordagem 1

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

Abordagem 2

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

Se você estiver usando o jQuery 1.7 ou versão superior, use prop (), em vez de attr ().

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

Se você deseja ativar qualquer elemento, basta fazer o oposto do que você fez para desativá-lo. No entanto, o jQuery fornece outra maneira de remover qualquer atributo.

Abordagem 1

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

Abordagem 2

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

Abordagem 3

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

Novamente, se você estiver usando o jQuery 1.7 ou versão superior, use prop (), em vez de attr (). Isso é. É assim que você ativa ou desativa qualquer elemento usando o jQuery.


2

Atualização para 2018:

Agora não há necessidade de jQuery e tem sido um tempo desde que document.querySelector ou document.querySelectorAll(de vários elementos) fazer quase exatamente o mesmo trabalho como $, mais os mais explícitos getElementById, getElementsByClassName,getElementsByTagName

Desativando um campo da classe "input-checkbox"

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

ou vários elementos

document.querySelectorAll('.input-checkbox').forEach(el => el.disabled = true);

1
a pergunta é específica sobre jQuery ... mas igualmente sua declaração está correta e vale a pena saber que o jQuery não precisa ser usado para isso quando houver mais vários elementos.
Adyson

2

Você pode usar o método jQuery prop () para desativar ou ativar o elemento do formulário ou controlar dinamicamente usando o jQuery. O método prop () requer o jQuery 1.6 e superior.

Exemplo:

<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

Desativar:

$('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

Desative true para o tipo de entrada:

No caso de um tipo de entrada específico (por exemplo, entrada de tipo de texto )

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

Para todo tipo de entrada

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

1
Graças isso me ajudou a isolar um nome de entrada. $("input[name=method]").prop('disabled', true);
Harry Bosh

1

isso funciona para mim

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

0

Eu usei a resposta @gnarf e a adicionei como função

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

Então use assim

$('#myElement').disable(true);

0

2018, sem JQuery (ES6)

Desativar tudo input:

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

Desativar inputcomid="my-input"

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

A questão é com JQuery, é apenas para sua informação.



0

Use assim,

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

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

-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
Da fila de revisão : posso solicitar que você adicione um pouco mais de contexto à sua resposta. As respostas somente de código são difíceis de entender. Isso ajudará os solicitantes e futuros leitores, se você puder adicionar mais informações em sua postagem.
RBT

-1

No jQuery Mobile:

Para desativar

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

Para ativar

$('#someselectElement').selectmenu().selectmenu('enable').selectmenu('refresh', true);
$('#someTextElement').textinput('enable');
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.