jQuery UI 대화 상자에서 버튼을 비활성화하려면 어떻게해야합니까?


143

jQuery UI 대화 상자 에서 버튼 비활성화하는 방법은 무엇입니까 ? 위 링크의 문서에서 찾을 수없는 것 같습니다.

모달 확인에 2 개의 버튼이 있습니다 ( "확인"및 "취소"). 어떤 경우에는 "확인"버튼을 비활성화하고 싶습니다.


이 글타래에서 답변을 확인하십시오 : stackoverflow.com/questions/577548/…
Erik

5
@Erik- .button()플러그인 때문에 그 대답 이후 상황이 약간 바뀌 었으므로 더 이상 최상의 / 깨끗한 솔루션은 아닙니다.
Nick Craver

답변:


158

당신이 포함하고 만약 .button()플러그인 / 위젯 jQuery를 UI가 (당신이 전체 라이브러리를 가지고 있고 1.8 이상에있는 경우, 당신은 그것을 가지고) 버튼을 비활성화하는 데 사용할 수 있습니다 포함되어 있는지 같은 시각적 상태를 업데이트 :

$(".ui-dialog-buttonpane button:contains('Confirm')").button("disable");

여기에서 시도해 볼 수 있습니다 ... 또는 이전 버전이거나 버튼 위젯을 사용하지 않는 경우 다음과 같이 비활성화 할 수 있습니다.

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

특정 대화 상자 내에서 ID로 말하면 다음과 같이하십시오.

$("#dialogID").next(".ui-dialog-buttonpane button:contains('Confirm')")
              .attr("disabled", true);

:contains()거짓 긍정을 줄 수 있는 다른 경우에는 다음 .filter()과 같이 사용할 수 있지만 두 개의 버튼을 알고 있기 때문에 여기에서 과잉입니다. 경우 그 다른 상황의 경우, 그것은 다음과 같을 것입니다 :

$("#dialogID").next(".ui-dialog-buttonpane button").filter(function() {
  return $(this).text() == "Confirm";
}).attr("disabled", true);

이렇게하면 :contains()다른 문자열이 일치 하지 않습니다.


대화 상자와 버튼 사이에 모든 "크기 조정 가능"div가 있으므로 next ()가 작동하지 않습니다. 그래서 nextAll ()을 사용하고 buttonPan을 버튼과 분리했습니다.$("#dialogID").nextAll(".ui-dialog-buttonpane").find("button:contains('Confirm')").attr("disabled", true).addClass("ui-state-disabled");
Matthieu

버튼 창이 대화 상자 컨테이너의 하위가 아니기 때문에 페이지가 여러 대화 상자를 정의하면 문제가 발생할 수 있습니다.
Brett Ryan

$(".ui-dialog-buttonpane button:contains('Confirm')").button("disable");당신이 가지고있는 기능에서 버튼을 비활성화하려면 훌륭한 대화 상자 를 위젯 화 하고 그 후에 버튼을 비활성화해야합니다. 이처럼$(this).dialog("widget").find(".ui-dialog-buttonpane button:contains('Confirm')").button("disable");
meridius

3
원하는 버튼을 텍스트로 쿼리하지 않으려면 버튼에 클래스를 제공 할 수도 있습니다. jQuery UI의 대화 상자는 버튼 옵션에 대한 객체가 포함 된 배열을 지원하며 각 객체는 버튼 속성에 대한 정보를 포함합니다.
Dennis

이것은 나를 위해 일했다 : $ (this) .closest ( ". ui-dialog"). find ( "button : contains ( 'Save')"). prop ( "disabled", true) .addClass ( "ui-state- 비활성화 됨 ");
Adrian P.

217

도에 사람처럼 보이는 이 링크 된 질문 , 닉 Craver에 의해 주어진 답의 첫 번째 부분과 유사한이 솔루션을 제안 하였다 :

$("#dialog").dialog({
    width: 480,
    height: "auto",
    buttons: [
        {
            id: "button-cancel",
            text: "Cancel",
            click: function() {
                $(this).dialog("close");
            }
        },
        {
            id: "button-ok",
            text: "Ok",
            click: function() {
                $(this).dialog("close");
            }
        }
    ]
});

그런 다음 다른 곳 에서 jquery UI 버튼에 API 를 사용할 수 있어야 합니다.

$("#button-ok").button("disable");

15
+1. 이 답변이 더 많은 표를받지 못한 이유를 잘 모르겠습니다. 내가 만난 가장 깨끗하고 잘 작동합니다.
Doug Wilson

38
이것은 문서에 있어야합니다 ... ID를 버튼에 할당 할 수 있음을 보여 주지도 않습니다.
Jay K

