我用Javascript制作了一个小日历弹出窗口。非常简单,使用ASP.NET的Calendar控件。我用showModalDialog调用弹出窗口。在模式窗口中,由于回发,更改日历的当前月份会导致问题,我发现要放置解决方案的地方很多:

<base target="_self"/>

在aspx文件的头部。一切正常,除了一件事之外,只有在Google Chrome中才可以。为了取回选定的日期,我将弹出窗口的returnValue设置为日历中选定的日期。在IE和Firefox中,它始终有效。但是,在Chrome浏览器中,只有当我不更改日历中的当前月份时,它才起作用。更改后,返回值不会立即传递回showModalDialog的调用方。好像模态窗口不再是原始窗口一样。返回值是不确定的。

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

调用过程中的代码:
var d = window.showModalDialog(...)

模态窗口中的代码:
window.returnValue = selectedDate;
self.close();

正如我对Teemu所说的那样,selectedDate和window.returnValue总是正确的。但是,对于谷歌浏览器(在日历中更改一个月后),showModalDialog不会传回returnValue,并且d是未定义的。

最佳答案

为了继续在页面中使用showModalDialog,我不得不针对该错误提出自己的解决方法。所以,这是...

在Google Chrome浏览器中,回发后,showModalDialog始终返回未定义。但是,即使回发之后,模式对话框中的window.opener属性也指向调用者窗口。因此,我考虑将对话框的结果放入该调用程序窗口的returnValue属性中。而且有效。

在 call 者窗口中:

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();

关于javascript - javascript-showModalDialog在Chrome中不返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10213530/

10-10 11:09