2012-04-18 17 views
19

Ho creato un piccolo popup di calendario in Javascript. Molto semplice, usando il controllo Calendar da ASP.NET. Chiamo la finestra popup con showModalDialog. Nella finestra modale, cambiando il corrente mese di calendario provoca problemi a causa del postback, e ho trovato in molti luoghi che la soluzione è quella di mettere:javascript - showModalDialog non restituisce valore in Chrome

<base target="_self"/> 

nella parte di testa 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 chiamante:

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.

+0

Suoni più come la procedura per modificare il valore restituito nella finestra di dialogo modale fallisce in Chrome. – Teemu

+0

In tal caso, perché funziona quando resto nel mese corrente? – ConnorsFan

+0

Difficile dire senza vedere il codice ... – Teemu

risposta

24

Al fine di continuare ad usare showModalDialog nella mia pagina, ho dovuto venire con la mia soluzione per il bug. Così, qui è ...

In Google Chrome, dopo un postback, showModalDialog restituisce sempre indefinito. 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 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(); 
+5

+1 per un duro lavoro. Hai davvero camminato intorno al bug. Ho provato a riprodurre il tuo problema ieri sera, ma non sono riuscito a ottenere il valore "returnValue" anche dal dialogo invariato ... – Teemu

+1

Penso che questo sia il difetto Chromium originale (http://code.google.com/p/ cromo/temi/dettaglio?id = 42939) – robertc

+0

FYI sono passati quasi due anni e Chrome richiede ancora questa soluzione alternativa. – SouthShoreAK

0

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

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
      <ContentTemplate> 
      </ContentTemplate> 
</asp:UpdatePanel> 
Problemi correlati