Как отправить событие из дочернего окна в родительское окно
моя главная цель это:
перейдя в мое приложение, откройте ссылку там на новой вкладке, сделайте что-то на новой вкладке и отправьте событие на вкладку parent-main для обновления.
Я изучил 2 метода, которые не делают именно то, что мне нужно:
- postMessage-работает, насколько я знаю, только на iframe, а не на вкладках
3 ответов
следующие работы для меня в chrome, firefox, ie (не тестировал больше браузеров)
предположим 3 документов
- (www.mydomain.com/parent.html) страница, содержащая 'main' - документ со ссылкой
- (bills.mydomain.com/child.html) страница, которая будет открыта по ссылке
- (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, удалите (чтобы он не был найден снова), а затем проанализируйте по желанию.
Я знаю, что это немного многословно, но я думаю, что это, вероятно, гораздо проще объяснить как концепцию, чем писать рабочий пример кода.