Могу ли я передать переменную JavaScript в другое окно браузера?
У меня есть страница, которая появляется во всплывающем окне браузера. У меня есть переменная JavaScript в Родительском окне браузера, и я хотел бы передать ее в всплывающее окно браузера.
есть ли способ сделать это? Я знаю, что это можно сделать через фреймы в том же окне браузера, но я не уверен, что это можно сделать через окна браузера.
13 ответов:
представила окна из того же домена безопасности, и у вас есть ссылка на другое окно, да.
метод Open () Javascript возвращает ссылку на созданное окно (или существующее окно, если оно повторно использует существующее). Каждое окно, созданное таким образом, получает свойство, примененное к нему " окно.открывалка", указывая на окно, которое его создало.
либо можно использовать DOM (в зависимости от безопасности) для доступа к свойствам другого, либо его документы,рам и т. д.
поставив код на вопрос, вы можете сделать это из родительского окна:
var thisIsAnObject = {foo:'bar'}; var w = window.open("http://example.com"); w.myVariable = thisIsAnObject;
или это из нового окна:
var myVariable = window.opener.thisIsAnObject;
Я предпочитаю последнее, потому что вам, вероятно, придется ждать загрузки новой страницы в любом случае, чтобы вы могли получить доступ к ее элементам или что угодно.
да, скрипты могут получить доступ к свойствам других окон в том же домене,на котором они имеют дескриптор (обычно получаемый через окно.откройте / открывалка и окно.кадры / родитель). Обычно более управляемым является вызов функций, определенных в другом окне, а не возиться с переменными напрямую.
однако windows может умереть или двигаться дальше, и браузеры справляются с этим по-разному, когда они это делают. Убедитесь, что окно (a) все еще открыто (!окно.закрыт) и (b) имеет функцию, которую вы ожидаете доступен, прежде чем пытаться вызвать его.
простые значения, такие как строки, хороши, но обычно не рекомендуется передавать сложные объекты, такие как функции, элементы DOM и замыкания между окнами. Если дочернее окно хранит объект из своего открывателя, то открыватель закрывается, этот объект может стать "мертвым" (в некоторых браузерах, таких как IE) или вызвать утечку памяти. Странные ошибки могут последовать.
передача переменных между окнами (если ваши окна находятся в одном домене) может быть легко выполнена с помощью:
- Cookies
- localStorage. Просто убедитесь, что ваш браузер поддерживает localStorage, и сделать переменную обслуживания право (добавить/удалить/удалить), чтобы сохранить localStorage в чистоте.
в Родительском окне:
var yourValue = 'something'; window.open('/childwindow.html?yourKey=' + yourValue);
затем в childwindow.html:
var query = location.search.substring(1); var parameters = {}; var keyValues = query.split(/&/); for (var keyValue in keyValues) { var keyValuePairs = keyValue.split(/=/); var key = keyValuePairs[0]; var value = keyValuePairs[1]; parameters[key] = value; } alert(parameters['yourKey']);
потенциально существует много ошибок, которые вы должны делать в разбор ваших пар ключ/значение, но я не включаю его здесь. Возможно, кто-то может предоставить более инклюзивную процедуру синтаксического анализа строки запроса Javascript в более позднем ответе.
вы можете передавать переменные и ссылки на вещи в Родительском окне довольно легко:
// open an empty sample window: var win = open(""); win.document.write("<html><body><head></head><input value='Trigger handler in other window!' type='button' id='button'></input></body></html>"); // attach to button in target window, and use a handler in this one: var button = win.document.getElementById('button'); button.onclick = function() { alert("I'm in the first frame!"); }
можно передать сообщение из "родительского" окна в "дочернее" окно:
в "Родительском окне" откройте дочерний
var win = window.open(<window.location.href>, '_blank'); setTimeout(function(){ win.postMessage(SRFBfromEBNF,"*") },1000); win.focus();
заменить в соответствии с контекстом
в 'детской'
window.addEventListener('message', function(event) { if(event.srcElement.location.href==window.location.href){ /* do what you want with event.data */ } });
тест if должен быть изменен в соответствии с контекстом
Да, это можно сделать, пока оба окна находятся в одном домене. Окно.функция open() возвращает дескриптор нового окна. Дочернее окно может получить доступ к родительскому окну с помощью элемента DOM "opener".
кроме того, вы можете добавить его в URL-адрес и позволить языку сценариев (PHP, Perl, ASP, Python, Ruby, whatever) обрабатывать его с другой стороны. Что-то вроде:
var x = 10; window.open('mypage.php?x='+x);
Я изо всех сил пытался успешно передать аргументы в недавно открытое окно.
Вот что я придумал :function openWindow(path, callback /* , arg1 , arg2, ... */){ var args = Array.prototype.slice.call(arguments, 2); // retrieve the arguments var w = window.open(path); // open the new window w.addEventListener('load', afterLoadWindow.bind(w, args), false); // listen to the new window's load event function afterLoadWindow(/* [arg1,arg2,...], loadEvent */){ callback.apply(this, arguments[0]); // execute the callbacks, passing the initial arguments (arguments[1] contains the load event) } }
пример вызова:
openWindow("/contact",function(firstname, lastname){ this.alert("Hello "+firstname+" "+lastname); }, "John", "Doe");
видео
можно использовать
window.name
как транспорт данных между окнами - и он также работает в разных доменах. Официально не поддерживается, но, насколько я понимаю, на самом деле работает очень хорошо кросс-браузер.
да браузеры очистить все ссылки. для окна. Таким образом, вы должны искать имя класса чего-то в главном окне или использовать cookies в качестве JavaScript homemade ref.
У меня радио на моей странице проекта. И затем вы включаете для радио его запуски во всплывающем окне, и я контролирую ссылки главного окна на главной странице и показываю статус воспроизведения, а в FF его легко, но в MSIE не так просто. Но это можно сделать.