javascript - showModalDialog 在 Chrome 中不返回值

IT技术 javascript return-value showmodaldialog
2021-03-04 09:32:11

我用 Javascript 制作了一个小日历弹出窗口。非常简单,使用来自 ASP.NET 的 Calendar 控件。我用 showModalDialog 调用弹出窗口。在模态窗口中,更改日历的当前月份因为回发导致出现问题,我在几个地方找到了解决方案:

<base target="_self"/>

在 aspx 文件的头部。一切都很好......除了一件事,而且只在谷歌浏览器中。为了取回选定的日期,我将弹出窗口的 returnValue 设置为日历中选定的日期。在 IE 和 Firefox 中,它始终有效。但是,在 Chrome 中,它仅在我不更改日历中的当前月份时才有效。一旦我改变它,返回值就不会传回给 showModalDialog 的调用者。就好像模态窗口不再是原来的窗口了;返回值未定义。

有没有人经历过这种行为并有建议让它发挥作用?我尝试使用 dialogArguments 来跟踪调用者窗口,但它仅传递到第一个模式窗口(更改当前月份后丢失)。

调用过程中的代码:

var d = window.showModalDialog(...)

模态窗口中的代码:

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

正如我对 Teemu 所说的, selectedDate 和 window.returnValue 都是正确的。但是,在 Google Chrome 的情况下(日历更改一个月后),showModalDialog 不会传回 returnValue,并且 d 未定义。

2个回答

为了继续在我的页面中使用 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();
2021-05-02 09:32:11
仅供参考,差不多两年后了,Chrome 仍然需要这种解决方法。
2021-05-02 09:32:11
+1 表示辛勤工作。你真的绕过了这个错误。我昨晚试图重现您的问题,但我无法从未returnValue更改的对话框中获得平衡...
2021-05-06 09:32:11
仅供参考,现在它的市场“无法修复”,因为 showModalDialog 将来将从 Chrome 中完全删除:( code.google.com/p/chromium/issues/detail?id=42939#c36
2021-05-09 09:32:11
2021-05-18 09:32:11

我遇到了同样的错误,我在某个论坛中发现,如果您将控件放在 updatePanel 和 ContentTemplate 中,它将起作用:

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