2011-08-17 9 views
5

La finestra di dialogo dell'interfaccia utente jQuery mi guida su per le pareti. Per il meglio della mia comprensione, ecco come funziona:La finestra di dialogo dell'interfaccia utente jQuery si comporta in modo imprevedibile

Quando si esegue $('#myDialog').dialog({...}), copia l'elemento #myDialog e lo sposta all'interno di questa bizzarra funzione di widget nella parte inferiore del tag del corpo. Questo è pazzesco! Duplicherà eventualmente elementi DOM unici (con ID) quando lo fa.

Quindi quello che sto cercando di fare è comportarsi in modo prevedibile quando aggiorno l'HTML dell'elemento originale (#myDialog). Se faccio questo in modo dinamico, a volte la finestra non si apre più:

http://jsfiddle.net/t67y7/3/

O, talvolta, la finestra si apre con il vecchio HTML (perché è memorizzato nella cache nella parte inferiore della pagina in questo modo). Cosa succede con questo?

risposta

1

Perché non basta chiamare $ ("# dialogId") finestra di dialogo ("distruggere") sulla funzione di chiusura, in questo modo:.

$("#dialogId").dialog({ 
    close: function() { 
     $(this).dialog("destroy"); 
     // you may want empty content after close if you use AJAX request to get content for dialog 
     $(this).html(''); 
    } 
} 

La distruggere funzione rimuove il codice decorato, e la vostra l'elemento di dialogo non sarà duplicato la prossima volta che mostrerai la finestra di dialogo.

Ho aggiunto un codice di esempio a jsfiddle.net example.

+0

Puoi pubblicare un esempio di js fiddle con questo funzionamento? L'ultima volta che l'ho provato, il destroy ha distrutto il dialogo e ho dovuto ricrearlo. Anche questo è stato male. – Milimetric

+0

Ho aggiornato la risposta con un esempio su js fiddle – binhgreat

+0

Hm, odio essere un pignolo, ma quell'esempio non copre il problema che ho postato qui. Nota che su jsfiddle puoi postare una richiesta ajax echo ('/ echo/html /') per simulare più da vicino ciò che sto avendo problemi. – Milimetric

5

Dal momento che nessuno sembra avere alcuna idea di come domare questo dialogo bestiale, ecco la cosa migliore che abbia mai inventato. Accetterò qualsiasi alternativa superiore.

var original = $('#dialogId')[0]; 
var clone = $(original).clone().attr('id', 'dialogIdClone'); 
var saveHtml = $(original).html(); 
$(original).html(''); 
$(clone).dialog({ 
    ... // other options 
    open: function(){ 
     // add any dynamic behavior you need to the dialog here 
    }, 
    close: function(){ 
     $(clone).remove(); 
     $(original).html(saveHtml); 
    } 
}); 

Lo scopo di questa follia è mantenere l'HTML della finestra di dialogo originale univoco nella pagina. Non sono proprio sicuro del perché questo non possa essere il comportamento predefinito della finestra di dialogo ... In realtà, non capisco perché l'interfaccia utente di jQuery abbia bisogno di clonare l'HTML per cominciare.

+1

Avevo problemi con il caricamento dinamico di Hicharts e il secondo trigger modale non visualizzava il grafico. Ho esaminato altre potenziali risoluzioni, ma questa è l'unica che ha funzionato. Grazie! –

+1

Prego :) Non posso credere che fino ad oggi il mio brutto attacco sia ancora migliore del comportamento di dialogo predefinito. – Milimetric

2

So che questo è stato registrato per un po ', ma un modo meno esteso di gestire questo problema potrebbe essere:

$('#your-dialog').dialog({ 
    ... // other options 
    open: function(){ 
     // add any dynamic behavior you need to the dialog here 
    }, 
    close: function(){ 

    } 
}); 
$('#your-dialog').remove(); 

Ciò è dovuto al dialogo widget di vuole essere in grado di controllare la visualizzazione e andrà a capo il contenuto interno della finestra di dialogo originale quindi ne crea uno nuovo nella parte inferiore del corpo.

Lo svantaggio di questa soluzione è che le finestre di dialogo devono essere inizializzate per garantire che tutto il widget della libreria di terze parti funzioni correttamente.

+1

Sì, questo purtroppo non funziona se non si vuole perdere tempo a creare finestre di dialogo all'inizio del ciclo di vita della pagina. È passato molto tempo da quando ho postato questa domanda, grazie per la risposta! Penso che sia pazzesco che, nonostante il lungo tempo, il problema sia sempre lo stesso e che non ci siano segnali da parte del team di jQuery UI che vogliono risolvere questo problema. È una delle cose più strane su quella struttura. – Milimetric

0

È necessario svuotare la finestra di dialogo prima di aprirla.

$("#dialogId").html(''); 
$("#dialogId").dialog({ 
close: function() { 
    $(this).dialog("destroy"); 
} 
} 
Problemi correlati