1
이것은 의심의 여지없이 가장 좋은 대답입니다. 잘못된 선택기를 사용하여 버튼을 검색하여 다른 솔루션이 있습니다. 잘 했어 니콜라!
jnoreiga

4
동의 : 그것은 UI 팀이 구현해야한다고 생각한 솔루션입니다 ... : +) 더 빨리 할 수 ​​있습니다 :{text:"ok",disabled:true,click: function(){}}
Matthieu

10
대단해! ID가 고유한지 걱정되는 경우 "id"대신 "class"를 사용할 수도 있습니다. 버튼을 검색하려면 조금 더 입력해야합니다.$("#dialog").dialog("widget").find(".button-ok-class").button("enable")
desm

49

지금 문서화 되지 않은disabled 속성을 사용할 수도 있습니다 .

$("#element").dialog({
    buttons: [
    {
        text: "Confirm",
        disabled: true,
        id: "my-button-1"
    }, 
    {
        text: "Cancel",
        id: "my-button-2",
        click: function(){            
               $(this).dialog("close");
        }  

    }]
});

대화 상자를 연 후 활성화하려면 다음을 사용하십시오.

$("#my-button-1").attr('disabled', false);

JSFiddle : http://jsfiddle.net/xvt96e1p/4/


문서화되지 않은 것은 아닙니다. 버튼이 처리되면 객체의 모든 속성이 해당 jQuery 속성에 대해 실행됩니다. 예를 들어 버튼에 attr: { 'data-value' : 'some value here' }속성 data-value을 추가하려는 경우 추가 할 수 있습니다 .
호감

2
더 이상 문서화되지 않았습니다. 공식입니다.
Salman A

이 솔루션은 널리 사용되는 버전보다 훨씬 우아합니다. 이를 통해 Vagely 정의 된 선택기 문제없이 모든 유연성을 확보 할 수 있습니다.
KimvdLinde

점을 유의 disabled버튼을 만들 때 속성을 할당해야합니다.
user1032531

공감하려고했지만 4 시간 전에 공감했는데 그렇게 할 수 없습니다. 이 솔루션은 더 이상 제대로 작동하지 않는 것 같습니다.
user1032531

7

버튼 클릭 기능 내에서 다음이 작동합니다.

$(function() {
    $("#dialog").dialog({
        height: 'auto', width: 700, 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');
            }
        }
    });
}

회색으로 표시되기 전에 클릭해야합니다.
Matt

1

버튼은 클래스로 식별됩니다 ui-button. 버튼을 비활성화하려면 :

$("#myButton").addClass("ui-state-disabled").attr("disabled", true);

대화 상자를 동적으로 작성하지 않는 한 (가능한 경우) 단추의 위치를 ​​알게됩니다. 따라서 첫 번째 버튼을 비활성화하려면

$("#myButton:eq(0)").addClass("ui-state-disabled").attr("disabled", true);

ui-state-disabled클래스는 멋진 스타일을 흐리게하는 버튼을 제공하는 것이다.


1

이 작업을 좀 더 쉽게하기 위해 jQuery 함수를 만들었습니다. 아마도 지금은 더 나은 해결책이있을 것입니다 ... 어느 쪽이든, 여기 내 2 센트가 있습니다. :)

이것을 JS 파일에 추가하십시오.

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

클래스 'dialog'가있는 대화 상자에서 '확인'버튼을 비활성화하십시오.

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

모든 버튼을 활성화합니다 :

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

'닫기'버튼을 활성화하고 색상을 변경하십시오.

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

모든 버튼의 텍스트가 빨간색 :

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

도움이 되었기를 바랍니다 :)


1
function getDialogButton( jqUIdialog, button_names )
{
    if (typeof button_names == 'string')
        button_names = [button_names];
    var buttons = jqUIdialog.parent().find('.ui-dialog-buttonpane button');
    for (var i = 0; i < buttons.length; i++)
    {
        var jButton = $( buttons[i] );
        for (var j = 0; j < button_names.length; j++)
            if ( jButton.text() == button_names[j] )
                return jButton;
    }

    return null;
}

function enableDialogButton( jqUIdialog, button_names, enable )
{
    var button = getDialogButton( jqUIdialog, button_names );
    if (button == null)
        alert('button not found: '+button_names);
    else
    {
        if (enable)
            button.removeAttr('disabled').removeClass( 'ui-state-disabled' );
        else
            button.attr('disabled', 'disabled').addClass( 'ui-state-disabled' );
    }
}

1

버튼 배열을 덮어 쓸 수 있고 필요한 것만 남길 수 있습니다.

$( ".selector" ).dialog( "option", "buttons", [{
    text: "Close",
    click: function() { $(this).dialog("close"); }
}] );

1

이 코드는 'YOUR_BUTTON_LABEL'이있는 버튼을 비활성화합니다. contains ()에서 이름을 바꿀 수 있습니다. 비활성화

