Jak mogę wyłączyć przycisk w oknie dialogowym interfejsu użytkownika jQuery?

143

Jak mam wyłączyć przycisk w oknie dialogowym interfejsu użytkownika jQuery . Nie mogę znaleźć tego w żadnej dokumentacji w powyższym linku.

Mam 2 przyciski do potwierdzenia modalnego („Potwierdź” i „Anuluj”). W niektórych przypadkach chcę wyłączyć przycisk „Potwierdź”.

leora
źródło
Zobacz odpowiedzi w tym wątku: stackoverflow.com/questions/577548/…
Erik
5
@Erik - Sytuacja nieco się zmieniła od czasu tych odpowiedzi, a mianowicie z powodu .button()wtyczki, więc niekoniecznie są to już najlepsze / najczystsze rozwiązania.
Nick Craver

Odpowiedzi:

158

Jeśli dołączasz .button()wtyczkę / widżet, który zawiera jQuery UI (jeśli masz pełną bibliotekę i korzystasz z wersji 1.8+, masz ją), możesz jej użyć, aby wyłączyć przycisk i wizualnie zaktualizować stan, na przykład:

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

Możesz spróbować tutaj ... lub jeśli korzystasz ze starszej wersji lub nie używasz widżetu przycisku, możesz go wyłączyć w następujący sposób:

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

Jeśli chcesz, aby znajdował się w określonym oknie dialogowym, powiedz według identyfikatora, zrób to:

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

W innych przypadkach, w których :contains()może dać fałszywe alarmy, możesz użyć .filter()tego w ten sposób, ale tutaj jest to przesada, ponieważ znasz swoje dwa przyciski. Jeśli tak jest w innych sytuacjach, wyglądałoby to tak:

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

Uniemożliwiłoby to :contains()dopasowanie podciągu czegoś innego.

Nick Craver
źródło
next () nie będzie działać dla mnie, ponieważ między oknem dialogowym a panelem przycisków znajduje się cały element div o zmiennej wielkości. Więc użyłem nextAll () i oddzieliłem buttonPan od przycisku:$("#dialogID").nextAll(".ui-dialog-buttonpane").find("button:contains('Confirm')").attr("disabled", true).addClass("ui-state-disabled");
Matthieu
Zauważ, że ponieważ panel przycisków nie jest elementem podrzędnym kontenera okien dialogowych, możesz mieć problemy, jeśli twoja strona definiuje wiele okien dialogowych.
Brett Ryan
Doskonałe rozwiązanie, $(".ui-dialog-buttonpane button:contains('Confirm')").button("disable");chociaż jeśli chcesz wyłączyć przycisk z funkcji, którą masz do niego, musisz dodać widżet do tego okna dialogowego i wyłączyć przycisk po tym; w ten sposób$(this).dialog("widget").find(".ui-dialog-buttonpane button:contains('Confirm')").button("disable");
meridius
3
Zauważ, że jeśli nie chcesz odpytywać żądanego przycisku na podstawie jego tekstu, możesz również nadać przyciskowi klasę; Okno dialogowe interfejsu użytkownika jQuery obsługuje tablicę z obiektami dla opcji przycisku, przy czym każdy obiekt zawiera informacje o atrybutach przycisków.
Dennis
To zadziałało dla mnie: $ (this) .closest (". Ui-dialog"). Find ("button: zawiera ('Zapisz')"). Prop ("disabled", true) .addClass ("ui-state- niepełnosprawny");
Adrian P.
217

Wygląda na to, że ktokolwiek, nawet w tym powiązanym pytaniu , zaproponował takie rozwiązanie, podobne do pierwszej części odpowiedzi udzielonej przez Nicka Cravera:

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

Następnie w innym miejscu powinieneś być w stanie użyć interfejsu API dla przycisku interfejsu jquery:

$("#button-ok").button("disable");
Nicola Tuveri
źródło
15
+1. Nie jestem pewien, dlaczego ta odpowiedź nie otrzymała więcej głosów. Jest najczystszy, z jakim się spotkałem i ładnie działa.
Doug Wilson
38
To musi być w dokumentach ... nie pokazuje nawet, że możesz przypisać identyfikator do przycisków.
Jay K
1
To bez wątpienia najlepsza odpowiedź. Istnieją inne rozwiązania, które robią to, wyszukując przycisk za pomocą selektorów, które są nieprawidłowe. Dobra robota Nicola!
jnoreiga
4
Zgadzam się: to rozwiązanie, które myślałem, że zespół UI powinien wdrożyć ...: +) Możesz to zrobić jeszcze szybciej:{text:"ok",disabled:true,click: function(){}}
Matthieu
10
To jest świetne! Możesz także użyć „class” zamiast „id”, jeśli martwisz się, że identyfikator jest unikalny. Chociaż będziesz musiał wpisać trochę więcej, aby wyszukać przycisk:$("#dialog").dialog("widget").find(".button-ok-class").button("enable")
desm
49

