jQueryを使用して入力無効化属性を切り替える


189

これが私のコードです:

$("#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.
});

切り替える方法は.attr('disabled',false);

Googleで見つけられないようです。


フィールドのdisabledプロパティを使用できない理由は何ですか?$("input").get(0).disabled = isFalse;// jsfiddle.net/uAfhj
シャニマル

DependsOnプラグインが見つかりました。これは便利かもしれません
Onshop

回答:


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

この.prop()メソッドは2つの引数を受け入れます。

  • プロパティ(無効、チェック済み、選択済み)trueまたはfalseのいずれか
  • プロパティは次のいずれかです。
    • )-現在の値を返します。
    • boolean(true / false)-プロパティ値を設定します。
    • function-見つかった要素ごとに実行され、戻り値はプロパティの設定に使用されます。渡される引数は2つあります。最初の引数はインデックスです(見つかった要素ごとに0、1、2増加)。2番目の引数は、要素の現在の(true / false)です。

したがって、この場合、インデックス(i)と現在の値(v)を提供する関数を使用してから、現在の値の反対を返し、プロパティの状態を逆にしました。


2
.prop()はこれを行う正しい方法であり、disabled = "disabled" +そのエレガントな
Morvael

5
何ですiv
Matt R

@MattR簡単な説明を追加しました。
Arne

これは素晴らしい答えです!
LeBlaireau、2016年

6
更新として、これは矢印関数を使用して非常にきれいに見えます:$('#el').prop('disabled', (i, v) => !v);
igneosaur

101

ブラウザの完全な互換性を得るにdisabledは、値で設定するdisabledか、削除する必要があると思います!
ここに私が作った小さなプラグインがあります:

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

リンクの例

編集:連鎖性を維持するためにサンプルのリンク/コードを更新しました!
編集2:
@lonesomedayコメントに基づいて、ここに拡張バージョンがあります:

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

28
これはうまくいくかもしれませんが、常に新しいjQueryオブジェクトを作成しているので、遅くなるでしょう。$.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });}は、あなたが必要とすることすべてです。
lonesomeday

@lonesomeday:私はこれを投稿するつもりでしたが、これは属性を設定/設定解除する正しい方法ではないと思いがちdisabledです。とにかく、これがクロスブラウザソリューションであることを確認できれば、答えを更新します。
ifaour

2
今後のグーグルにとって、このソリューションは「必須」属性でも同様に機能します。
skybondsor 2014年

propArneが言ったように、1.6以降のより良い方法です。
Ciro Santilli郝海东冠状病六四事件法轮功


5

チェックボックスをクリックするだけで更新されるもう1つのシンプルなオプション。

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

動作中:リンク


6
ifブロックを取り除く$('#item').prop('disabled', this.checked);
Naeem Sarfraz 2017

2

しばらくして、@ arneのおかげで、入力を無効にして非表示にしたり、有効にして表示したりする場所を処理するために、このような小さな関数を作成しました。

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

次に、jQueryオブジェクト($( 'input [name = "something"]')など)は、以下を使用して簡単に切り替えられます。

toggleInputState(myElement, myBoolean)

1

これは、次のコールバック構文を使用するとかなり簡単です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
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.