2011-01-15 14 views
143

Oto mój kod:Przełącz wejście nieaktywne atrybut przy użyciu 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. 
}); 

Jak mogę przełączyć .attr('disabled',false);?

Nie mogę znaleźć tego w Google.

+0

Każdy powód, dlaczego nie można użyć właściwości wyłączoną pola? '$ (" input "). get (0) .disabled = isFalse;' // http://jsfiddle.net/uAfhj/ – Shanimal

+0

Znalazłem [DependsOn] (https://github.com/dstreet/dependsOn) wtyczka, która może ci się przydać – Ben

Odpowiedz

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

Sposób .prop() przyjmuje dwa argumenty:

  • Property nazw (wyłączona, włączona, wybrane) wszystko, co jest prawdziwe lub fałszywe
  • Właściwość wartość, może być:
    • (pusta) - zwraca bieżącą wartość.
    • boolean (true/false) - ustawia wartość właściwości.
    • funkcja - Jest wykonywana dla każdego znalezionego elementu, zwrócona wartość służy do ustawiania właściwości. Istnieją dwa argumenty; pierwszym argumentem jest indeks (0, 1, 2, wzrosty dla każdego znalezionego elementu). Drugi argument to aktualna wartość elementu (true/false).

Więc w tym przypadku użyłem funkcji, które dostarczył mi indeks (I) i bieżącą wartość (v), po czym wróciłem przeciwieństwo wartości bieżącej, więc stan nieruchomość jest odwrócony .

+3

Dziękuję, pracowałeś dla mnie. – DanielOlivasJr

+3

Idealne i proste! – Mafia

+2

Wycofany (jak sądzę) .prop() jest prawidłowym sposobem, aby to zrobić i został dodany właśnie w celu ustawienia takich rzeczy jak disabled = "disabled" + jego elegancka – Morvael

1

Jest to dość proste ze składnią zwrotnego z 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

Chyba aby uzyskać pełną porównywalność przeglądarka disabled należy ustawić przez wartość disabled lub zostaną usunięte!
Oto mały plugin, że właśnie popełnił:

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

EDYCJA: zaktualizowano przykładowy link/kod w celu zachowania łańcucha!
EDIT 2:
podstawie @lonesomeday komentarzu, oto udoskonalona wersja:

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

Dzięki, to jest dokładnie to, czego szukałem. –

+26

To może działać, ale będzie wolno, bo ciągle tworzysz nowe obiekty jQuery. '$ .fn.toggleDisabled = function() {return this.each (function() {this.disabled =! this.disabled;});}' to wszystko, czego potrzebujesz. – lonesomeday

+0

@lonesomeday: Zamierzałem to opublikować, ale mam * tendencję * do myślenia, że ​​nie jest to właściwy sposób ustawiania/anulowania atrybutu 'disabled'. W każdym razie, jeśli możesz potwierdzić, że jest to rozwiązanie oparte na różnych przeglądarkach. Zaktualizuję moją odpowiedź. – ifaour

15
 

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

+2

Uwaga: działa tylko pod jQuery 1.6. Użyj .prop() zamiast attr() na obu wystąpieniach, aby odzyskać wartości boolowskie. Zobacz http://api.jquery.com/prop/ –

2

dłuższą chwilę później, a dzięki @arne, stworzyłem tę funkcję podobną małą obsłużyć gdzie wejście powinno być wyłączone i ukryte, czy włączone i pokazane:

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

Następnie jQuery obiekt (takich jak $ („input [name =«coś»]”)) jest po prostu włączane za pomocą:

toggleInputState(myElement, myBoolean) 
1

Innym prostym rozwiązaniem, które aktualizacje na jednym kliknięciem pola wyboru.

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

w akcji: link

+0

Pozbądź się bloku 'if' z' $ ('# item') .project ("disabled", this.checked); ' –

Powiązane problemy