Мне недавно нужно было решить именно эту проблему в приложении. Я закончил тем, что использовал этот замечательный маленький плагин jQuery, чтобы сделать свое дело: WindowMsg (см. Ссылку внизу). Хотя я уверен, что есть другие способы выполнить ту же задачу, этот плагин работает следующим образом:
- сначала вы создаете новое дочернее окно из исходного окна, используя window.open
- Вы сохраняете ссылку на объект окна, возвращенный window.open
- вы вызываете метод библиотеки в дочернем окне, которое добавляет скрытую форму для библиотеки для хранения данных в
- вы вызываете метод библиотеки в родительском окне, которое использует window.document.forms для заполнения полей формы в дочернем окне (библиотека абстрагирует все эти вещи, так что вы даже не узнаете, что была задействована форма, если вы не посмотрели в исходном коде) window.document.forms работает одинаково во всех основных браузерах, поэтому эта абстракция в x-browser совместима
- наконец, дочернее окно обращается к своему родительскому окну, используя window.opener, и может общаться через параллельную скрытую форму на родительском
- библиотека реализует удобный помощник, который принимает функцию обратного вызова для запуска на каждой стороне, чтобы упростить работу с цепочкой обратного вызова
По моему опыту работы с библиотекой было бы также неплохо, если бы они включили библиотеку JSON 2 из JSON.org. Из коробки WindowMsg позволяет только отправлять строковые сообщения между окнами, но с довольно простым использованием библиотеки JSON 2 я смог ее взломать, чтобы разрешить отправку полных объектов JSON между окнами. Бьюсь об заклад, более зрелые библиотеки (например, те, которые использует Google) включают в себя такие разновидности сериализации и десериализации.
Я размещаю эту ссылку здесь, потому что по какой-то причине форматер Stack Overflow превращает ее в якорную ссылку без закрывающего тега, и я не хочу, чтобы весь пост был одной гигантской гиперссылкой!
WindowMsg:
http://www.sfpeter.com/2008/03/13/communication-between-browser-windows-with-jquery-my-new-plugin/