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

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

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


person Tom Kidd    schedule 17.09.2008    source источник


Ответы (14)


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

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

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

person MarkR    schedule 17.09.2008
comment
Все изменилось с тех пор, как был задан этот вопрос. Теперь также возможно в более новых браузерах передавать сообщения между окнами на другой домен безопасности, посредством вызовов window.postMessage. - person Brian; 01.04.2013

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

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

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

var myVariable = window.opener.thisIsAnObject;

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

person Victor    schedule 17.09.2008
comment
я не понимаю {foo:'bar'}. не могли бы вы помочь мне в этом? - person Masoud Sahabi; 10.09.2013
comment
@MasoudSahabi, var x = {foo: 'bar'} - это просто компактный литеральный синтаксис для создания объекта. Это то же самое, что и var x = new Object(); x.foo = 'bar'; - person sergiopereira; 19.09.2013
comment
Я использую первый, и он отлично работает в Chrome, но IE, кажется, жалуется. И очень трудно получить точку останова. - person styfle; 07.11.2013
comment
Это было бы здорово, но теперь IE10 жалуется на это, это не лучший способ для кросс-браузерной совместимости на данный момент. - person 7dr3am7; 28.11.2013
comment
@ 7dr3am7, я вижу, мне отказано в доступе. Но если я использую второй метод, из нового окна, он работает нормально. - person Victor; 30.11.2013
comment
@ Виктор, не могли бы вы ответить на этот вопрос stackoverflow.com/questions/25762872/ - person user3637224; 10.09.2014
comment
Я часами бился над этим решением, прежде чем понял, что var myVariable = window.opener.thisIsAnObject; не работает, а var myVariable = thisIsAnObject; работает. Кто-нибудь знает, почему это так? Есть ли ошибка в ответе выше или это что-то с новыми браузерами или версиями? - person Krøllebølle; 16.10.2015
comment
в новом окне пользовательский аргумент может быть сериализован в строку с помощью - (new XMLSerializer()).serializeToString(myVariable). он отлично работает в Chrome. Но не работает в Edge, получая ошибку Parser. У кого-нибудь есть решение для браузера Edge? - person Apparao; 21.01.2016
comment
Как получить данные в новом окне? - person Kamrul Hasan; 03.10.2019
comment
thisIsAnObject должен быть глобальной переменной - person peschanko; 05.12.2020

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

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

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

person bobince    schedule 17.09.2008

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

  1. Печенье
  2. локальное хранилище. Просто убедитесь, что ваш браузер поддерживает localStorage, и правильно обслуживайте переменные (добавляйте/удаляйте/удаляйте), чтобы сохранить localStorage в чистоте.
person Roman M    schedule 23.05.2013

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

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

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

person Brault Gilbert    schedule 17.01.2017

В вашем родительском окне:

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 в более позднем ответе.

person Grant Wagner    schedule 17.09.2008

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

// 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!");   
}
person knut    schedule 31.01.2014
comment
Как написано, это не будет работать в реальном мире, где люди запускают рекламный блок и т. Д. Добавив параметры в open, чтобы он открывался в отдельном окне (вместо вкладки, как я настроил FF), я смог заставить это работать в firefox. Но всплывающее окно было заблокировано в Chrome. Так что это просто и вроде работает, но это немного далеко от рабочего решения. - person Nick Rice; 03.05.2016

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

person Jordan Mack    schedule 17.09.2008

Для меня не работает следующее

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

// in new window
var B = window.opener.B;

Но это работает (обратите внимание на имя переменной)

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

// in new window
var B = window.opener.B;

Также var B должен быть глобальным.

person Haris    schedule 18.11.2019

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

var x = 10;
window.open('mypage.php?x='+x);
person Milan Babuškov    schedule 17.09.2008

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

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

Живой пример

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

person singe3    schedule 24.11.2015

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

Дополнительная информация здесь, в этом сообщении Stackoverflow

person Brad Parks    schedule 11.05.2016

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

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

person LAT    schedule 08.10.2011

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

person HappySmileMan    schedule 17.09.2008