18

Javascriptで小さなカレンダーポップアップを作成しました。ASP.NETのCalendarコントロールを使用すると、非常に簡単です。showModalDialogを使用してポップアップウィンドウを呼び出します。モーダルウィンドウで、カレンダーの現在の月を変更すると、ポストバックが原因で問題が発生します。いくつかの場所で、解決策は次のようになります。

<base target="_self"/>

aspxファイルのヘッド部分にあります。すべてがうまく機能します...1つを除いて、GoogleChromeでのみです。選択した日付に戻すために、ポップアップの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は未定義です。

4

2 に答える 2

24

私のページでshowModalDialogを使い続けるために、私はバグの独自の回避策を考え出す必要がありました。だから、ここにあります...

Google Chromeでは、ポストバック後、showModalDialogは常にundefinedを返します。ただし、モーダルダイアログの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();
于 2012-04-19T18:33:40.670 に答える
0

これと同じエラーが発生しました。いくつかのフォーラムで見つけたのは、コントロールをupdatePanelとContentTemplateに配置すると、次のように機能することです。

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
           <ContentTemplate>
           </ContentTemplate>
 </asp:UpdatePanel>
于 2014-03-27T00:44:19.870 に答える