it-swarm-eu.dev

Posso passare una variabile JavaScript ad un'altra finestra del browser?

Ho una pagina che genera una finestra del browser popup. Ho una variabile JavaScript nella finestra del browser principale e vorrei passarla alla finestra del browser visualizzata.

C'è un modo per fare questo? So che questo può essere fatto attraverso i frame nella stessa finestra del browser, ma non sono sicuro che possa essere fatto attraverso le finestre del browser.

63
Tom Kidd

Se le finestre provengono dallo stesso dominio di sicurezza e si ha un riferimento all'altra finestra, sì.

Il metodo open () di Javascript restituisce un riferimento alla finestra creata (o finestra esistente se ne riutilizza uno esistente). Ogni finestra creata in tal modo riceve una proprietà "window.opener" che punta alla finestra che lo ha creato.

Entrambi possono quindi utilizzare il DOM (a seconda della sicurezza) per accedere alle proprietà dell'altro o dei relativi documenti, frame, ecc.

39
MarkR

Mettendo il codice all'argomento, puoi farlo dalla finestra principale:

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

o questo dalla nuova finestra:

var myVariable = window.opener.thisIsAnObject;

Preferisco quest'ultimo, perché probabilmente dovrai aspettare che la nuova pagina venga caricata comunque, in modo che tu possa accedere ai suoi elementi, o qualunque cosa tu voglia.

93
Victor

Sì, gli script possono accedere alle proprietà di altre finestre nello stesso dominio su cui hanno un handle (generalmente acquisite tramite window.open/opener e window.frames/parent). Di solito è più facile chiamare le funzioni definite sull'altra finestra piuttosto che giocare direttamente con le variabili.

Tuttavia, Windows può morire o andare avanti e i browser gestiscono diversamente quando lo fanno. Controlla che una finestra (a) sia ancora aperta (! Window.closed) e (b) abbia la funzione che ti aspetti disponibile, prima di provare a chiamarla.

Valori semplici come le stringhe vanno bene, ma generalmente non è una buona idea passare oggetti complessi come funzioni, elementi DOM e chiusure tra finestre. Se una finestra secondaria memorizza un oggetto dal suo apri, quindi l'apertura si chiude, quell'oggetto può diventare "morto" (in alcuni browser come IE) o causare una perdita di memoria. Possono verificarsi strani errori.

7
bobince

Passare variabili tra le finestre (se le tue finestre sono sullo stesso dominio) può essere fatto facilmente tramite: 

  1. Biscotti 
  2. memoria locale. Assicurati che il tuo browser supporti localStorage, e fai il diritto alla manutenzione delle variabili (aggiungi/cancella/rimuovi) per mantenere pulito localStorage. 
3
Roman M

Puoi passare variabili e fare riferimento a cose nella finestra genitore abbastanza facilmente:

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

Si può passare un messaggio dalla finestra 'genitore' alla finestra 'figlio':

nella "finestra genitore" apri il bambino

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

il da sostituire in base al contesto

Nel "bambino"

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

Il test if deve essere modificato in base al contesto

2
Brault Gilbert

Nella tua finestra genitore:

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

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

C'è potenzialmente un sacco di controllo degli errori che dovresti fare nell'analisi delle coppie chiave/valore, ma non lo includo qui. Forse qualcuno può fornire una routine di analisi delle stringhe di query Javascript più inclusiva in una risposta successiva.

2
Grant Wagner

Sì, può essere eseguito purché entrambe le finestre si trovino sullo stesso dominio. La funzione window.open () restituirà un handle alla nuova finestra. La finestra secondaria può accedere alla finestra principale utilizzando l'elemento DOM "apri".

1
Jordan Mack

È possibile utilizzare window.name come trasporto di dati tra Windows e funziona anche su più domini. Non supportato ufficialmente, ma dalla mia comprensione, funziona davvero molto bene con il browser.

Maggiori informazioni qui su questo Stackoverflow Post

0
Brad Parks

In alternativa, puoi aggiungerlo all'URL e lasciare che il linguaggio di scripting (PHP, Perl, ASP, Python, Ruby, qualunque) lo gestisca dall'altra parte. Qualcosa di simile a:

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

Ho faticato a passare correttamente gli argomenti alla finestra appena aperta.
Ecco cosa mi è venuto in mente:

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

Esempio di chiamata:

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

Esempio live

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

0
singe3