関数からjQueryダイアログのボタンを無効にするにはどうすればよいですか?


237

ユーザーが特定の情報を入力する必要があるjQueryダイアログがあります。このフォームには、「続行」ボタンがあります。この「続行」ボタンを有効にするには、すべてのフィールドにコンテンツが含まれている必要があります。それ以外の場合は、無効のままになります。

フィールドのステータスが変更されるたびに呼び出される関数を作成しました。ただし、この機能からダイアログボタンを有効または無効にする方法がわかりません。私は何をすべきか?

おっと、私はこれらのボタンが次のように作成されたことを言及するのを忘れていました:

$(function() {
  $("#dialog").dialog({
    bgiframe: true,
    height: 'auto',
    width: 700,
    show: 'clip',
    hide: 'clip',
    modal: true,
    buttons: {
      'Add to request list': function() {
        $(this).dialog('close');
        $('form').submit();
      },
      'Cancel': function() {
        $(this).dialog('close');
      }
    }
  })
});

で良い答えがあります:stackoverflow.com/questions/3646408/...は
アミール

3
私はこれをかなり調査し、これまでで最もクリーンなソリューションが次のリンクで説明されていることを発見しました:stackoverflow.com/a/4279852

回答:


260

無効化されたプロパティを設定します

 $('#continueButton').attr("disabled", true);

