JavaScriptで小さなカレンダーポップアップを作成しました。 ASP.NETのCalendarコントロールを使用すると、非常に簡単です。 showModalDialogでポップアップウィンドウを呼び出します。モーダルウィンドウで、カレンダーの現在の月を変更すると、ポストバックが原因で問題が発生し、解決策がいくつかの場所にあることがわかりました。
<base target="_self"/>
aspxファイルの先頭部分。すべてがうまくいきます... 1つのことを除いて、そしてGoogle Chromeでのみ。選択した日付を取得するには、ポップアップのreturnValueをカレンダーで選択した日付に設定します。 IEおよびFirefoxでは常に機能します。ただし、Chromeでは、カレンダーで現在の月を変更しない場合にのみ機能します。変更するとすぐに、戻り値はshowModalDialogの呼び出し元には戻されません。モーダルウィンドウが元のウィンドウではなくなったかのようになり、戻り値は未定義です。
誰かがその動作を経験し、それを機能させるための提案を持っていますか? dialogArgumentsを使用して呼び出し元ウィンドウのトレースを維持しようとしましたが、最初のモーダルウィンドウにのみ渡されます(現在の月を変更すると失われます)。
呼び出しプロシージャのコード:
var d = window.showModalDialog(...)
モーダルウィンドウのコード:
window.returnValue = selectedDate;
self.close();
Teemuに言ったように、selectedDateとwindow.returnValueはどちらも常に正しいです。ただし、Google Chrome(カレンダーでの1か月の変更後)の場合、returnValueはshowModalDialogによって返されず、dは未定義です。
ページでshowModalDialogを使い続けるために、バグに対する独自の回避策を考え出す必要がありました。それで、これは...
Google Chromeでは、ポストバックの後、showModalDialogは常に未定義を返します。ただし、モーダルダイアログのwindow.openerプロパティは、ポストバック後でも、呼び出し元のウィンドウを指します。そこで、ダイアログの結果をその呼び出し元ウィンドウのreturnValueプロパティに入れることを考えました。そしてそれは機能します。
発信者ウィンドウで:
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
モーダルダイアログウィンドウで:
if (window.opener)
{
window.opener.returnValue = dateValue;
}
window.returnValue = dateValue;
self.close();
これと同じエラーが発生しました。フォーラムで見つけたのは、コントロールをupdatePanelとContentTemplateに配置すると機能するということです。
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
</ContentTemplate>
</asp:UpdatePanel>