Как родительское окно Javascript может отправлять данные во всплывающее окно?
Автор вопроса: Willi BallenthinОтветов: 4
Я пишу приложение на основе браузера (или, скорее, быстрое прототипирование приложения) с использованием HTML и Javascript. Я хотел бы, чтобы главное окно могло отображать всплывающие окна с динамическими данными. Однако я не могу понять, как передавать данные из родительского окна во всплывающее окно в Javascript. Обратите внимание, я работаю с предположением, что приложение может использоваться в "автономных" сценариях, поэтому все динамические данные должны поступать из главного окна.
В идеале я хотел бы написать
var popup = window.open("popup.html", someidentifier, "");
popup.document.getElementById("SomeIdInPopupHtml").innerHTML = "1,2,3,4";
Однако функция getElementById возвращает NULL. Как передать данные во всплывающие окна из родительского окна?
Я знаю, что это может быть глупый вопрос, но уверены ли вы, что в дочернем окне есть узел с таким идентификатором? Помните, случай имеет значение! Steven P. 04.03.2011
находится ли var popup в рамках другой вызывающей его функции? синтаксис у вас правильный. rayman86 04.03.2011
@ Стивен Палиго, да, popup.html (в этом примере) имеет четко определенный элемент данных. Willi Ballenthin 04.03.2011
Показывает ли всплывающее окно контент из другого домена, чем родительский? Если да, то короткий ответ: вы не можете.
Длинный ответ заключается в том, что вы можете отправить фрагмент href всплывающего окна (т.е. часть после # в протоколе://server/path?query#fragment). Если контент во всплывающем окне знает, что его фрагмент нужно проверить на наличие изменений, вы можете передать ему данные.
Если он из того же домена, ваш код должен работать, пока существует элемент с этим идентификатором.
Ответ 2 · рейтинг 1 · bobince
Однако функция getElementById возвращает NULL.
Потому что popup.html еще не загрузился. Если вы хотите взаимодействовать с содержимым документа, вам придется перезвонить позже, когда он завершит загрузку.
Для полностью динамических всплывающих окон open с пустым URL-адресом и popupwindow.document.write в них их содержимое. Для всплывающих окон с совместным сценарием, загружаемых из отдельного документа, дочерний документ должен вызывать родительский документ, когда он готов к доступу. Или просто используйте всплывающие элементы div на странице, которые, как правило, меньше раздражают как вас, как программиста, так и конечного пользователя.
Ответ 3 · Willi Ballenthin
Позвольте мне начать с представления возможного решения, с которым я только что экспериментировал. Однако я хотел бы поощрять отзывы и лучшие решения...
Это не очень аккуратно, но я могу добавить параметры запроса в стиле GET к исходному URL-адресу всплывающего окна:
var popup = window.open("popup.html?" + identifier, somename, "");
Теперь в моей конкретной ситуации всплывающее окно представляет собой представление некоторой модели, идентифицируемой уникальным идентификатором, поэтому всплывающее окно может запросить родительское окно для данных, связанных с этим идентификатором:
var model = window.opener.getModel(document.location.href.split("?")[1]);
do_something_with_model(model);
Эта стратегия не будет работать во всех случаях, особенно когда данные не могут быть легко маршалированы в реализацию getModel(). Однако в моем случае, я думаю, этот подход может сработать.
Буду признателен за отзывы об этой стратегии. Спасибо!
Ответ 4 · The Muffin Man
Когда пользователь нажимает на вашу ссылку, чтобы открыть всплывающее окно, передайте ему строку запроса, а затем отреагируйте на это значение кодом на стороне вашего сервера.