Można również użyć nie teraz udokumentowaną disabledatrybut:

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

    }]
});

Aby włączyć po otwarciu okna, użyj:

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

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

Jérôme
źródło
Nie chodzi o to, że jest to nieudokumentowane. Chodzi o to, że podczas przetwarzania przycisków wszystkie właściwości z obiektu są wykonywane względem ich odpowiednika właściwości jQuery. Na przykład możesz dodać, attr: { 'data-value' : 'some value here' }jeśli chcesz dodać atrybut data-valuedo przycisku.
zmiażdżyć
2
Nie jest już nieudokumentowane. To jest oficjalne.
Salman A
To rozwiązanie jest znacznie bardziej eleganckie niż bardziej popularna wersja. Pozwala to na całą elastyczność bez problemu z błędnie zdefiniowanymi selektorami.
KimvdLinde
Należy pamiętać, że disabledatrybut musi zostać przypisany podczas tworzenia przycisków.
user1032531
Próbowałem zagłosować przeciw, ale zagłosowałem za 4 godziny temu i nie mogę tego zrobić. Wydaje się, że to rozwiązanie nie działa już prawidłowo.
user1032531
7

Następujące funkcje działają z poziomu funkcji klikania przycisków:

$(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');
            }
        }
    });
}
Chris Pietschmann
źródło
ale potem musisz kliknąć, zanim zostanie wyszarzony.
Matt
1

Przycisk jest identyfikowany przez klasę ui-button. Aby wyłączyć przycisk:

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

O ile nie tworzysz dynamicznie okna dialogowego (co jest możliwe), będziesz znać położenie przycisku. Tak więc, aby wyłączyć pierwszy przycisk:

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

ui-state-disabledKlasa jest co daje przycisk miłe przyciemnione styl.

Chris Laplante
źródło
1

Stworzyłem funkcję jQuery, aby nieco ułatwić to zadanie. Prawdopodobnie teraz jest lepsze rozwiązanie ... tak czy inaczej, oto moje 2 centy. :)

Po prostu dodaj to do swojego pliku 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;}
});};

Wyłącz przycisk „OK” w oknie dialogowym z klasą „dialog”:

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

Włącz wszystkie przyciski:

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

Włącz przycisk „Zamknij” i zmień kolor:

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

Tekst na wszystkich przyciskach czerwony:

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

Mam nadzieję że to pomoże :)

sergiodlopes
źródło
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' );
    }
}
Ronny Sherer
źródło
1

Możesz nadpisać tablicę przycisków i pozostawić tylko te, których potrzebujesz.

$( ".selector" ).dialog( "option", "buttons", [{
    text: "Close",
    click: function() { $(this).dialog("close"); }
}] );
jfredys
źródło
1

ten kod wyłącza przycisk z „YOUR_BUTTON_LABEL”. możesz zamienić nazwę w zawiera (). wyłączyć

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

zastąp „YOUR_BUTTON_LABEL” etykietą swojego przycisku. umożliwić

$(".ui-dialog-buttonpane button:contains('YOUR_BUTTON_LABEL')").button("enable");
Sumeet_Pol
źródło
0

Możesz to zrobić, aby wyłączyć pierwszy przycisk, na przykład:

$('.ui-dialog-buttonpane button:first').attr('disabled', 'disabled');
Darin Dimitrov
źródło
0

Sposób, w jaki to robię, jest Cancel: function(e) { $(e.target).attr( "disabled","disabled" ); }

To najkrótszy i najłatwiejszy sposób, jaki znalazłem.

Bhavin
źródło
0

Jeśli używasz nokautu, to jeszcze czystszy. Wyobraź sobie, że masz:

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>

Magia pochodzi ze źródła interfejsu użytkownika jQuery :

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

Możesz w zasadzie wywołać DOWOLNĄ funkcję instancji jQuery, przepuszczając ją przez obiekt przycisku.

Na przykład, jeśli chcesz używać HTML:

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

Lub, jeśli chcesz dodać klasę do przycisku (możesz to zrobić na wiele sposobów):

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

Może jesteś szalony i chcesz usunąć przycisk z domeny, gdy jest najechany:

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

Jestem naprawdę zaskoczony, że nikt nie wspomniał o tym w niezliczonej liczbie takich wątków ...

zmiażdżyć
źródło
0

To zadziałało dla mnie -

$("#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" );
                                    }
                                }
                        });
                    }
                });
        }
    }
}); 
Pramod Kumar
źródło
0

Możesz wyłączyć przycisk podczas tworzenia okna dialogowego:

$(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>

Lub możesz go wyłączyć w dowolnym momencie po utworzeniu okna dialogowego:

$(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>

Salman A
źródło