javascript – showModalDialog non restituisce valore in Chrome

Ho creato un piccolo popup del calendario in Javascript. Molto semplice, usando il controllo Calendar da ASP.NET. Chiamo la finestra popup con showModalDialog. Nella finestra modale, la modifica del mese corrente del calendario causa problemi a causa del postback e ho trovato in diversi punti che la soluzione deve essere inserita:

 

nella parte principale del file aspx. Tutto funziona alla grande … tranne per una cosa, e solo in Google Chrome. Per recuperare la data selezionata, ho impostato il valore di ritorno del popup sulla data selezionata nel calendario. In IE e Firefox, funziona sempre. In Chrome, tuttavia, funziona solo se non cambio il mese corrente nel calendario. Non appena lo cambio, il valore restituito non viene restituito al chiamante di showModalDialog. È come se la finestra modale non fosse più quella originale; il valore di ritorno non è definito.

Qualcuno ha provato questo comportamento e ha un suggerimento per farlo funzionare? Ho provato a utilizzare dialogArguments per tenere traccia della finestra del chiamante, ma viene passato solo alla prima finestra modale (viene perso dopo aver cambiato il mese corrente).

Il codice nella procedura di chiamata:

 var d = window.showModalDialog(...) 

Il codice nella finestra modale:

 window.returnValue = selectedDate; self.close(); 

Come ho detto a Teemu, selectedDate e window.returnValue sono entrambi sempre corretti. Tuttavia, nel caso di Google Chrome (dopo un mese di modifica nel calendario), returnValue non viene passato indietro da showModalDialog e d non è definito.

Per continuare a usare showModalDialog nella mia pagina, ho dovuto inventare la mia soluzione per il bug. Quindi, eccolo …

In Google Chrome, dopo un postback, showModalDialog restituisce sempre undefined. Tuttavia, la proprietà window.opener nella finestra di dialogo modale punta alla finestra del chiamante, anche dopo i postback. Quindi, ho pensato di inserire il risultato della finestra di dialogo nella proprietà returnValue di quella finestra del chiamante. E funziona.

Nella finestra del chiamante:

 var prevReturnValue = window.returnValue; // Save the current returnValue window.returnValue = undefined; var dlgReturnValue = window.showModalDialog(...); if (dlgReturnValue == undefined) // We don't know here if undefined is the real result... { // So we take no chance, in case this is the Google Chrome bug dlgReturnValue = window.returnValue; } window.returnValue = prevReturnValue; // Restore the original returnValue At this point, use dlgReturnValue for further processing 

Nella finestra di dialogo modale:

 if (window.opener) { window.opener.returnValue = dateValue; } window.returnValue = dateValue; self.close(); 

Ho avuto lo stesso errore, quello che ho trovato in alcuni forum è che se metti i tuoi controlli in un updatePanel e ContentTemplate funzionerà: