2011-01-15 10 views
143

Ecco il mio codice:Toggle ingresso disattivato attributo utilizzando jQuery

$("#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 faccio toggle .attr('disabled',false);?

Non riesco a trovarlo su Google.

+0

Qual è il motivo per cui non è possibile utilizzare la proprietà disattivato del campo? '$ (" input "). get (0) .disabled = isFalse;' // http://jsfiddle.net/uAfhj/ – Shanimal

+0

Ho trovato [DependsOn] (https://github.com/dstreet/dependsOn) plugin che potresti trovare utile – Ben

risposta

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

Il metodo .prop() accetta due argomenti:

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

Quindi, in questo caso, ho usato una funzione che mi ha fornito l'indice (i) e il valore corrente (v), poi sono tornato l'opposto del valore corrente, in modo che il demanio è invertito .

+3

Grazie-ha lavorato per me. – DanielOlivasJr

+3

Perfetto e semplice! – Mafia

+2

Votato come (credo) .prop() è il modo corretto per farlo ed è stato aggiunto con precisione allo scopo di impostare cose come disabled = "disabled" + il suo elegante – Morvael

1

questo è abbastanza semplice, con la sintassi richiamata 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 
}); 
98

mi immagino per ottenere completa del browser comparabilità disabled deve essere impostato con il valore disabled o ottenere rimosso!
Ecco un piccolo plugin che ho appena fatto:

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

Example link.

MODIFICA: aggiornato il collegamento/codice di esempio per mantenere la catena!
EDIT 2:
Sulla base di commento @lonesomeday, ecco una versione migliorata:

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

Grazie, questo è esattamente quello che stavo cercando –

+26

Questo potrebbe funzionare, ma sarà lento, perché creerai costantemente nuovi oggetti jQuery. '$ .fn.toggleDisabled = function() {return this.each (function() {this.disabled =! this.disabled;});}' è tutto ciò che serve. – lonesomeday

+0

@lonesomeday: stavo per postare questo messaggio ma * tendenzialmente * penso che questo non sia il modo corretto per impostare/annullare l'attributo 'disabled'. Ad ogni modo, se puoi confermare che si tratta di una soluzione cross-browser, aggiornerò la mia risposta. – ifaour

15
 

    $('#checkbox').click(function(){ 
     $('#submit').attr('disabled', !$(this).attr('checked')); 
    }); 

+2

Nota: funziona solo sotto jQuery 1.6. Usa .prop() invece di attr() su entrambe le occorrenze per recuperare i valori booleani. Vedi http://api.jquery.com/prop/ –

2

un bel po 'più tardi, e grazie a @arne, ho creato questa piccola funzione simile per gestire, dove l'ingresso dovrebbe essere disattivata e nascosta, o attivato e mostrati:

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

Poi un jQuery oggetto (ad esempio $ ('ingresso [name = 'qualcosa']')) è semplicemente acceso utilizzando:

toggleInputState(myElement, myBoolean) 
1

un altro semplice opzione che gli aggiornamenti su 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

+0

Elimina il blocco 'if' con' $ ('# item'). Prop ('disabled', this.checked); ' –

Problemi correlati