JQuery kullanarak giriş devre dışı bırakılmış özniteliğini aç / kapat


191

İşte benim 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.
});

Nasıl değiştiririm .attr('disabled',false);?

Google'da bulamıyorum.


Alanın devre dışı özelliğini kullanamamanızın bir nedeni var mı? $("input").get(0).disabled = isFalse;// jsfiddle.net/uAfhj
Shanimal

Yararlı bulabileceğiniz DependsOn eklentisini buldum
Onshop

Yanıtlar:


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

.prop()Yöntem iki argüman kabul eder:

  • Mülk adı (devre dışı, işaretli, seçili) doğru veya yanlış olan herhangi bir şey
  • Özellik değeri , şunlar olabilir:
    • ( boş ) - geçerli değeri döndürür.
    • boolean (true / false) - özellik değerini ayarlar.
    • işlevi - Bulunan her öğe için yürütülür, döndürülen değer özelliği ayarlamak için kullanılır. İki argüman aktarıldı; ilk argüman indekstir (bulunan her eleman için 0, 1, 2 artar). İkinci argüman öğenin geçerli değeridir (true / false).

Bu durumda, bana indeks (i) ve geçerli değer (v) sağlayan bir işlev kullandım, sonra geçerli değerin tersini döndürdüm, böylece özellik durumu tersine çevrildi.


2
(İnanıyorum) .prop () bunu yapmanın doğru yoludur ve engelli = "devre dışı" + zarif gibi şeyleri ayarlamak için tam olarak eklendi
Morvael

5
Nedir ive v?
Matt R

@MattR Kısa bir açıklama ekledim.
Arne

bu harika bir cevap!
LeBlaireau

6
Bir güncelleme olarak, bu ok işlevlerini kullanarak çok düzgün görünüyor:$('#el').prop('disabled', (i, v) => !v);
igneosaur

101

Ben tam tarayıcı karşılaştırılabilirlik değeri tarafından ayarlanması veya kaldırılması için sanırım ! İşte az önce yaptığım küçük bir eklenti: disableddisabled

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

Örnek bağlantı .

EDIT: örnek bağlantı / kod zincirleme korumak için güncelledi!
EDIT 2:
@lonesomeday yorumuna dayanarak, geliştirilmiş bir sürüm:

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

28
Bu işe yarayabilir, ancak yavaş olacaktır, çünkü sürekli olarak yeni jQuery nesneleri oluşturuyorsunuz. $.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });}tüm ihtiyacın olan.
lonesomeday

@lonesomeday: Bunu göndermek için gidiyordu ama eğilimi bu seti / unset doğru yol olmadığını düşünmek disabledözniteliği. Her neyse, bunun bir tarayıcılar arası çözüm olduğunu onaylayabilirsen .. Cevabımı güncelleyeceğim.
ifaour

2
Gelecekteki tüm Google çalışanları için bu çözüm, 'zorunlu' özellik için eşit derecede iyi çalışır.
skybondsor

propArne tarafından söylendiği gibi 1.6'dan beri daha iyi bir yöntemdir.
Ciro Santilli 法轮功 at 病 六四 事件 法轮功


5

Onay kutusunun bir tıklamasıyla güncellenen başka bir basit seçenek.

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

Eylemde: bağlantı


7
ifBloktan kurtulun$('#item').prop('disabled', this.checked);
Naeem Sarfraz

2

Oldukça kısa bir süre sonra @arne sayesinde, girişin devre dışı bırakılması VE gizlenmesi ya da etkinleştirilmesi VE gösterilmesi gereken bu küçük işlevi oluşturdum:

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

Sonra bir jQuery nesnesi ($ ('input [name = "bir şey"]') gibi) basitçe şu şekilde değiştirilir:

toggleInputState(myElement, myBoolean)

1

Bu, aşağıdakilerin geri arama sözdizimi ile oldukça basittir 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
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.