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.

Tommy Arnold
źródło
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.

Arne
źródło
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);
ifaour
źródło
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 郝海东 冠状 病 六四 事件 法轮功
19
    $ („# pole wyboru”). kliknij (function () {
        $ ('# Submit'). attr ('disabled',! $ (this) .attr ('zaznaczone'));
    });

Присяжный Дмитрий
źródło
2
Uwaga: działa tylko poniżej wersji jQuery 1.6. W obu przypadkach użyj .prop () zamiast attr (), aby odzyskać wartości boolowskie. Zobacz api.jquery.com/prop
Manuel Arwed Schmidt,
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

nierówny
źródło
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)
wieczność
źródło
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
});
samotny dzień
źródło