Подтвердить что ты не робот

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.

4b9b3361

Ответ 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>