ボタンとリンクを無効/有効にする最も簡単な方法は何ですか(jQuery + Bootstrap)


360

時々私はボタンとしてスタイルが設定されたアンカーを使用し、時にはボタンだけを使用します。特定のクリック音を無効にして、次のようにします。

  • 彼らは無効に見えます
  • 彼らはクリックされなくなります

これどうやってするの?


私の投稿を一番下に表示しますが、ここではあまり説明の少ない$( "yourSelector")。button( "enable");です。//ボタンを有効にする、または$( "yourSelector")。button( "disable"); // jqueryUIのボタンウィジェットが使用されている場合、ボタンを無効にします。
El Bayames、2015

BS3のドキュメントではrole="button"リンクに使用するように言われていますが、それはこの問題に影響を与えないようです。 getbootstrap.com/css/#buttons
Jess

2
持つa.btn[disabled]無効に表示され、まだクリック可能なままにすることはIMOブートストラップのバグです。属性[disabled]buttonおよびに対してのみ無効になっている必要がありinputます。
ジェス

回答:


575

ボタン

ボタンはdisabled、ブラウザで処理されるボタンプロパティと同じように、簡単に無効にできます。

<input type="submit" class="btn" value="My Input Submit" disabled/>
<input type="button" class="btn" value="My Input Button" disabled/>
<button class="btn" disabled>My Button</button>

カスタムjQuery関数でこれらを無効にするには、単に以下を利用しますfn.extend()

// Disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            this.disabled = state;
        });
    }
});

// Disabled with:
$('input[type="submit"], input[type="button"], button').disable(true);

// Enabled with:
$('input[type="submit"], input[type="button"], button').disable(false);

JSFiddle無効ボタンと入力デモ

それ以外の場合は、jQueryのprop()メソッドを使用します。

$('button').prop('disabled', true);
$('button').prop('disabled', false);

アンカータグ

これはアンカータグの有効なプロパティdisabledはないことに注意してください。このため、Bootstrapはその要素に次のスタイルを使用します。.btn

.btn.disabled, .btn[disabled] {
    cursor: default;
    background-image: none;
    opacity: 0.65;
    filter: alpha(opacity=65);
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    box-shadow: none;
    color: #333;
    background-color: #E6E6E6;
}

[disabled]プロパティと.disabledクラスがどのようにターゲットされているかに注意してください。.disabledクラスは、アンカータグが無効になって表示させるために必要とされるものです。

<a href="http://example.com" class="btn">My Link</a>

もちろん、これをクリックしてもリンクが機能しなくなることはありません。上記のリンクをクリックすると、http://example.comに移動します。これを防ぐには、jQueryコードの簡単な部分を追加して、disabled呼び出すクラスでアンカータグをターゲットにすることができますevent.preventDefault()

$('body').on('click', 'a.disabled', function(event) {
    event.preventDefault();
});

次のコマンドdisabledを使用してクラスを切り替えることができますtoggleClass()

jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            $this.toggleClass('disabled', state);
        });
    }
});

// Disabled with:
$('a').disable(true);

// Enabled with:
$('a').disable(false);

JSFiddleはリンクのデモを無効にしました


結合

次に、前述の無効化機能を拡張して、を使用して無効化しようとしている要素のタイプを確認できますis()。これによりtoggleClass()inputor button要素ではない場合、または次のdisabled場合にプロパティを切り替えることができます。

// Extended disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            if($this.is('input, button, textarea, select'))
              this.disabled = state;
            else
              $this.toggleClass('disabled', state);
        });
    }
});

// Disabled on all:
$('input, button, a').disable(true);

// Enabled on all:
$('input, button, a').disable(false);

完全に結合されたJSFiddleデモ

上記の関数はすべての入力タイプでも機能することに注意してください。


包括的な答えをありがとう。コーヒースクリプトバージョンについては、編集1を参照してください。私はまだクリックを防ぐためにリンクを取得するのに苦労しています。return false if $(@).prop('disabled')カスタムクリックハンドラーにを保持するつもりでした か?その行がない場合、これらのハンドラーは関係なく実行されます。
バイオフラクタル2013年

1
前述の@biofractal disabledは有効なアンカータグプロパティではないため、使用しないでください。私が指定したクリックイベントは.disabledクラスに基づいていますが、使用できるのはhasClass('disabled')-それがtrueの場合preventDefaultです。
James Donnelly 2013年

あ、そう。ありがとう。では、なぜdisabledアンカーのプロパティを作成して使用するべきではないのでしょうか。その動的オブジェクトなので、アンカーの機能セットを拡張していたように、設定して使用できますか?これを示すために、以下の回答を更新しました。どう思いますか?悪か?また、あなたが持っているあなたは、リンクを再度有効にするときにクリックイベント?.off()preventDefault
バイオフラクタル2013年

これは仕様に反し、検証テストに合格しません。カスタムdisabledプロパティが必要な場合は、data-*属性を使用できます。Bootstrapはすでに同じdisabledプロパティスタイルを適用しclass="disabled"ているため、代わりにクラスに依存することもできます。
James Donnelly、2013年

