Как отправить событие из дочернего окна в родительское окно

моя главная цель это:

перейдя в мое приложение, откройте ссылку там на новой вкладке, сделайте что-то на новой вкладке и отправьте событие на вкладку parent-main для обновления.

Я изучил 2 метода, которые не делают именно то, что мне нужно:

  1. postMessage-работает, насколько я знаю, только на iframe, а не на вкладках

3 ответов


следующие работы для меня в chrome, firefox, ie (не тестировал больше браузеров)

предположим 3 документов

  1. (www.mydomain.com/parent.html) страница, содержащая 'main' - документ со ссылкой
  2. (bills.mydomain.com/child.html) страница, которая будет открыта по ссылке
  3. (www.mydomain.com/dispatcher.html) объяснил позже

сначала установить домен-собственность всех 3 документов на mydomain.com

<script>
document.domain="mydomain.com";
</script>

в родителя.html создайте скрытый iframe с именем-свойством, например "hiddenframe". Также создайте функцию, которая позже может получить ответ.

родитель.html теперь должен выглядеть так:

<script>
document.domain="mydomain.com";
function fx(msg)//receives the response
{
  alert(msg)
}
</script>
<iframe name="hiddenframe" style="display:none"></iframe>
<a href="http://bills.mydomain.com/child.html" target="_blank">click</a>

в ребенка.html теперь вы сможете загрузить документ в скрытый iframe внутри родителя.HTML-код

<script>
document.domain="mydomain.com";
window.open('http://www.mydomain.com/dispatcher.html','hiddenframe');
</script>

(не путайте перед лицом использования window.open() здесь не откроется новое окно, страница будет загружена в iframe в parent.html)


в диспетчерскую.html теперь вы можете вызвать функцию внутри parent.HTML-код

<script>
document.domain="mydomain.com";
parent.fx('you just got some response');
</script>

когда вам нужно только перезагрузить родителей.html это немного проще.

снова установите документ.домен-собственность родителя.html и ребенок.html (вам не нужен iframe в parent.html и диспетчер.html)

в родителя.html также установлен имя-свойство окна, например,

<script>
  window.name="parentTab";
</script>

в ребенка.html теперь вы можете получить доступ к parentTab-окне(вкладке)

<script>
    document.domain="mydomain.com";
    window.open('http://www.mydomain.com/parent.html','parentTab');
</script>

...или просто используйте "parentTarget"в качестве целевого свойства ссылки или формы в child.HTML-код


Что я сделал для себя, я имплементировал некоторые ajax для отправки изменений из window2 в базу данных. Я начала работать с JSON, чтобы вытянуть новые сведения из базы данных обратно в файл window1


видя, как подобные вопросы говорить только о window.open (который вы не хотите использовать) и как afaik нет простого способа получить все окна в одном домене, для чего вы хотите, вам, вероятно, нужно написать свой собственный фреймворк, чтобы сделать это с помощью window.sessionStorage.
Я не думаю, что вы получите доступ к поддоменам с ним и определенно не к другим доменам.


практические идеи для окна передача сообщений с помощью sessionStorage..
Вы можете передать вещи в URL (GET), чтобы способ передачи сообщений мог быть заставить родителя генерировать уникальный идентификатор для себя parentID - уникальный идентификатор для детей childID (который вставляется в URL вместе с parentID по клику если вы используете <a>, или скрытое поле, если вы не возражаете <form method="GET">), затем с sessionStorage сохранить сообщения родителю с помощью клавиш, таких как parentID.childID.timeStamp, есть интервал как в родителе, так и в ребенке, который ищет sessionStorage ключи начиная с идентификатора окна, затем ., (т. е. родитель ищет parentID.) в матче скопируйте ключ и значение в новый var, удалите (чтобы он не был найден снова), а затем проанализируйте по желанию.

Я знаю, что это немного многословно, но я думаю, что это, вероятно, гораздо проще объяснить как концепцию, чем писать рабочий пример кода.