Могу ли я передать переменную JavaScript в другое окно браузера? - PullRequest
63 голосов
/ 18 сентября 2008

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

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

Ответы [ 13 ]

95 голосов
/ 18 сентября 2008

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

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

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

var myVariable = window.opener.thisIsAnObject;

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

39 голосов
/ 18 сентября 2008

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

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

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

7 голосов
/ 18 сентября 2008

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

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

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

3 голосов
/ 23 мая 2013

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

  1. Печенье
  2. LocalStorage. Просто убедитесь, что ваш браузер поддерживает localStorage, и правильно выполняйте обслуживание переменных (добавляйте / удаляйте / удаляйте), чтобы поддерживать localStorage в чистоте.
2 голосов
/ 18 января 2017

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

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

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

2 голосов
/ 31 января 2014

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

// 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!");   
}
2 голосов
/ 18 сентября 2008

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

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

1 голос
/ 18 сентября 2008

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

0 голосов
/ 11 мая 2016

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

Более подробная информация здесь о посте Stackoverflow

0 голосов
/ 24 ноября 2015

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

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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...