了解しました-私はあなたのコメントを反映するように私の答えを調整しました。preventDefaultすべてのアンカークリックイベントにフックした場合、リンクが再度有効になったときにそれらを切り離す必要があることにまだ懸念があります。それとも私は何かを誤解していますか?
バイオフラクタル2013年

48

もっと簡単な方法は考えられません!;-)


アンカータグ(リンク)の使用:

<a href="#delete-modal" class="btn btn-danger" id="delete">Delete</a>

アンカータグを有効にするには:

 $('#delete').removeClass('disabled');
 $('#delete').attr("data-toggle", "modal");

ここに画像の説明を入力してください


アンカータグを無効にするには:

 $('#delete').addClass('disabled');
 $('#delete').removeAttr('data-toggle');

ここに画像の説明を入力してください


27

テキストフィールドと送信ボタンがあるとします。

<input type="text" id="text-field" />
<input type="submit" class="btn" value="Submit"/>

無効化:

たとえば、送信ボタンなどのボタンを無効にするには、disabled属性を次のように追加するだけです。

$('input[type="submit"]').attr('disabled','disabled');

上記の行を実行すると、送信ボタンのhtmlタグは次のようになります。

<input type="submit" class="btn" value="Submit" disabled/>

'disabled'属性が追加されていることに注意してください

有効化:

テキストフィールドにテキストがある場合など、ボタンを有効にするため。ボタンを有効にするには、disable属性を削除する必要があります。

 if ($('#text-field').val() != '') {
     $('input[type="submit"]').removeAttr('disabled');
 }

ここで、上記のコードは 'disabled'属性を削除します。


22

私はパーティーに遅れていることを知っていますが、具体的には次の2つの質問に答えます。

「私は特定のクリックしやすいものを無効にしたいので:

  • 彼らはクリックをやめる
  • 彼らは無効に見えます

これはどれほど難しいのでしょうか?」

彼らはクリックをやめる

ボタンの場合1.好き<button><input type="button">、あなたは、属性を追加しますdisabled

<button type="submit" disabled>Register</button>
<input type="button" value="Register" disabled>

2.リンクの場合、すべてのリンク...実際には、HTML要素であれば、CSS3 ポインターイベントを使用できます

.selector { pointer-events:none; }

ポインターイベントのブラウザーサポートは、今日の最先端技術(5/12/14)で素晴らしいです。ただし、通常はIEレルムでレガシーブラウザーをサポートする必要があるため、IE10以下ではポインターイベントをサポートしていません。http://caniuse.com/pointer-events。そのため、ここで他の人が言及しているJavaScriptソリューションの1つを使用することは、レガシーブラウザーに進むための方法かもしれません。

ポインターイベントの詳細:

彼らは無効に見えます

明らかにこれはCSSの答えなので、

1. セレクターのようなボタン<button>またはセレクターを<input type="button">使用する場合[attribute]

button[disabled] { ... }

input[type=button][disabled] { ... }

-

ここに私がここで言及したものを含む基本的なデモがあります:http : //jsfiddle.net/bXm5B/4/

お役に立てれば。


17

私のように、ボタンを無効にしたいだけなら、この長いスレッドに微妙に隠されている簡単な答えをお見逃しなく:

 $("#button").prop('disabled', true);

本当のヒーロー、これは私が必要なすべてです。
リックス

7

@James Donnellyは、jQueryを新しい関数で拡張することに依存する包括的な回答を提供しています。それは素晴らしいアイデアなので、私は彼のコードを適応させて、私が必要とする方法で機能するようにします。

jQueryの拡張

$.fn.disable=-> setState $(@), true
$.fn.enable =-> setState $(@), false
$.fn.isDisabled =-> $(@).hasClass 'disabled'

setState=($el, state) ->
    $el.each ->
        $(@).prop('disabled', state) if $(@).is 'button, input'
        if state then $(@).addClass('disabled') else $(@).removeClass('disabled')

    $('body').on('click', 'a.disabled', -> false)

使用法

$('.btn-stateful').disable()
$('#my-anchor').enable()

コードは、単一の要素または要素のリストを処理します。

ボタンと入力はdisabledプロパティをサポートし、設定されている場合true、無効になっているように見え(ブートストラップのおかげ)、クリックしても起動しません。

アンカーはdisabledプロパティをサポートしていないため、代わりに.disabledクラスを使用して無効に見えるようにし(再度ブートストラップを使用したおかげで)、falseを返すことでクリックを防ぐデフォルトのクリックイベントをフックします(ここpreventDefault参照する必要はありません) 。

:アンカーを再度有効にするときに、このイベントのフックを解除する必要はありません。.disabledクラスを削除するだけでうまくいきます。

もちろん、カスタムクリックハンドラーをリンクにアタッチしている場合、これは役に立ちません。これは、ブートストラップとjQueryを使用するときに非常に一般的なことです。これに対処するには、次のようにisDisabled()拡張機能を使用して.disabledクラスをテストします。

