Javascript: сохранить ссылку на объект окна? - PullRequest
3 голосов
/ 24 сентября 2010

Мой JavaScript-код открывает некоторые окна:

var win = window.open();

Я сохраняю ссылку win в массиве со всеми остальными открытыми окнами.
Все работает нормально, пока не открывается обновитель.

Итак, я хотел бы получить все ссылки на открытые окна при загрузке «главного» окна.

Чтобы понять это, я должен:
1. сохранить все ссылки при выгрузке 2. вернуть ссылки при загрузке 3. обновить ссылки с помощью нового открывателя

Возможно ли это?если да как?

Ответы [ 3 ]

4 голосов
/ 24 сентября 2010

Это звучит очень сложно (читай: проблематично).

То, что вы спрашиваете, было проблемой с давних времен и возвращает нас к исходному протоколу HTTP.

Краткий ответ:нет, это не совсем возможно.При обновлении родительского элемента все ссылки на дочерние элементы теряются.На самом деле это вполне реалистично ... родитель "обновляется" .... дети получают все ресурсы, оставленные родителем ... извините, не по теме и да.Сеть не имеет состояния, поэтому после обновления, перезагрузки, закрытия, открытия или добавления любого другого глагола к странице, страница обрабатывается как новый документ.


Это прекрасно работает в chrome / FireFox, но не работает в IE.

Будет работать что-то вроде следующего, но для того, чтобы восстановить связь между дочерним / родительским, это необходимо сделатьОТ ребенка.Скрипт / разметка ниже приведёт пример.Так что я бы не стал его использовать, но он здесь только в качестве примера.

Шаги:

  • Открытый ребенок
  • Перейти к ребенку
  • Обновить Родитель
  • ** Родитель -> Дочерние отношения потеряны.
  • ** Ребенок -> Родительские отношения все еще существуют.
  • Ссылка родителя
  • Перейти на родительскую страницу
  • Проверить отношения
  • ** Вы увидите, что родитель не является нулевым
  • ОставайтесьON parent
  • Обновить ребенка

HTMLPage.htm:

<input type="button" onclick="openChild();" value="Open Child" />
<input type="button" onclick="refreshParent();" value="Refresh Parent" />
<input type="button" onclick="linkParent();" value="Link Parent" />
<input type="button" onclick="checkRelationship();" value="Check Relationship" />
<input type="button" onclick="refreshChild();" value="Refresh Child" />


<script type="text/javascript" language="javascript">

    var child;    
    function openChild() {
        child = window.open("HTMLPage.htm");
    }

    function refreshParent() {
        alert("refreshing parent");
        window.opener.location.href = window.opener.location.href;
    }

    function linkParent() {
        window.opener.child = window;
        checkRelationship();
    }

    function checkRelationship() {
        alert("Parent: " + window.opener + ".   Children:" + child);
    }

    function refreshChild() {
        child.location.href = child.location.href;
    }


</script>

Итак, мой следующий вопрос:

Чего вы пытаетесь достичь с этим?Я за то, чтобы использовать модальное окно / всплывающее окно, когда ситуация действительно требует его, но вам нужен их массив?

Нужно ли обновлять родительскую страницу?Не могли бы вы вставить iframe на родительскую страницу и обновить его (т.е. загрузка файлов и т. Д., Когда главная страница не «нуждается» в обновлении).

Я далеко не фанат яблок, ноэта ссылка дает хорошее представление об использовании IFrames со сценариями: http://developer.apple.com/internet/webcontent/iframe.html

Надеюсь, это поможет.

3 голосов
/ 05 октября 2010

Как я решил проблему.

Свойство «opener» дочернего окна сохраняет ссылку на WINDOW, открывшее его, поэтому при обновлении главного окна окно не меняется, поэтому ссылка на openerвсе тот же.Единственный случай, когда средство открытия является нулевым, - это когда окно закрыто *

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

Таким образом, я возвращаю все дочерние ссылки !!;)

Конечно, если документ, загруженный в главное окно, не является моим документом, но, например, www.google.com регистрация обратной дочерней ссылки не удалась.

Это решение было протестировано в Firefox, IE и Chrome.

* в Chrome, когда вы вводите новый адрес, открывается новое окно, так что открыватель также будет нулевым.

0 голосов
/ 24 сентября 2010

либо избегайте повторного добавления основного окна (используйте AJAX или iframes), либо поместите «главное окно» в набор фреймов, чтобы фактически перезагрузить только «основной фрейм» - тогда вы можете вставить переменные в родительский фрейм

...