Получить ссылку на дочернее окно после обновления - PullRequest
8 голосов
/ 02 ноября 2010

У меня есть автономное приложение HTML5 (т. Е. Нет серверного компонента / кода).

В основном это два окна (родительское и дочернее).Однако в некоторых случаях мне нужно программно обновить родительское окно.Когда это происходит, он теряет свою ссылку на дочерний элемент, и ссылка дочернего элемента на window.opener больше не действительна.Поэтому я подумал, что я сериализую дочернее окно и сохраню его в localStorage.Затем, когда родитель обновился, он мог получить ссылку на окно из localStorage и по-прежнему взаимодействовать с дочерним элементом.

Проблема в том, что это не работает (согласно моему предыдущему вопросу здесь Stringify DOMWindow объект ).Я не могу сериализовать окно DOM, как любой другой объект.

Итак, как я могу в моем недавно обновленном окне выбрать ссылку на дочернего элемента своего предшественника?

Редактировать : Подчеркнул тот факт, что это автономное приложение.Там нет серверного компонента.

Я должен также добавить, что причина, по которой мне нужно обновить родительский элемент, заключается в проверке обновлений приложения (изменений в манифесте кэша).Так как родительский элемент является первой страницей в загружаемом приложении, он в основном управляет кэшированием (фактически, в Safari, если это окно закрывается, если это окно закрывается во время любого процесса кэширования, происходит сбой всего браузера).Таким образом, «родитель» по сути является «первой страницей, которую загружает пользователь». Это означает, что у меня не может быть «родителя» во фрейме, так как самое верхнее окно будет управлять кэшированием и потребует обновления для поиска обновлений. На самом деле, похоже, что я могуиспользуйте метод фрейма, так как обновление любой из страниц в приложении вызовет проверку обновления.Хотя громоздко.

Ответы [ 4 ]

12 голосов
/ 27 июня 2011

Вы можете получить ссылку на дочернее окно, просто следуя трюку.

newWin = window.open("", "child_window_name", "width=...");
if (newWin.location.href === "about:blank") {
    newWin = window.open("a.html", "child_window_name", "width=...");
} else {
    // We've already obtained the reference.
    // However, IE and FireFox won't put focus on an already opened window.
    // So we have to do that explicitly:
    newWin.focus();
}

Обратите внимание, что вы должны иметь фиксированное имя дочернего окна, чтобы этот трюк работал.

Пример URL: http://josephj.com/lab/2011/window-open-reconnect/demo.html

1 голос
/ 02 ноября 2010

См. Здесь: http://www.w3.org/TR/html5/offline.html#dom-appcache-update

applicationCache.addEventListener("updateready", function() {
  applicationCache.swapCache();
  //now reload the body html
}, false);
setInterval(60000, applicationCache.update);//check for updates every minute

(updateready срабатывает каждый раз, когда загружается новая версия)

0 голосов
/ 02 ноября 2010

Можете ли вы вызвать что-нибудь на вашем открывателе, который скажет ему перезагрузить и снова открыть всплывающее окно на странице?

, например

//in popup
window.opener.doReload('popup_page_name.html');
window.close();

//in opener
function doReload(popupURL){
  setSomeFormField(popupURL);
  someForm.submit();
}

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

0 голосов
/ 02 ноября 2010

Звучит как довольно сложное решение.Почему бы вам не поместить содержимое родительского окна в невидимый iframe (т.е. без рамки) и просто обновить фрейм?

Это позволит вам сохранить ссылку на фрейм и дочернее окно вверхний документ, где оба могут получить к нему доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...