更新:ああ、今は複雑さがわかります。jQueryのダイアログには、「ボタン」セクションの下で使用されるであろう単一の行を(持っていました。

 var buttons = $('.selector').dialog('option', 'buttons');

ダイアログからボタンコレクションを取得し、それをループして必要なボタンを見つけ、上記で示したようにdisabled属性を設定する必要があります。


残念ながら、JQueryダイアログでは操作が簡単にできないため、少し作業する必要があります。
トムリッター

はい、ただし、ボタンオプションはDOM要素を返さずに機能します-それらを繰り返すことは問題ありませんが、1つを無効にすることはそれほど簡単ではありません。ここで何か不足していますか?
Remi Despres-Smyth

1
ボタンを無効にするには、このメソッドを回避する必要があります。jQuery-fooを使用して、結果のdom要素をページから取得します。
ステファンケンダル

36
同意-なぜこれが選択された答えなのですか?不完全な場合は-1。
Remi Despres-Smyth 2010

22
.prop('disabled', true)jQuery
1.6以降で

191

とても簡単です:

$(":button:contains('Authenticate')").prop("disabled", true).addClass("ui-state-disabled");

4
私はこのソリューションが好きですが、実際には次のようになっているはずです。(addClassがありませんでした)
Eric Asberry

4
複数のダイアログがある場合、変更する必要のあるダイアログを定義する必要があります。$( "#dialogId")。parent()。$( ":button:contains( 'Authenticate')")。attr( "disabled"、 " disabled ")。addClass( 'ui-state-disabled');
podeig 2011年

5
+1:これはこれまでで最高の答えです...受け入れられた答えは何も答えず、命令型アプローチを提案するだけです。これは面倒です。何もループする必要がないので、jqueryがそれを行うことができます。
rsenna 2012年

1
jQueryUIダイアログ内のボタンがjQueryUIボタンであるため、これも機能することがわかりました:$( "#dialogID")。parent()。find( ":button:contains( 'Authenticate')")。button( "disable") ;
writes_on

12
.prop('disabled', true)jQuery
1.6以降で

38

単純な作業は複雑になっています。jQueryUIダイアログには、理由のためにボタンを設定する2つの方法があります。

各ボタンのクリックハンドラーのみを設定する必要がある場合は、Object引数を取るオプションを使用します。ボタンを無効にして他の属性を提供するには、Array引数を取るオプションを使用します。

次の例では、ボタンを無効にし、すべてのjQueryUI CSSクラスと属性を適用することでボタンの状態を正しく更新します。

手順1- Arrayボタンのあるダイアログを作成します。

// Create a dialog with two buttons; "Done" and "Cancel".
$(".selector").dialog({ buttons: [
    {
        id: "done"
        text: "Done",
        click: function() { ... }
    },
    {
        id: "cancel"
        text: "Cancel",
        click: function() { ... }
    }
] });

ステップ2-ダイアログの作成後に[完了]ボタンを有効/無効にします。

// Get the dialog buttons.
var dialogButtons = $( ".selector" ).dialog("option", "buttons");

// Find and disable the "Done" button.
$.each(buttons, function (buttonIndex, button) {
    if (button.id === "done") {
        button.disabled = true;
    }
})

// Update the dialog buttons.
$(".selector").dialog("option", "buttons", dialogButtons);

2
正しい考えですが、eachループは不要です。配列class内の属性を指定するbuttonsと、それを使用して適切な要素を見つけることができます。
cdmckay

cdmackayが言ったように、ループする必要はありません。上記の例では、先に進んでjQueryセレクターを使用できます。var $ doneButton = $( "#done");
Rob

上記の方法(配列方法)を使用してボタンを作成しようとすると、ボタンが「完了」および「キャンセル」ではなく「1」および「0」として表示されます。なぜこうなった?テキストはボタンに表示されず、クリック機能も実行されません。
Harke、2011年

1
これは私にとってはうまくいき、ループは必要ありません。idを設定し、要素にアクセスします。this.myDialog.dialog( "option"、 "buttons"、[{id: "addAdapterFormOkButton"、text: "OK"、click:function(){}}])次に必要なのは上記のようにセレクターでアクセスするには:var okButt = $( "#addAdapterFormOkButton"); okButt.addClass( 'ui-state-disabled'); okButt.attr( '無効'、true);
ガーナード

32

ボタンのIDを提供するダイアログを作成する場合、

$("#dialog").dialog({ buttons: [ {
 id: "dialogSave",
 text: "Save",
 click: function() { $(this).dialog("close"); }
},
{
 id: "dialogCancel",
 text: "Cancel",
 click: function() { $(this).dialog("close"); 
}
}]});       

次のコードでボタンを無効にできます:

$("#dialogSave").button("option", "disabled", true);

7
私はあなたに+1を与えましたが、次のようにボタンのプロパティの代わりにメソッドを使用する方が良いと思います:$( "#dialogSave")。button( "disable");
Fareed Alnamrouti

1
ハ!はるかに簡単です!しかし、フェアリーが言うように方法を使用してください。
PapillonUK

29

名前でボタンを見つけられるようにしたいと思いました(jQuery UIダイアログにいくつかのボタンがあるため)。また、ページにいくつかのダイアログがあるので、特定のダイアログのボタンを取得する方法が必要です。これが私の機能です:

function getDialogButton( dialog_selector, button_name )
{
  var buttons = $( dialog_selector + ' .ui-dialog-buttonpane button' );
  for ( var i = 0; i < buttons.length; ++i )
  {
     var jButton = $( buttons[i] );
     if ( jButton.text() == button_name )
     {
         return jButton;
     }
  }

  return null;
}

// create the dialog
$('#my_dialog').dialog( dialogClass : 'dialog1',
                        buttons: {
                                   Cancel: function() { $(this).dialog('close'); },
                                   Submit: function() { ... } 
                             } );

// now programmatically get the submit button and disable it
var button = getDialogButton( '.dialog1', 'Submit' );
if ( button )
{
  button.attr('disabled', 'disabled' ).addClass( 'ui-state-disabled' );
}

素晴らしい解決策。ただし、ソリューションでは、ボタンペインはダイアログの子ではないことに言及します。キーは、一意のdialogClassを設定し、それをセレクターに使用することです。私がそれを見ていたとき、これは私を手に入れました。
Remi Despres-Smyth

興味深いことに、ボタンのテキストは、ボタンオブジェクトのキーによって設定されます。属性を設定する必要がない場合に限られるようです。それ以外の場合は、テキストがボタンごとに明示的に設定される配列バージョンの方が優れています。
ジェラールONeill

19

これはボタンを無効にします:

var firstButton=$('.ui-dialog-buttonpane button:first');
firstButton.addClass('ui-state-disabled');

ページに複数のダイアログがある場合は、ダイアログIDを追加する必要があります。


11

クリックするとボタンが無効になるように変更された質問のサンプルを次に示します。

$(function() {
    $("#dialog").dialog({
        bgiframe: true,
        height: 'auto',
        width: 700,
        show: 'clip',
        hide: 'clip',
        modal: true,
        buttons: {
            'Add to request list': function(evt) {

                // get DOM element for button
                var buttonDomElement = evt.target;
                // Disable the button
                $(buttonDomElement).attr('disabled', true);

                $('form').submit();
            },
            'Cancel': function() {
                $(this).dialog('close');
            }
        }
    });
}

また、次の質問も役に立ちます: jQuery UIダイアログのボタンを無効にするにはどうすればよいですか?


9

ダイアログボタンを無効にする(または他のアクションを実行する)簡単な方法を見つけました。

    var dialog_selector = "#myDialogId";

    $(dialog_selector).parent().find("button").each(function() {
        if( $(this).text() == 'Bin Comment' ) {
            $(this).attr('disabled', true);
        }
    });

ダイアログの親を選択し、すべてのボタンを見つけるだけです。次に、ボタンのテキストをチェックして、ボタンを識別できます。


9

.dialog("widget")ダイアログDIV自体を返すメソッドでこれを機能させました。ダイアログメソッドにいる場合:

$(this)
.dialog("widget")
.find("button")
.addClass("ui-state-disabled") // for the style
.attr("disabled", true);

8

使いやすさの観点からは、ボタンを有効にしたままにしておくのが一般的ですが、誰かが不完全なフォームを送信しようとするとエラーメッセージが表示されます。クリックしたいボタンが無効になっていて、その理由がわからない場合、私は気が狂います。


6

これを試して:

$('button:eq(0)',$('#dialog_id').dialog.buttons).button('disable');

5

jQueryダイアログの私のenableOk関数は次のとおりです。

function enableOk(enable)
{
    var dlgFirstButton = $('.ui-dialog-buttonpane').find('button:first');

    if (enable) {
        dlgFirstButton.attr('disabled', '');
        dlgFirstButton.removeClass('ui-state-disabled');
    } else {
        dlgFirstButton.attr('disabled', 'disabled');
        dlgFirstButton.addClass('ui-state-disabled');
    }
}

「最初の」ボタンは、右端のボタンです。適切な視覚効果を得るために、ボタンを無効にし、ダイアログの無効クラスを設定します。


これは、ページにダイアログが1つしかないことを前提としています。これを処理するために、ページ上のダイアログからボタンを名前でフェッチする関数を作成しました。
Remi Despres-Smyth

5

レガシーjQuery UI(バージョン1.7.3)では、簡単に使用できました

$('.ui-dialog-buttonpane button')[0].disabled=true;

DOM要素自体のボタンを無効にするだけです。新しいjQuery UI(バージョン1.8.7)にアップグレードしたので、このメソッドはFirefoxで機能しなくなりましたが、ボタンjqueryオブジェクトのjquery UIボタン固有の無効化および有効化関数を呼び出すだけです。

$('.ui-dialog-buttonpane button').eq(0).button('disable');

5

笑、ボタンにアクセスする興味深い方法を見つけた

$("#dialog").dialog({

      buttons: {
        'Ok': function(e) { $(e.currentTarget).button('disable'); }

      }
 });

引数にイベントオブジェクトがあることを皆さんご存じないようです...

ちなみに、コールバック内からボタンにアクセスするだけです。通常、アクセス用のIDを追加することをお勧めします


1
これでうまくいくとは思いません。[OK]ボタンが双方向クリックされたときにのみ、ボタンが非アクティブになります。
ジャン=フランソワ・ビーチャム

処理が完了するまで、ダイアログの[OK]ボタンを無効にする必要がありました。これは完全に機能しました。
CodingYoshi 2018年

4

本当にボタンを無効にしたい場合は、ボタンの.unbind()メソッドも呼び出す必要があることがわかりました。そうしないと、ボタンがアクティブのままになり、ダブルクリックで複数のフォームが送信される可能性があります。次のコードは私のために働きます:

button = $(this).parent().find("button:contains('OK')");
button.unbind();
button.addClass('ui-state-disabled');

4

同様のことをしようとしている人に適用できる回避策を見つけました。ボタンを無効にする代わりにif、チェックボックスがチェックされているかどうかをチェックする簡単なステートメントを関数に入れました。

そうでない場合は、送信前にチェックボックスをオンにする必要があるという簡単なメッセージが表示されました。

例えば:

$("#confirmation-dialog").dialog({
    modal: true,
    autoOpen: false,
    width: 600,
    overlay: {
        backgroundColor: '#000',
        opacity: 0.5
    },
    close: function() {
        $('input[type="submit"]')
      .val('Record Reading')
      .attr('disabled', false);
    },
    buttons: {
        'Confirm Reading': function() {
            if($('#check-box').attr("checked")){
                $(this).dialog('close')
                $('form')
                .addClass('confirmed')
                .submit();
            }
            else {
                $('#please-check').show("slide");
            }
        }
    }
});

とにかく、私はそれが誰かを助けることを望みます。


4

このタスクを少し簡単にするために、jQuery関数を作成しました。これをJavaScriptファイルに追加するだけです。

$.fn.dialogButtons = function(name, state){
var buttons = $(this).next('div').find('button');
if(!name)return buttons;
return buttons.each(function(){
    var text = $(this).text();
    if(text==name && state=='disabled') {$(this).attr('disabled',true).addClass('ui-state-disabled');return this;}
    if(text==name && state=='enabled') {$(this).attr('disabled',false).removeClass('ui-state-disabled');return this;}
    if(text==name){return this;}
    if(name=='disabled'){$(this).attr('disabled',true).addClass('ui-state-disabled');return buttons;}
    if(name=='enabled'){$(this).attr('disabled',false).removeClass('ui-state-disabled');return buttons;}
});};

クラス「ダイアログ」のダイアログの「OK」ボタンを無効にします。

$('.dialog').dialogButtons('Ok', 'disabled');

すべてのボタンを有効にします。

$('.dialog').dialogButtons('enabled');

「閉じる」ボタンを有効にし、色を変更します。

$('.dialog').dialogButtons('Close', 'enabled').css('color','red');

これがお役に立てば幸いです。


3

残念ながら、ここに示した解決策は、ページ上のいくつかのダイアログで機能しませんでした。

また、問題は、元のダイアログ自体にボタンペインが含まれておらず、兄弟であるということでした。

だから私はそのようなダイアログIDで選択することを思いつきました:

        var getFirstDialogButton = function (dialogSelector) {
            return $('.ui-dialog-buttonpane button:first',
                    $(dialogSelector).parent()[0]);
        };

...

        $('#my_dialog').dialog({
            open: function(event, ui) {
                getFirstDialogButton("#my_dialog")
                 .addClass("ui-state-disabled").attr('disabled', 'disabled' );
            },

...

その後、同じgetFirstDialogBu​​tton()関数を使用して、たとえば検証が成功した後で、ボタンを有効にすることができます。

それが誰かを助けることを願っています。


3

ここでは、ボタンを割り当てる配列メソッドを使用して実装した例を示します。これにより、後でIDセレクターを使用して、受け入れられた回答を最初に述べたように、ボタンを有効/無効にしたり、ボタンを完全に表示/非表示にしたりできます。やっている。

$( "#dialog-form" ).dialog({
autoOpen: true,
height: 500,
width: 450,
modal: true,
buttons: [
{
    id: "submit_btn",
    text: "Make Apointment",
    click: function() { 
        //do ajax       
    }       
},
{
    id: "cancel_btn",
    text: "Cancel",
    click: function() {
       $( this ).dialog( "close" );
    }
},
{
    id: "ok_btn",
    text: "OK",
    click: function() {
       $( this).dialog('close');
    },
    disabled: "disabled"
}],
close: function() {
    allFields.val( "" ).removeClass( "ui-state-error" );
}
});

送信に成功したら、2つのボタンを無効にして非表示にし、デフォルトで無効になっていた[OK]ボタンを有効にします。

$('#submit_btn, #cancel_btn').attr('disabled','disabled').addClass('ui-state-disabled').hide();
$('#ok_btn').attr('disabled','').removeClass('ui-state-disabled').show();

お役に立てれば。


3

Nickが行ったのと同様の関数を作成しましたが、私のメソッドではdialogClassを設定する必要がなく、IDを介して特定のダイアログのボタンを取得できます(アプリケーションに複数ある場合)。

function getDialogButton( dialog_id, button_name) {
    var target = '#'+dialog_id;
    var buttons = $(target).parent().find('button');
    for ( var i=0; i<buttons.length; ++i ) {
        var jButton = $( buttons[i] );
        if ( jButton.text() == button_name ) {
              return jButton;
        }
    }
    return null;
} 

したがって、次のようにダイアログを作成した場合:

$(function() {
    $("#myDialogBox").dialog({

      bgiframe: true, height: 'auto', width: 700, modal: true,
      buttons: {
        'Add to request list': function() {
                                     $(this).dialog('close');
                                     $('form').submit();
                               },
        'Cancel': function() {
                       $(this).dialog('close');
                  }
      }
});

次の操作を行うと、ボタンを取得できます。

var addToRequestListBtn = getDialogButton('myDialogBox','Add to request list');
var cancelBtn           = getDialogButton('myDialogBox','Cancel');

無効にするには:

addToRequestListBtn.attr('disabled', true).addClass( 'ui-state-disabled');
          cancelBtn.attr('disabled', true).addClass( 'ui-state-disabled');

有効にする:

addToRequestListBtn.attr('disabled', false).removeClass( 'ui-state-disabled');
          cancelBtn.attr('disabled', false).removeClass( 'ui-state-disabled');

3

参考までに、この投稿は私の問題を解決するのに役立ちました。つまり、disabled属性をfalseではなくdisabledに設定する必要があります。

_send_button.attr('disabled','disabled');

これはすべてのコードがどのように見えるかで、いくつかのスタイルを追加して無効にしたように見せています:

var _send_button = $('.ui-dialog-buttonpane button:contains(Send)');
var original_text = _send_button.text();
_send_button.text('Please wait...');
_send_button.addClass('ui-state-disabled');
_send_button.attr('disabled','disabled');
_send_button.fadeTo(500,0.2);

3

私はそれがすべてでうまくいくと思います、

<script type="text/javascript">
    $(document).ready(function() {
        $('#dialog').dialog('open');
        $(function(){
            $('#dialog').dialog({
                autoOpen: true,
                width: 400,
                modal: true,
                overlay: {
                    opacity: 0.8,
                    background: "black"
                },
                resizable: false,
                show: 'slow',
                buttons: {
                    //"OK":function() {
                    //    window.location="index.php?view=list";
                    //},
                    "Cancel": function() {
                        $(this).dialog("close");
                        $(this).attr("class", "button");
                    }
                }
            });

            var dlgFirstButton = $('.ui-dialog-buttonpane').find('button:first');
            dlgFirstButton.addClass('button');
        });
    });
</script>

2

ダイアログボックスの[保存]ボタンを無効にするには、関数で次の行を使用します。

$(".ui-dialog-buttonpane button:contains('Save')").attr("disabled", true).addClass("ui-state-disabled");

ボタンのテキストを変更するには、次の行を使用します(これにより、キャンセルボタンのテキストがClose Meに変更されます)

 $(".ui-dialog-buttonpane button:contains('Cancel') span").text("Close Me");

1

@Chris次のコード行を使用して、チェックボックスをオン/オフにするまでダイアログボタンを有効/無効にすることができます。

<div id="dialog-confirm" title="test">
    <label>Enable Confirm?<input type="checkbox" checked /></label>
</div>

    $("#dialog-confirm").dialog({
    resizable: false,
    height:240,
    modal: true,
    buttons: {
        Cancel: function() {
            $(this).dialog('close');
        },
        'Confirm': function() {
            $(this).dialog('close');
        }
    }
});

    $("#dialog-confirm :checkbox").change(function() {
        $(".ui-dialog-buttonpane button:contains('Confirm')")
           .button(this.checked ? "enable" : "disable");
    });

元のソース:http : //jsfiddle.net/nick_craver/rxZPv/1/


1

.attr("disabled", true)もちろん呼び出しは機能しますが、jQueryを使用すると、より「シュガー」な方法で実行したいので、簡単な拡張機能を記述しました。

(function( $ ) {
  $.fn.disable = function(isDisabled) {
    var val = isDisabled;
    if (isDisabled === undefined)
        val = true;
    this.attr("disabled", val);
  };
  $.fn.enable = function(isEnabled) {
    var val = !isEnabled;
    if (isEnabled === undefined)
        val = false;
    this.attr("disabled", val); 
  }
})( jQuery );

これで関数enable()disable()ができたので、そのように仕事をすることができます:

$('#continueButton').disable();

と同じです

$('#continueButton').disable(true);

そして

$('#continueButton').enable(false);

1

これは私のために仕事をしました:

$find("<%= btnPrint.ClientID %>").set_enabled(true);

1

jQueryの世界では、一連のDOM要素からオブジェクトを選択する場合は、eq()を使用する必要があります。

例:

var button = $( 'button')。eq(1);

または

var button = $( 'button:eq(1)');


1

ドキュメントによると:

https://api.jqueryui.com/dialog/#option-buttons

// Setter
$( ".selector" ).button( "option", "disabled", true );

ボタンを簡単に選択できるようにするには、ボタンに独自のCSSクラスを追加し、有効または無効にする必要があります。

// while initializing
$("#dialog").dialog({
...
buttons: [{
    disabled: true,
    text: "Add to request list",
    click: function (e: JQueryEventObject) {
        // Some logic
    },
    "class": "myDialogButton"
}]
...
});

次に、有効化/無効化は次のようになります。

$(".myDialogButton" ).button( "option", "disabled", (SOME_CONDITION) ? true : false);

0

誰かがクリックしたときにボタンを読み込みアニメーションのようなものに置き換えようとしている場合(たとえば、[送信]ボタンがダイアログでフォームを送信する場合)-次のようにボタンを画像に置き換えることができます。

...
buttons: {
    "Submit": function(evt) {
        $(evt.target).closest('button').replaceWith('<img src="loading.gif">');
    }
}

jQuery replaceWith docs


0

1つのボタンを無効にするには、ダイアログを開きます:

$("#InspectionExistingFacility").dialog({
    autoOpen: false, modal: true, width: 700, height: 550,
    open: function (event, ui) {
        $("#InspectionExistingFacility").parent().find(":button:contains('Next')").prop("disabled", true).addClass("ui-state-disabled");
    },
    show: { effect: "fade", duration: 600 }, hide: { effect: "slide", duration: 1000 },
    buttons: { 'Next step': function () { }, Close: function () { $(this).dialog("close"); } }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.