Okno dialogowe jQuery UI - nie otwiera się po zamknięciu

79

Mam problem z jquery-ui dialog box .

Problem polega na tym, że kiedy zamykam okno dialogowe, a następnie klikam łącze, które je uruchamia, nie wyskakuje ono ponownie, chyba że odświeży stronę.

Jak mogę ponownie wywołać okno dialogowe bez odświeżania aktualnej strony.

Poniżej mój kod:

$(document).ready(function() {
    $('#showTerms').click(function()
    {
        $('#terms').css('display','inline');
        $('#terms').dialog({
            resizable: false,
            modal: true,
            width: 400,
            height: 450,
            overlay: { backgroundColor: "#000", opacity: 0.5 },
            buttons:{ "Close": function() { $(this).dialog("close"); } },
            close: function(ev, ui) { $(this).remove(); },
    }); 
});

Dzięki

David Bonnici
źródło

Odpowiedzi:

110

Właściwie powinieneś użyć go $("#terms").dialog({ autoOpen: false });do zainicjowania. Następnie możesz użyć, $('#terms').dialog('open');aby otworzyć okno dialogowe i $('#terms').dialog('close');zamknąć je.

Shane Fulmer
źródło
1
To działa doskonale. Dokumenty interfejsu użytkownika jQuery nie są tutaj zbyt jasne. Ale pomysł, że dialogfunkcja służy do inicjalizacji, pokazywania i ukrywania, miał dla mnie sens. Dzięki.
Steve Cooper
Jeśli ładujesz to okno dialogowe z HTML, które może się dynamicznie zmieniać, jest bardzo nieintuicyjne, dlaczego nie działa. Czy ktoś ma jakieś dobre rozwiązania, które można zastosować ogólnie w takich sytuacjach?
Milimetryczny
@Milimetric Zawsze możesz użyć $ (this) .remove (); na końcu każdego z przycisków twojego okna dialogowego, w ten sposób całe okno dialogowe zostanie całkowicie przerobione od zera, gdy ponownie je wywołasz. Zauważ, że ta funkcja działa inaczej niż $ (this) .dialog ("zniszcz"); ponieważ tylko przywraca okno dialogowe do stanu sprzed zainicjowania, bez niszczenia obiektu.
Jeff Noel
14

Rozwiązałem to.

Użyłem funkcji Destroy zamiast Close (nie ma to sensu), ale zadziałało.

$(document).ready(function() {
$('#showTerms').click(function()
{
    $('#terms').css('display','inline');
    $('#terms').dialog({resizable: false,
        modal: true,
        width: 400,
        height: 450,
        overlay: { backgroundColor: "#000", opacity: 0.5 },
        buttons:{ "Close": function() { $(this).dialog('**destroy**'); } },
        close: function(ev, ui) { $(this).close(); },
    });         
});   
$('#form1 input#calendarTEST').datepicker({ dateFormat: 'MM d, yy' });
});
David Bonnici
źródło
4
Destroy zadziała, jeśli użyjesz tej metody, ale aby funkcja close () działała, najpierw utwórz wystąpienie okna dialogowego, a następnie użyj okna dialog.show (), aby je wyświetlić, a następnie dialog.close (), aby je zamknąć, i otworzy się ponownie bez problemu .
RaeLehman
6
Prawie. Masz rację, jeśli chodzi o zainicjowanie go najpierw, ale potem jest to .dialog ("otwórz") i .dialog ("zamknij")
rdworth
12

w ostatniej linii nie $(this).remove()używaj$(this).hide() zamiast tego .

EDYCJA: Aby wyjaśnić, w przypadku zamknięcia kliknięcia usuwasz element #termsdiv z DOM, dlatego nie wraca. Zamiast tego musisz to tylko ukryć.

Darko Z
źródło
9

Uważam, że okno dialogowe można zainicjować tylko raz. W powyższym przykładzie próbowano zainicjować okno dialogowe za każdym razem, gdy kliknięto #terms. Spowoduje to problemy. Zamiast tego inicjalizacja powinna mieć miejsce poza zdarzeniem kliknięcia. Twój przykład powinien wyglądać mniej więcej tak:

$(document).ready(function() {
    // dialog init
    $('#terms').dialog({
        autoOpen: false,
        resizable: false,
        modal: true,
        width: 400,
        height: 450,
        overlay: { backgroundColor: "#000", opacity: 0.5 },
        buttons: { "Close": function() { $(this).dialog('close'); } },
        close: function(ev, ui) { $(this).close(); }
    });
    // click event
    $('#showTerms').click(function(){
        $('#terms').dialog('open').css('display','inline');      
    });
    // date picker
    $('#form1 input#calendarTEST').datepicker({ dateFormat: 'MM d, yy' });
});

Myślę, że kiedy już to wyjaśnisz, powinno rozwiązać opisany przez ciebie problem „otwórz z linku”.

26design
źródło
3

U mnie to podejście działa:

Okno dialogowe można zamknąć, klikając X w oknie dialogowym lub klikając „Bewaren”. Dodaję (dowolny) identyfikator, ponieważ muszę mieć pewność, że każdy fragment kodu HTML dodany do domeny zostanie później usunięty.

$('<div id="dossier_edit_form_tmp_id">').html(data.form)
.data('dossier_id',dossier_id)
.dialog({
        title: 'Opdracht wijzigen',
        show: 'clip',
        hide: 'clip',
        minWidth: 520,
        width: 520,
        modal: true,
        buttons: { 'Bewaren': dossier_edit_form_opslaan },
        close: function(event, ui){ 
                                  $(this).dialog('destroy'); 
                                  $('#dossier_edit_form_tmp_id').remove();
               }
});
Zilverdistel
źródło
3
 <button onClick="abrirOpen()">Open Dialog</button>

<script type="text/javascript">
var $dialogo = $("<div></div>").html("Aqui tu contenido(here your content)").dialog({
       title: "Dialogo de UI",
       autoOpen: false,
       close: function(ev, ui){
               $(this).dialog("destroy");
       }
 function abrirOpen(){
       $dialogo.dialog("open");
 }
});

//**Esto funciona para mi... (this works for me)**
</script>
Joanna Avalos
źródło
3

To jest bardzo stary wątek, ale ponieważ odpowiedź mówi nawet „To nie ma sensu”, pomyślałem, że dodam odpowiedź ...

Oryginalny post używał $ (this) .remove (); w module obsługi zamykania faktycznie usuwałoby to okno dialogowe div z DOM. Próba ponownego zainicjowania okna nie zadziała, ponieważ element div został usunięty.

Użycie $ (this) .dialog ('zniszcz') jest wywołaniem metody zniszcz zdefiniowanej w obiekcie dialogu, która nie usuwa go z DOM.

Z dokumentacji:

zniszczyć()

Całkowicie usuwa funkcję okna dialogowego. Spowoduje to przywrócenie elementu do jego >> stanu sprzed zainicjowania. Ta metoda nie przyjmuje żadnych argumentów.

To powiedziawszy, niszcz lub usuwaj tylko wtedy, gdy masz ku temu dobry powód.

kołyska
źródło
2
$(this).dialog('destroy');

Pracuje!

Benedikt
źródło
1

.close () jest bardziej ogólne i może być używane w odniesieniu do większej liczby obiektów. .dialog ('close') może być używane tylko z oknami dialogowymi

Jan
źródło
1

Używam okna dialogowego jako przeglądarki plików dialogowych i programu do przesyłania, a następnie przepisuję kod w ten sposób

var dialog1 = $("#dialog").dialog({ 
              autoOpen: false, 
              height: 480, 
              width: 640 
}); 
$('#tikla').click(function() {  
    dialog1.load('./browser.php').dialog('open');
});   

wszystko wydaje się działać świetnie.

edib
źródło
1

Miałem ten sam problem z oknem dialogowym nakładki jquery-ui - działało ono tylko raz, a następnie zatrzymywało się, chyba że ponownie załadowałem stronę. Znalazłem odpowiedź w jednym z ich przykładów -
Wiele nakładek na tej samej stronie
flowplayer_tools_multiple_open_close
- kto by to zrobił, prawda? :-) -

wydawało się, że ważne miejsce jest

oneInstance: false

więc teraz mam to tak -

$(document).ready(function() {

 var overlays = null;

 overlays = jQuery("a[rel]");

 for (var n = 0; n < overlays.length; n++) {

    $(overlays[n]).overlay({
        oneInstance: false, 
        mask: '#669966',
        effect: 'apple',
        onBeforeLoad: function() {
            overlay_before_load(this);
        }
    });

  }

}

i wszystko działa dobrze

mam nadzieję, że to komuś pomoże

O.

Oleg Ivanov
źródło