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.


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.


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

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:


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


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)

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