2012-04-18 17 views
19

Hice una pequeña ventana emergente de calendario en Javascript. Muy simple, usando el control Calendar de ASP.NET. Llamo a la ventana emergente con showModalDialog. En la ventana modal, el cambio del mes en curso del mes, ocasiona problemas a causa de la devolución de datos, y que se encuentra en varios lugares que la solución es poner:javascript - showModalDialog no devuelve valor en Chrome

<base target="_self"/> 

en la parte de la cabeza del archivo aspx. Todo funciona bien ... excepto por una cosa, y solo en Google Chrome. Para recuperar la fecha seleccionada, configuro returnValue de la ventana emergente a la fecha seleccionada en el calendario. En IE y Firefox, siempre funciona. En Chrome, sin embargo, funciona solo si no cambio el mes actual en el calendario. Tan pronto como lo cambio, el valor de retorno no se transfiere a la persona que llama de showModalDialog. Es como si la ventana modal ya no fuera la original; el valor de retorno no está definido.

¿Alguien ha experimentado ese comportamiento y tiene una sugerencia para que funcione? Traté de usar dialogArguments para mantener el rastro de la ventana de la persona que llama pero se pasa solo a la primera ventana modal (se pierde después de cambiar el mes actual).

El código en el procedimiento de llamada:

var d = window.showModalDialog(...) 

El código en la ventana modal:

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

Como dije a Teemu, selectedDate y window.returnValue siempre estén las correctas. Sin embargo, en el caso de Google Chrome (después de un cambio de mes en el calendario), showModalDialog no devuelve returnValue yd no está definido.

+0

Suena más como su procedimiento para cambiar el 'returnValue' en el diálogo modal falla en Chrome – Teemu

+0

En ese caso, ¿por qué funciona cuando me quedo en el mes actual? – ConnorsFan

+0

Difícil de decir sin ver el código ... – Teemu

Respuesta

24

Para seguir usando showModalDialog en mi página, tuve que idear mi propia solución para el error. Entonces, aquí está ...

En Google Chrome, después de una devolución de datos, showModalDialog siempre devuelve indefinido. Sin embargo, la propiedad window.opener en el cuadro de diálogo modal apunta a la ventana de la persona que llama, incluso después de las devoluciones. Entonces, pensé en poner el resultado del diálogo en la propiedad returnValue de esa ventana de llamador. Y funciona.

En la ventana de llamadas:

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 

En la ventana de diálogo modal:

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

+1 por un trabajo duro. Realmente has recorrido el error. Traté de reproducir tu problema anoche, pero no pude obtener el 'returnValue' incluso del diálogo sin cambios ... – Teemu

+1

Creo que [este es el defecto original de Chromium] (http://code.google.com/p/ cromo/problemas/detalles?id = 42939) – robertc

+0

Para su información es casi dos años después y Chrome aún requiere esta solución. – SouthShoreAK

0

tuve este mismo error, lo que encontré en algún foro es que si usted pone sus controles en una updatePanel y ContentTemplate funcionará:

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
      <ContentTemplate> 
      </ContentTemplate> 
</asp:UpdatePanel> 
Cuestiones relacionadas