Ненадежные результаты с использованием onbeforeunload - PullRequest
0 голосов
/ 26 марта 2012

Поэтому я использую событие onbeforeunload, чтобы закрыть все дочерние окна (изображения), которые были открыты из моего родительского окна.Код, с которым я работаю, старый, и родительское окно выполняет много постбэков для различных операций, поэтому я отслеживаю изображения на стороне сервера и добавляю атрибут onbeforeunload в тело, когда мне это нужно.

Когда окно закрывается, код на стороне сервера пишет скрипт, который просто вызывает функцию Javascript со строковым параметром.Javascript работает нормально, проблема в том, что он не всегда получает удар.

Мой код на стороне сервера выглядит так:

private void CloseAllChildren()
{
     // some code to retrieve image window names...

     string script = "closeAllChildren('imagewindowname1,imagewindowname2,etc');";
     _body.Attributes.Add("onbeforeunload", script);
}

И метод close, который вызывается при закрытиисобытие вызвано:

private void Close()
{
     // A bunch of code...

     // close the window after all folders have been routed
     CloseAllChildren();
     this.Response.Write(FolderView.WindowClose);
}

Я ничего не знаю с компьютерами случайным образом, но мои результаты, похоже, не соответствуют какой-либо схеме.Иногда он попадает в Javascript и работает отлично, иногда он никогда не попадает в Javascript при одинаковых условиях тестирования.Я предполагаю, что есть какое-то состояние гонки, но я не уверен, как обнаружить или исправить это.У кого-нибудь есть опыт с этим или лучший способ сделать это?Как я уже сказал, код старый и это небольшое дополнение к функциональности, поэтому я не хочу менять какие-либо текущие фреймворки.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Вполне возможно, что ваше событие закрытия на стороне сервера происходит после того, как сработало событие javascript onbeforeunload. Почему вы условно добавляете вызов функции javascript в тег body? Почему бы просто не добавить обработчик в свой javascript:

window.onbeforeunload = closeAllChildren('imagewindowname1,imagewindowname2,etc');

Тогда будет вызываться метод closeAllChildren независимо от того, что делает сервер.

0 голосов
/ 27 марта 2012

После попытки предложенных выше предложений и нескольких моих собственных идей кажется, что проблема заключалась в том, что javacript завершил бы выполнение команды window.top.close() до того, как был добавлен атрибут onbeforeunload (так как он записывался динамически), что аналогично к тому, что я ожидал. Я добавил тайм-аут на полсекунды, изменив window.top.close() на setTimeout(function() {window.top.close();}, 100), и это, похоже, исправило "случайность", которую я испытывал.

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

...