Alternar atributo desativado de entrada usando jQuery

189

Aqui está o meu código:

$("#product1 :checkbox").click(function(){
    $(this)
        .closest('tr') // Find the parent row.
            .find(":input[type='text']") // Find text elements in that row.
                .attr('disabled',false).toggleClass('disabled') // Enable them.
                .end() // Go back to the row.
            .siblings() // Get its siblings
                .find(":input[type='text']") // Find text elements in those rows.
                .attr('disabled',true).removeClass('disabled'); // Disable them.
});

Como alterno .attr('disabled',false);?

Não consigo encontrá-lo no Google.

Tommy Arnold
fonte
Alguma razão para você não poder usar a propriedade desativada do campo? $("input").get(0).disabled = isFalse;// jsfiddle.net/uAfhj
Shanimal
Achei o DependsOn plugin que você pode achar útil
Onshop

Respostas:

443
$('#el').prop('disabled', function(i, v) { return !v; });

O .prop()método aceita dois argumentos:

  • Nome da propriedade (desativado, marcado, selecionado) qualquer coisa que seja verdadeira ou falsa
  • O valor da propriedade pode ser:
    • ( vazio ) - retorna o valor atual.
    • booleano (verdadeiro / falso) - define o valor da propriedade.
    • function - É executado para cada elemento encontrado, o valor retornado é usado para definir a propriedade. Há dois argumentos passados; o primeiro argumento é o índice (0, 1, 2, aumenta para cada elemento encontrado). O segundo argumento é o valor atual do elemento (verdadeiro / falso).

Portanto, neste caso, usei uma função que me forneceu o índice (i) e o valor atual (v), depois retornei o oposto do valor atual, para que o estado da propriedade fosse revertido.

Arne
fonte
2
Upvoted como (creio eu) .prop () é a maneira correta de fazer isso e foi adicionado precisamente com o objectivo de definir coisas como disabled = "desativado" + seu elegante
Morvael
5
O que é ie v?
Matt R
@MattR Adicionei uma breve explicação.
Arne
Esta é uma ótima resposta!
LeBlaireau
6
Como uma atualização, isso parece muito arrumado usando seta funções:$('#el').prop('disabled', (i, v) => !v);
igneosaur
101

Eu acho que para obter a comparabilidade total do navegador disabled, defina o valor disabledou seja removido!
Aqui está um pequeno plugin que eu acabei de criar:

(function($) {
    $.fn.toggleDisabled = function() {
        return this.each(function() {
            var $this = $(this);
            if ($this.attr('disabled')) $this.removeAttr('disabled');
            else $this.attr('disabled', 'disabled');
        });
    };
})(jQuery);

Link de exemplo .

EDIT: atualizado o link / código de exemplo para manter a capacidade de cadeia!
EDIT 2:
Com base no comentário @lonesomeday, aqui está uma versão aprimorada:

(function($) {
    $.fn.toggleDisabled = function(){
        return this.each(function(){
            this.disabled = !this.disabled;
        });
    };
})(jQuery);
ifaour
fonte
28
Isso pode funcionar, mas será lento, porque você está constantemente criando novos objetos jQuery. $.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });}é tudo o que você precisa.
Loneomeday
@lonesomeday: Eu ia postar isso, mas eu costumo pensar que essa não é a maneira correta de definir / desabilitar o disabledatributo. De qualquer forma, se você puder confirmar que esta é uma solução entre navegadores, atualizarei minha resposta.
fácil
2
Para futuros googlers, essa solução funciona igualmente bem para o atributo 'obrigatório'.
skybondsor
propé o melhor método desde a versão 1.6, como dito por Arne.
Ciro Santilli escreveu:
19
    $ ('# checkbox'). click (function () {
        $ ('# envio'). attr ('desabilitado',! $ (this) .attr ('marcado'));
    });

Присяжный Дмитрий
fonte
2
Nota: funciona apenas abaixo do jQuery 1.6. Use .prop () em vez de attr () nas duas ocorrências para recuperar os valores booleanos. Veja api.jquery.com/prop
Manuel Arwed Schmidt
5

Outra opção simples que é atualizada com um clique da caixa de seleção.

HTML:

<input type="checkbox" id="checkbox/>
<input disabled type="submit" id="item"/>

jQuery:

$('#checkbox').click(function() {
    if (this.checked) {
        $('#item').prop('disabled', false); // If checked enable item       
    } else {
        $('#item').prop('disabled', true); // If checked disable item                   
    }
});

Em ação: link

desigual
fonte
6
Livre-se do ifbloco com$('#item').prop('disabled', this.checked);
Naeem Sarfraz
2

Um pouco mais tarde, e graças a @arne, criei essa pequena função semelhante para manipular onde a entrada deve ser desativada E oculta ou ativada E mostrada:

function toggleInputState(el, on) {
  // 'on' = true(visible) or false(hidden)
  // If a field is to be shown, enable it; if hidden, disable it.
  // Disabling will prevent the field's value from being submitted
  $(el).prop('disabled', !on).toggle(on);
}

Então um objeto jQuery (como $ ('input [name = "something"]')) é simplesmente alternado usando:

toggleInputState(myElement, myBoolean)
eon
fonte
1

Isso é bastante simples com a sintaxe de retorno de chamada de attr:

$("#product1 :checkbox").click(function(){
  $(this)
   .closest('tr') // find the parent row
       .find(":input[type='text']") // find text elements in that row
           .attr('disabled',function(idx, oldAttr) {
               return !oldAttr; // invert disabled value
           })
           .toggleClass('disabled') // enable them
       .end() // go back to the row
       .siblings() // get its siblings
           .find(":input[type='text']") // find text elements in those rows
               .attr('disabled',function(idx, oldAttr) {
                   return !oldAttr; // invert disabled value
               })
               .removeClass('disabled'); // disable them
});
lonesomeday
fonte