JavaScript - showModalDialog не возвращает значение в Chrome

Я сделал небольшое всплывающее окно календаря в Javascript. Очень просто, используя элемент управления Calendar из ASP.NET. Я вызываю всплывающее окно с showModalDialog. В модальном окне изменение текущего месяца календаря вызывает проблемы из-за обратной передачи, и я нашел в нескольких местах, что решение должно поставить:

<code><base target="_self"/>
</code>

в головной части файла aspx. Все отлично работает ... кроме одной вещи, и только в Google Chrome. Чтобы вернуть выбранную дату, я установил returnValue всплывающего окна на дату, выбранную в календаре. В IE и Firefox это всегда работает. Однако в Chrome это работает, только если я не изменяю текущий месяц в календаре. Как только я изменяю его, возвращаемое значение не передается вызывающей стороне showModalDialog. Как будто модальное окно больше не является оригинальным; возвращаемое значение не определено.

Кто-нибудь сталкивался с таким поведением и есть предложение заставить его работать? Я попытался использовать dialogArguments, чтобы отслеживать трассировку окна вызывающего, но оно передается только в первое модальное окно (оно теряется после изменения текущего месяца).

Код в вызывающей процедуре:

<code>var d = window.showModalDialog(...)
</code>

Код в модальном окне:

<code>window.returnValue = selectedDate; 
self.close();
</code>

Как я сказал Teemu, selectedDate и window.returnValue всегда верны. Однако в случае Google Chrome (после месячного изменения в календаре) returnValue не передается обратно showModalDialog, и d не определено.

 ConnorsFan18 апр. 2012 г., 18:26
В таком случае, почему это работает, когда я остаюсь в текущем месяце?
 Teemu18 апр. 2012 г., 18:24
Похоже, ваша процедура, чтобы изменитьreturnValue в модальном диалоге происходит сбой в Chrome.
 Teemu18 апр. 2012 г., 18:41
Как вы определилиselectedDate? Попробуйте consoleLog или предупредить его перед закрытием окна, вы узнаете, в порядке ли значение.
 ConnorsFan18 апр. 2012 г., 19:00
selectedDate всегда действителен, и returnValue также всегда корректен. Но, в случае, который я объясняю в посте (Chrome + изменение месяца), returnValue не возвращается showModalDialog.
 Teemu18 апр. 2012 г., 18:27
Трудно сказать, не видя код ...

Ответы на вопрос(2)

что я обнаружил на каком-то форуме, что если вы поместите свои элементы управления в updatePanel и ContentTemplate, они будут работать:

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
           <ContentTemplate>
           </ContentTemplate>
 </asp:UpdatePanel>
Решение Вопроса

мне пришлось придумать свой собственный обходной путь для ошибки. Итак, вот оно ...

В 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();
 13 мар. 2014 г., 16:08
К вашему сведению, и теперь это "рынок" не будет исправлен " потому что showModalDialog будет полностью удален из Chrome в будущем :(code.google.com/p/chromium/issues/detail?id=42939#c36
 16 янв. 2014 г., 00:38
К вашему сведению, это почти два года спустя, и Chrome все еще требует этого обходного пути.
 05 сент. 2014 г., 18:51
 19 апр. 2012 г., 22:52
+1 за тяжелую работу. Вы действительно обошли ошибку. Я пытался воспроизвести вашу проблему прошлой ночью, но не смог получитьreturnValue даже из неизменного диалога ...
 22 мая 2012 г., 17:50

Ваш ответ на вопрос