Posso passar uma variável JavaScript para outra janela do navegador?

Eu tenho uma página que gera uma janela do navegador pop-up. Eu tenho uma variável JavaScript na janela do navegador pai e gostaria de passá-lo para a janela do navegador pop-up.

Existe uma maneira de fazer isso? Eu sei que isso pode ser feito em vários frameworks na mesma janela do navegador, mas não tenho certeza se isso pode ser feito nas janelas do navegador.

Desde que as janelas sejam do mesmo domínio de segurança e você tenha uma referência à outra janela, sim.

O método open () do Javascript retorna uma referência para a janela criada (ou janela existente se reutilizar uma existente). Cada janela criada de tal maneira obtém uma propriedade aplicada a ela “window.opener” apontando para a janela que a criou.

Ou então pode usar o DOM (segurança dependendo) para acessar as propriedades do outro, ou seus documentos, frameworks etc.

Colocando o código no assunto, você pode fazer isso a partir da janela pai:

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

ou isto da nova janela:

 var myVariable = window.opener.thisIsAnObject; 

Eu prefiro o último, porque você provavelmente precisará esperar que a nova página seja carregada de qualquer maneira, para que você possa acessar seus elementos, ou o que você quiser.

Sim, os scripts podem acessar propriedades de outras janelas no mesmo domínio em que eles têm um manipulador (geralmente obtido por meio de window.open/opener e window.frames / parent). Geralmente, é mais fácil chamar funções definidas na outra janela do que mexer nas variables ​​diretamente.

No entanto, as janelas podem morrer ou seguir em frente, e os navegadores lidam com isso de maneira diferente quando o fazem. Verifique se uma janela (a) ainda está aberta (! Window.closed) e (b) tem a function que você espera disponível, antes de tentar chamá-la.

Valores simples como strings são bons, mas geralmente não é uma boa idéia passar objects complexos como funções, elementos DOM e closures entre janelas. Se uma janela filho armazena um object de seu opener, o abridor fecha, esse object pode se tornar ‘morto’ (em alguns navegadores como o IE) ou causar um memory leaks. Erros estranhos podem ocorrer.

Passar variables ​​entre as janelas (se as janelas estiverem no mesmo domínio) pode ser feito facilmente por:

  1. Biscoitos
  2. localStorage. Apenas certifique-se de que seu navegador suporte o localStorage e faça a manutenção da variável correta (add / delete / remove) para manter o localStorage limpo.

Na sua janela pai:

 var yourValue = 'something'; window.open('/childwindow.html?yourKey=' + yourValue); 

Em seguida, em 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']); 

Existe potencialmente muita verificação de erros que você deve fazer na análise de seus pares de chave / valor, mas não estou incluindo aqui. Talvez alguém possa fornecer uma rotina de análise de cadeia de caracteres de consulta Javascript mais abrangente em uma resposta posterior.

Você pode passar variables ​​e fazer referência a coisas na janela pai com bastante facilidade:

 // open an empty sample window: var win = open(""); win.document.write(""); // 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!"); } 

Pode-se passar uma mensagem da janela ‘pai’ para a janela ‘filho’:

na ‘janela pai’ abra a criança

  var win = window.open(, '_blank'); setTimeout(function(){ win.postMessage(SRFBfromEBNF,"*") },1000); win.focus(); 

o para ser substituído de acordo com o contexto

Na ‘criança’

  window.addEventListener('message', function(event) { if(event.srcElement.location.href==window.location.href){ /* do what you want with event.data */ } }); 

O teste if deve ser alterado de acordo com o contexto

Sim, isso pode ser feito desde que as duas janelas estejam no mesmo domínio. A function window.open () retornará um identificador para a nova janela. A janela filho pode acessar a janela pai usando o elemento DOM “abridor”.

Alternativamente, você pode adicioná-lo à URL e deixar a linguagem de script (PHP, Perl, ASP, Python, Ruby, qualquer que seja) lidar com isso no outro lado. Algo como:

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

Eu tenho lutado para passar com sucesso os argumentos para a janela recém-aberta.
Aqui está o que eu criei:

 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) } } 

Exemplo de chamada:

 openWindow("/contact",function(firstname, lastname){ this.alert("Hello "+firstname+" "+lastname); }, "John", "Doe"); 

Exemplo ao vivo

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

Você pode usar window.name como um transporte de dados entre as janelas – e também funciona entre domínios. Não é oficialmente suportado, mas pelo que entendi, funciona muito bem em cross-browser.

Mais informações aqui neste Post sobre Stackoverflow

Sim navegadores limpar todos ref. por uma janela. Então você tem que procurar um ClassName de alguma coisa na janela principal ou usar cookies como Javascript caseiro ref.

Eu tenho um rádio na minha página do projeto. E então você liga para o rádio que é iniciado em uma janela pop-up e eu controlo os links da janela principal na página principal e mostro o status da reprodução e em FF é fácil, mas no MSIE não é tão Fácil. Mas isto pode ser feito.

A function window.open () também permitirá isso se você tiver uma referência à janela criada, desde que esteja no mesmo domínio. Se a variável for usada no lado do servidor, você deve estar usando uma variável $ _SESSION (supondo que você esteja usando PHP).