$(".ui-dialog-buttonpane button:contains('YOUR_BUTTON_LABEL')").button("disable");

'YOUR_BUTTON_LABEL'을 버튼 레이블로 바꾸십시오. 사용하려면

$(".ui-dialog-buttonpane button:contains('YOUR_BUTTON_LABEL')").button("enable");

0

예를 들어 첫 번째 버튼을 비활성화하려면 다음을 수행하십시오.

$('.ui-dialog-buttonpane button:first').attr('disabled', 'disabled');

0

내가하는 방법은 Cancel: function(e) { $(e.target).attr( "disabled","disabled" ); }

이것이 내가 찾은 가장 짧고 쉬운 방법입니다.


0

녹아웃을 사용하는 경우 더 깨끗합니다. 다음이 있다고 상상해보십시오.

var dialog = $('#my-dialog').dialog({
    width: '100%',
    buttons: [
        { text: 'Submit', click: $.noop, 'data-bind': 'enable: items() && items().length > 0, click: onSubmitClicked' },
        { text: 'Enable Submit', click: $.noop, 'data-bind': 'click: onEnableSubmitClicked' }
    ]
});

function ViewModel(dialog) {
    var self = this;

    this.items = ko.observableArray([]);

    this.onSubmitClicked = function () {
        dialog.dialog('option', 'title', 'On Submit Clicked!');
    };

    this.onEnableSubmitClicked = function () {
        dialog.dialog('option', 'title', 'Submit Button Enabled!');
        self.items.push('TEST ITEM');
        dialog.text('Submit button is enabled.');
    };
}

var vm = new ViewModel(dialog);
ko.applyBindings(vm, dialog.parent()[0]); //Don't forget to bind to the dialog parent, or the buttons won't get bound.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<div id="my-dialog">
  Submit button is disabled at initialization.
</div>

마술은 jQuery UI 소스 에서 비롯됩니다 .

$( "<button></button>", props )

기본적으로 버튼 객체를 통해 모든 jQuery 인스턴스 함수를 호출 할 수 있습니다.

예를 들어 HTML을 사용하려는 경우 :

{ html: '<span class="fa fa-user"></span>User' }

또는 버튼에 클래스를 추가하려는 경우 (여러 가지 방법으로 수행 할 수 있음) :

{ addClass: 'my-custom-button-class' }

어쩌면 당신은 견딜 수 있으며 버튼을 가리킬 때 돔에서 버튼을 제거하고 싶을 수도 있습니다.

{ mouseover: function () { $(this).remove(); } }

아무도 이처럼 수많은 스레드에서 이것을 언급하지 않은 것으로 놀랐습니다 ...


0

이것은 나를 위해 일했다.

$("#dialog-confirm").html('Do you want to permanently delete this?');
$( "#dialog-confirm" ).dialog({
    resizable: false,
    title:'Confirm',
    modal: true,
    buttons: {
        Cancel: function() {
            $( this ).dialog( "close" );
        },
        OK:function(){
            $('#loading').show();
            $.ajax({
                    type:'post',
                    url:'ajax.php',
                    cache:false,
                    data:{action:'do_something'},
                    async:true,
                    success:function(data){
                        var resp = JSON.parse(data);
                        $("#loading").hide();
                        $("#dialog-confirm").html(resp.msg);
                        $( "#dialog-confirm" ).dialog({
                                resizable: false,
                                title:'Confirm',
                                modal: true,
                                buttons: {
                                    Close: function() {
                                        $( this ).dialog( "close" );
                                    }
                                }
                        });
                    }
                });
        }
    }
}); 

0

대화 상자를 구성 할 때 버튼을 비활성화 할 수 있습니다.

$(function() {
  $("#dialog").dialog({
    modal: true,
    buttons: [
      { text: "Confirm", click: function() { $(this).dialog("close"); }, disabled: true },
      { text: "Cancel", click: function() { $(this).dialog("close"); } }
    ]
  });
});
@import url("https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.min.css");
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>

<div id="dialog" title="Confirmation">
  <p>Proceed?</p>
</div>

또는 대화 상자가 생성 된 후 언제든지 비활성화 할 수 있습니다.

$(function() {
  $("#dialog").dialog({
    modal: true,
    buttons: [
      { text: "Confirm", click: function() { $(this).dialog("close"); }, "class": "confirm" },
      { text: "Cancel", click: function() { $(this).dialog("close"); } }
    ]
  });
  setTimeout(function() {
    $("#dialog").dialog("widget").find("button.confirm").button("disable");
  }, 2000);
});
@import url("https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.min.css");
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>

<div id="dialog" title="Confirmation">
  <p>Button will disable after two seconds.</p>
</div>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.