$('#my-anchor').click -> 
    return false if $(@).isDisabled()
    # do something useful

それが少し簡単になることを願っています。


7

BootstrapのJSボタンと「読み込み中」の状態を使用している場合は、奇妙な問題があることに注意してください。これがなぜ起こるかはわかりませんが、これを修正する方法を次に示します。

ボタンがあり、それを読み込み状態に設定するとします。

var myButton = $('#myBootstrapButton');
myButton.button('loading');

次に、ロード状態を解除し、同時に無効にします(たとえば、ボタンが[保存]ボタンであった場合、ロード状態は検証が進行中であり、検証が失敗したことを示します)。これは妥当なBootstrap JSのように見えます:

myButton.button('reset').prop('disabled', true); // DOES NOT WORK

残念ながら、これによりボタンはリセットされますが、無効にはなりません。どうやら、button()いくつかの遅延タスクを実行します。したがって、無効化も延期する必要があります。

myButton.button('reset');
setTimeout(function() { myButton.prop('disabled', true); }, 0);

少し面倒ですが、私がよく使っているパターンです。


6

すべてから素晴らしい回答と貢献!この機能を少し拡張して、select要素の無効化を含める必要がありました。

jQuery.fn.extend({
disable: function (state) {
    return this.each(function () {
        var $this = jQuery(this);
        if ($this.is('input, button'))
            this.disabled = state;
        else if ($this.is('select') && state)
            $this.attr('disabled', 'disabled');
        else if ($this.is('select') && !state)
            $this.removeAttr('disabled');
        else
            $this.toggleClass('disabled', state);
    });
}});

私のために働いているようです。皆さんありがとう!


5

そのような振る舞いのために、私は常にjQueryUI buttonウィジェットを使用します。リンクとボタンにそれを使用します。

HTML内でタグを定義します。

<button id="sampleButton">Sample Button</button>
<a id="linkButton" href="yourHttpReferenceHere">Link Button</a>

jQueryを使用してボタンを初期化します。

$("#sampleButton").button();
$("#linkButton").button();

buttonウィジェットのメソッドを使用して、それらを無効/有効にします。

$("#sampleButton").button("enable"); //enable the button
$("#linkButton").button("disable"); //disable the button

これでボタンとカーソルの動作が処理されますが、無効にしたときにボタンのスタイルをさらに深くして変更する必要がある場合は、ページのCSSスタイルファイル内の次のCSSクラスを上書きします。

.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
      background-color:aqua;
      color:black;
 }

ただし、これらのCSSクラス(変更された場合)は他のウィジェットのスタイルも変更することに注意してください。


1
この答えはjQuery UIボタン用であり、プレーンバニラjQueryで使用されるブートストラップボタン用ではなく、後者はOPが使用しているものです。ところで、質問のコメントに答えを入れることは、普及の好ましい方法ではありません。; ^)
ルフィン、2015

3

以下は私にとって非常にうまくいきました:

$("#button").attr('disabled', 'disabled');

2

これはかなり遅い回答ですが、ブーストラップボタンをクリックして無効にし、素晴らしい効果を追加する方法(スピナーなど)を探す方法を探しているときに、この質問に出くわしました。私はまさにそれを行う素晴らしいライブラリを見つけました:

http://msurguy.github.io/ladda-bootstrap/

必要なcssとjsを含め、いくつかのプロパティをボタンに追加し、javascriptでladaを有効にします... Presto!ボタンに新しい命が吹き込まれました(デモの美しさを確認してください)!


2

これは上手くいきません

$(this).attr('checked') == undefined

コードを調整する

if(!$(this).attr('checked') || $(this).attr('checked') == false){

2

私は答えが遅いことを知っていますが、IMOこれはボタンの「有効」とボタンの「無効」を切り替える最も簡単な方法です

function toggleButtonState(button){

  //If button is enabled, -> Disable
  if (button.disabled === false) {
    button.disabled = true;

  //If button is disabled, -> Enable
  } else if (button.disabled === true) {
    button.disabled = false;
  }
}

1

次のようなページにこれらのボタンがあるとします。

<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit"value="Enable All" onclick="change()"/>

jsコード:

function change(){
   var toenable = document.querySelectorAll(".byBtn");        
    for (var k in toenable){
         toenable[k].removeAttribute("disabled");
    }
}

1

現在有効になっているこのようなものがあるとします。

<button id="btnSave" class="btn btn-info">Save</button>

これを追加するだけです:

$("#btnSave").prop('disabled', true);

ボタンを無効にするこれを取得します

<button id="btnSave" class="btn btn-primary" disabled>Save</button>

2
ボタンアンカーについて質問されました。disabledプロパティは、アンカータグの有効なプロパティではありません。
バイオフラクタル

0

クリッカブルを無効にする場合は、これをhtmlにインラインで追加することもできます

style="cursor: not-allowed;"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.