Attiva / disattiva l'attributo di input disabilitato utilizzando jQuery


191

Ecco il mio codice:

$("#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.
});

Come si attiva / disattiva .attr('disabled',false);?

Non riesco a trovarlo su Google.


Qual è il motivo per cui non puoi utilizzare la proprietà disabilitata del campo? $("input").get(0).disabled = isFalse;// jsfiddle.net/uAfhj
Shanimal

Ho trovato il plugin DependsOn che potresti trovare utile
Onshop il

Risposte:


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

Il .prop()metodo accetta due argomenti:

  • Nome della proprietà (disabilitato, selezionato, selezionato) tutto ciò che è vero o falso
  • Il valore della proprietà può essere:
    • ( vuoto ) - restituisce il valore corrente.
    • booleano (vero / falso) - imposta il valore della proprietà.
    • funzione : viene eseguita per ogni elemento trovato, il valore restituito viene utilizzato per impostare la proprietà. Sono passati due argomenti; il primo argomento è l' indice (0, 1, 2, aumenta per ogni elemento trovato). Il secondo argomento è il valore corrente dell'elemento (vero / falso).

Quindi, in questo caso, ho usato una funzione che mi ha fornito l'indice (i) e il valore corrente (v), quindi ho restituito l'opposto del valore corrente, quindi lo stato della proprietà è invertito.


2
Votato come (credo) .prop () è il modo corretto per farlo ed è stato aggiunto proprio allo scopo di impostare cose come disabili = "disabili" + è elegante
Morvael

5
Che cos'è ie v?
Matt R

@MattR Ho aggiunto una breve spiegazione.
Arne,

questa è un'ottima risposta!
LeBlaireau,

6
Come aggiornamento, sembra molto pulito usando le funzioni freccia:$('#el').prop('disabled', (i, v) => !v);
igneosaur,

101

Mi immagino che per ottenere la piena comparabilità del browser disableddovrebbe fissare per il valore disabledo ottenere rimosso!
Ecco un piccolo plugin che ho appena creato:

(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 di esempio .

EDIT: aggiornato il link / codice di esempio per mantenere la catenabilità!
EDIT 2:
basato sul commento di @lonesomeday, ecco una versione migliorata:

(function($) {
    $.fn.toggleDisabled = function(){
        return this.each(function(){
            this.disabled = !this.disabled;
        });
    };
})(jQuery);

28
Potrebbe funzionare, ma sarà lento, perché crei costantemente nuovi oggetti jQuery. $.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });}é tutto quello di cui hai bisogno.
lunedì

@lonesomeday: stavo per pubblicare questo, ma tendo a pensare che questo non sia il modo corretto di impostare / disinserire l' disabledattributo. Ad ogni modo, se puoi confermare che si tratta di una soluzione cross-browser, aggiornerò la mia risposta.
ifaour,

2
Per eventuali googler futuri, questa soluzione funziona ugualmente bene per l'attributo "richiesto".
skybondsor,

propè il metodo migliore dall'1.6, come afferma Arne.
Ciro Santilli 5 冠状 病 六四 事件 法轮功


5

Un'altra semplice opzione che si aggiorna con un clic della casella di controllo.

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

In azione: link


7
Sbarazzati del ifblocco con$('#item').prop('disabled', this.checked);
Naeem Sarfraz il

2

Poco dopo, e grazie a @arne, ho creato questa piccola funzione simile per gestire dove l'input deve essere disabilitato E nascosto, o abilitato E mostrato:

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

Quindi un oggetto jQuery (come $ ('input [name = "qualcosa"]')) viene semplicemente cambiato usando:

toggleInputState(myElement, myBoolean)

1

Questo è abbastanza semplice con la sintassi di callback di 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
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.