web-dev-qa-db-fra.com

javascript - showModalDialog ne renvoie pas de valeur dans Chrome

J'ai fait un petit calendrier popup en Javascript. Très simple, en utilisant le contrôle Calendar de ASP.NET. J'appelle la fenêtre contextuelle avec showModalDialog. Dans la fenêtre modale, la modification du mois en cours du calendrier pose des problèmes en raison de la publication (postback). J'ai trouvé à plusieurs endroits que la solution consistait à mettre:

<base target="_self"/>

dans la partie principale du fichier aspx. Tout fonctionne très bien ... sauf pour une chose, et uniquement dans Google Chrome. Pour récupérer la date sélectionnée, je règle la valeur de retour de la fenêtre contextuelle sur la date sélectionnée dans le calendrier. Dans IE et Firefox, cela fonctionne toujours. Dans Chrome, cependant, cela ne fonctionne que si je ne change pas le mois en cours dans le calendrier. Dès que je le modifie, la valeur de retour n'est pas renvoyée à l'appelant de showModalDialog. C'est comme si la fenêtre modale n'était plus celle d'origine; la valeur de retour est indéfinie.

Quelqu'un a-t-il déjà expérimenté ce comportement et suggéré de le faire fonctionner? J'ai essayé d'utiliser dialogArguments pour garder une trace de la fenêtre de l'appelant, mais celle-ci n'est transmise qu'à la première fenêtre modale (elle est perdue après le changement du mois en cours). 

Le code dans la procédure appelante:

var d = window.showModalDialog(...)

Le code dans la fenêtre modale:

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

Comme je l'ai dit à Teemu, selectedDate et window.returnValue sont toujours corrects. Toutefois, dans le cas de Google Chrome (après un changement d'un mois dans le calendrier), returnValue n'est pas renvoyé par showModalDialog et d n'est pas défini.

18
ConnorsFan

Afin de continuer à utiliser showModalDialog dans ma page, je devais trouver ma propre solution de contournement pour le bogue. Donc, le voici ...

Dans Google Chrome, après une publication, showModalDialog retourne toujours indéfini. Toutefois, la propriété window.opener de la boîte de dialogue modale pointe vers la fenêtre de l'appelant, même après les publications. J'ai donc pensé mettre le résultat du dialogue dans la propriété returnValue de la fenêtre de l'appelant. Et il fonctionne.

Dans la fenêtre de l'appelant:

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

Dans la fenêtre de dialogue modale:

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

J'ai eu cette même erreur, ce que j'ai trouvé dans un forum est que si vous mettez vos contrôles dans un updatePanel et ContentTemplate cela fonctionnera:

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
           <ContentTemplate>
           </ContentTemplate>
 </asp:UpdatePanel>
0
Bachask8