web-dev-qa-db-ja.com

javascript-showModalDialogがChromeに値を返さない

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は未定義です。

18
ConnorsFan

ページで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();
24
ConnorsFan

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

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