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.

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

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

ou

$("input")[0].disabled = false;
Sajjad Shirazy
fonte
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();
Nicu Surdu
fonte
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') );
daVe
fonte
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.

codificador selvagem
fonte
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);
Pawel
fonte
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>
ESPARTANO
fonte
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.
Tomer Ben David
fonte
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);
Hasib Kamal
fonte
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);
learnkevin
fonte
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);
Imants Volkovs
fonte
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.

rap-2-h
fonte
0

Use assim,

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

 $( "#id" ).prop( "disabled", false );
Abdus Salam Azad
fonte
-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>

fonte
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');
Atif Hussain
fonte