ti-enxame.com

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 quadros na mesma janela do navegador, mas não tenho certeza se isso pode ser feito nas janelas do navegador.

63
Tom Kidd

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 () de 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, quadros etc.

39
MarkR

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 isso 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.

93
Victor

Sim, os scripts podem acessar propriedades de outras janelas no mesmo domínio em que eles têm um identificador (normalmente obtido através de window.open/opener e window.frames/parent). Geralmente, é mais fácil chamar funções definidas na outra janela do que mexer nas variáveis ​​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 função que você espera que esteja disponível, antes de tentar chamá-la.

Valores simples como strings são bons, mas geralmente não é uma boa ideia passar objetos complexos como funções, elementos DOM e closures entre janelas. Se uma janela filho armazena um objeto do seu abridor, o abridor fecha, esse objeto pode se tornar 'inativo' (em alguns navegadores como o IE) ou causar um vazamento de memória. Erros estranhos podem ocorrer.

7
bobince

A passagem de variáveis ​​entre as janelas (se as janelas estiverem no mesmo domínio) pode ser feita facilmente através de: 

  1. Biscoitos 
  2. localStorage. Apenas certifique-se de que seu navegador suporte o localStorage e faça a manutenção da variável correta (adicionar/excluir/remover) para manter o localStorage limpo. 
3
Roman M

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

// 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
knut

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

na 'janela pai' abra a criança

    var win = window.open(<window.location.href>, '_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

2
Brault Gilbert

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.

2
Grant Wagner

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

1
Jordan Mack

Você pode usar o window.name como um transporte de dados entre 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 Stackoverflow

0
Brad Parks

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);
0
Milan Babuškov

Eu tenho lutado para passar com sucesso 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/

0
singe3