Могу ли я передать переменную JavaScript в другое окно браузера?

У меня есть страница, в которой появляется всплывающее окно браузера. У меня есть переменная JavaScript в окне родительского браузера, и я бы хотел передать ее в появившееся окно браузера.

Есть ли способ сделать это? Я знаю, что это можно сделать через кадры в том же окне браузера, но я не уверен, что это можно сделать через окна браузера.

Ответ 1

Если окна находятся из одного домена безопасности, и у вас есть ссылка на другое окно, да.

Метод javascript open() возвращает ссылку на созданное окно (или существующее окно, если оно повторно использует существующий). Каждое созданное таким образом окно получает свойство, примененное к нему "window.opener", указывающее на его созданное окно.

Можно также использовать DOM (в зависимости от безопасности) для доступа к свойствам другого, или к его документам, фреймам и т.д.

Ответ 2

Ввод кода в дело, вы можете сделать это из родительского окна:

var thisIsAnObject = {foo:'bar'};
var w = window.open("http://example.com");
w.myVariable = thisIsAnObject;

или это из нового окна:

var myVariable = window.opener.thisIsAnObject;

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

Ответ 3

Да, скрипты могут получить доступ к свойствам других окон в том же домене, в котором у них есть дескриптор (обычно получается через window.open/opener и window.frames/parent). Обычно более управляемым является вызов функций, определенных в другом окне, а не скрипка с переменными напрямую.

Тем не менее, окна могут умереть или двигаться дальше, и браузеры имеют дело с ним по-разному, когда они это делают. Убедитесь, что окно (a) все еще открыто (! Window.closed) и (b) имеет функцию, которую вы ожидаете получить, прежде чем пытаться ее вызвать.

Простые значения, такие как строки, являются точными, но, как правило, не рекомендуется передавать сложные объекты, такие как функции, элементы DOM и замыкания между окнами. Если дочернее окно хранит объект из его открывателя, то открывающий закрывается, этот объект может стать "мертвым" (в некоторых браузерах, таких как IE), или вызвать утечку памяти. Могут возникнуть странные ошибки.

Ответ 4

Передача переменных между окнами (если ваши окна находятся в одном домене) может быть легко выполнена с помощью:

  • Cookies
  • LocalStorage. Просто убедитесь, что ваш браузер поддерживает localStorage, а также право на обслуживание переменных (добавление/удаление/удаление), чтобы сохранить localStorage в чистоте.

Ответ 5

В окне родителя:

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']);

Существует потенциально много ошибок, которые вы должны делать при анализе пар ключ/значение, но я не включаю его здесь. Возможно, в более позднем ответе кто-то может предоставить более инклюзивный JSQL-запрос, обрабатывающий процедуру.

Ответ 6

Вы можете легко передавать переменные и ссылаться на вещи в родительском окне:

// 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!");   
}

Ответ 7

Можно передать сообщение из родительского окна в окно "child":

в "родительском окне" откройте дочерний элемент

    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 должен быть изменен в соответствии с контекстом

Ответ 8

Да, это можно сделать, если оба окна находятся в одном домене. Функция window.open() вернет дескриптор в новое окно. Детское окно может получить доступ к родительскому окну с помощью элемента DOM "открыватель".

Ответ 9

В качестве альтернативы вы можете добавить его в URL-адрес и позволить скрипту (PHP, Perl, ASP, Python, Ruby, независимо) обрабатывать его с другой стороны. Что-то вроде:

var x = 10;
window.open('mypage.php?x='+x);

Ответ 10

Я изо всех сил пытался успешно передать аргументы во вновь открытое окно.
Вот что я придумал:

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 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");

Живой пример

http://jsfiddle.net/rj6o0jzw/1/

Ответ 11

Вы можете использовать window.name в качестве переноса данных между окнами, а также работать с перекрестным доменом. Официально не поддерживается, но, по моему мнению, на самом деле работает очень хорошо в браузере.

Подробнее здесь, в этом сообщении Stackoverflow

Ответ 12

Да, браузеры очищают все ссылки. для окна. Таким образом, вам нужно искать ClassName что-то в главном окне или использовать файлы cookie в качестве исходного кода Javascript.

У меня есть радио на моей странице проекта. И затем вы включаете для радио, что он запускается во всплывающем окне, и я контролирую ссылки главного окна на главной странице и показываю статус воспроизведения, а в FF это легко, но в MSIE не так просто. Но это можно сделать.

Ответ 13

Функция window.open() также позволит это, если у вас есть ссылка на созданное окно, если оно находится в том же домене. Если переменная используется на стороне сервера, вы должны использовать переменную $_SESSION (при условии, что вы используете PHP).