Javascript - showModalDialog не возвращает значение в Chrome
Я сделал небольшой всплывающий календарь в Javascript. Очень просто, используя элемент управления Calendar из ASP.NET. Я вызываю всплывающее окно с showModalDialog. В модальном окне изменение текущего месяца календаря вызывает проблемы из-за обратной передачи, и я нашел в нескольких местах, что решение должно поставить:
<base target="_self"/>
в верхней части файла aspx. Все отлично работает... кроме одного, и только в Google Chrome. Чтобы вернуть выбранную дату, я устанавливаю значение returnValue всплывающего окна в дату, выбранную в календаре. В IE и Firefox он всегда работает. Однако в Chrome он работает только в том случае, если я не изменяю текущий месяц в календаре. Как только я его сменил, возвращаемое значение не будет передано вызывающей программе showModalDialog. Как будто модальное окно больше не является оригинальным; возвращаемое значение undefined.
Кто-нибудь испытал это поведение и предложил сделать его работу? Я попытался использовать dialogArguments, чтобы сохранить трассировку окна вызывающего, но он передается только в первое модальное окно (оно теряется после изменения текущего месяца).
Код в вызывающей процедуре:
var d = window.showModalDialog(...)
Код в модальном окне:
window.returnValue = selectedDate;
self.close();
Как я сказал Teemu, selectedDate и window.returnValue всегда верны. Однако в случае с Google Chrome (после изменения месяца в календаре) returnValue не возвращается обратно showModalDialog, а d - undefined.
Ответы
Ответ 1
Чтобы продолжать использовать 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();
Ответ 2
У меня была такая же ошибка, что я нашел в каком-то форуме: если вы поместите свои элементы управления в updatePanel и ContentTemplate, это будет работать:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
</ContentTemplate>
</asp:UpdatePanel>