Przełącz wyłączony atrybut wejściowy za pomocą jQuery


191

Oto mój kod:

$("#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 przełączać .attr('disabled',false);?

Nie mogę znaleźć tego w Google.


Czy jest jakiś powód, dla którego nie można użyć wyłączonej właściwości pola? $("input").get(0).disabled = isFalse;// jsfiddle.net/uAfhj
Shanimal

Znalazłem wtyczkę DependsOn, która może Ci się przydać
Onshop

Odpowiedzi:


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

.prop()Sposób przyjmuje dwa argumenty

  • Nazwa właściwości (wyłączona, zaznaczona, wybrana) wszystko, co jest prawdziwe lub fałszywe
  • Wartość nieruchomości może być:
    • ( pusty ) - zwraca bieżącą wartość.
    • boolean (true / false) - ustawia wartość właściwości.
    • funkcja - jest wykonywana dla każdego znalezionego elementu, zwracana wartość służy do ustawienia właściwości. Przekazano dwa argumenty; pierwszym argumentem jest indeks (0, 1, 2, wzrost dla każdego znalezionego elementu). Drugi argument to bieżąca wartość elementu (prawda / fałsz).

Więc w tym przypadku użyłem funkcji, która dostarczyła mi indeks (i) i bieżącą wartość (v), a następnie zwróciłem przeciwieństwo bieżącej wartości, więc stan właściwości jest odwrócony.


2
Upvoted jako (uważam) .prop () jest prawidłowym sposobem na zrobienie tego i został dodany właśnie w celu ustawienia rzeczy takich jak disabled = "disabled" + jego elegancki
Morvael 30.08.2013

5
Co to jest ii v?
Matt R

@MattR Dodałem krótkie wyjaśnienie.
Arne

to świetna odpowiedź!
LeBlaireau

6
Jako aktualizacja wygląda to bardzo schludnie przy użyciu funkcji strzałek:$('#el').prop('disabled', (i, v) => !v);
igneozaur

101

Myślę, że aby uzyskać pełną porównywalność przeglądarki, disablednależy ustawić wartość disabledlub usunąć!
Oto mała wtyczka, którą właśnie stworzyłem:

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

Przykładowy link .

EDYCJA: zaktualizowano przykładowy link / kod, aby zachować łańcuchowość!
EDYCJA 2:
Na podstawie komentarza @lonesomeday, oto ulepszona wersja:

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

28
Może to działać, ale będzie działać powoli, ponieważ ciągle tworzysz nowe obiekty jQuery. $.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });}to wszystko czego potrzebujesz.
samotny środa

@lonesomeday: Zamierzałem to opublikować, ale wydaje mi się, że nie jest to właściwy sposób na ustawienie / odblokowanie disabledatrybutu. W każdym razie, jeśli możesz potwierdzić, że jest to rozwiązanie dla różnych przeglądarek .. Zaktualizuję moją odpowiedź.
ifaour

2
W przypadku przyszłych pracowników Google rozwiązanie to działa równie dobrze dla atrybutu „wymagane”.
skybondsor

propjest lepszą metodą od 1.6, jak powiedział Arne.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功


5

Kolejna prosta opcja, która aktualizuje się po kliknięciu 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


7
Pozbądź się ifbloku z$('#item').prop('disabled', this.checked);
Naeem Sarfraz,

2

Jakiś czas później, dzięki @arne, stworzyłem tę podobną małą funkcję do obsługi, gdzie wejście powinno być wyłączone ORAZ ukryte lub włączone ORAZ 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 obiekt jQuery (taki jak $ ('input [name = "something"]')) jest po prostu przełączany za pomocą:

toggleInputState(myElement, myBoolean)

1

Jest to dość proste dzięki składni wywołania zwrotnego 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
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.