it-swarm-eu.dev

Kann ich eine JavaScript-Variable an ein anderes Browserfenster übergeben?

Ich habe eine Seite, die ein Popup-Browserfenster erzeugt. Ich habe eine JavaScript-Variable im übergeordneten Browserfenster und möchte diese an das aufgerufene Browserfenster übergeben.

Gibt es eine Möglichkeit, dies zu tun? Ich weiß, dass dies über Frames im selben Browserfenster erfolgen kann, aber ich bin nicht sicher, ob dies über Browserfenster möglich ist.

63
Tom Kidd

Vorausgesetzt, die Fenster stammen aus derselben Sicherheitsdomäne und Sie haben einen Verweis auf das andere Fenster, ja.

Die open () -Methode von Javascript gibt einen Verweis auf das erstellte Fenster zurück (oder ein vorhandenes Fenster, wenn ein vorhandenes Fenster wiederverwendet wird). Jedes so erstellte Fenster erhält eine Eigenschaft "window.opener", die auf das Fenster verweist, in dem es erstellt wurde.

Entweder kann dann das DOM (sicherheitsabhängig) verwendet werden, um auf die Eigenschaften des anderen oder dessen Dokumente, Frames usw. zuzugreifen.

39
MarkR

Wenn Sie Code zur Sache hinzufügen, können Sie dies vom übergeordneten Fenster aus tun:

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

oder das aus dem neuen Fenster:

var myVariable = window.opener.thisIsAnObject;

Ich bevorzuge letzteres, weil Sie wahrscheinlich auf das Laden der neuen Seite warten müssen, damit Sie auf die Elemente zugreifen können, oder was immer Sie möchten.

93
Victor

Ja, Skripts können auf Eigenschaften anderer Fenster in derselben Domäne zugreifen, für die sie einen Handle haben (normalerweise über window.open/opener und window.frames/parent). Normalerweise ist es einfacher, Funktionen zu verwenden, die im anderen Fenster definiert sind, anstatt direkt mit Variablen zu arbeiten.

Fenster können jedoch absterben oder sich weiterbewegen, und Browser gehen anders damit um. Stellen Sie sicher, dass ein Fenster (a) noch geöffnet ist (! Window.closed) und (b) die erwartete Funktion verfügbar ist, bevor Sie versuchen, es aufzurufen.

Einfache Werte wie Strings sind in Ordnung, im Allgemeinen ist es jedoch keine gute Idee, komplexe Objekte wie Funktionen, DOM-Elemente und Schließungen zwischen Fenstern zu übergeben. Wenn ein untergeordnetes Fenster ein Objekt aus seinem Öffner speichert, schließt der Öffner, das Objekt kann "tot" werden (in einigen Browsern wie z. B. IE) oder einen Speicherverlust verursachen. Seltsame Fehler können folgen.

7
bobince

Das Übergeben von Variablen zwischen den Fenstern (wenn sich Ihre Fenster in derselben Domäne befinden) können Sie ganz einfach über Folgendes durchführen: 

  1. Kekse 
  2. lokaler Speicher. Stellen Sie nur sicher, dass Ihr Browser localStorage unterstützt, und führen Sie das Recht zur Variablenpflege (Hinzufügen/Löschen/Entfernen) aus, um localStorage sauber zu halten. 
3
Roman M

Sie können Variablen und Verweise auf Dinge im übergeordneten Fenster ganz einfach übergeben:

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

Man kann eine Nachricht vom "Eltern" -Fenster an das "Kind" -Fenster übergeben:

Öffnen Sie im übergeordneten Fenster das Kind

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

die entsprechend dem Kontext ersetzt werden

Im "Kind"

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

Der if-Test muss entsprechend dem Kontext geändert werden

2
Brault Gilbert

In Ihrem Elternfenster:

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

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

Es gibt möglicherweise viele Fehlerprüfungen, die Sie beim Parsing Ihrer Schlüssel/Wert-Paare durchführen sollten. Vielleicht kann jemand in einer späteren Antwort eine umfassendere Javascript-Abfragezeichenfolge-Parsingroutine bereitstellen.

2
Grant Wagner

Ja, dies ist möglich, solange sich beide Fenster in derselben Domäne befinden. Die window.open () - Funktion gibt ein Handle an das neue Fenster zurück. Das untergeordnete Fenster kann mit dem DOM-Element "opener" auf das übergeordnete Fenster zugreifen.

1
Jordan Mack

Sie können window.name als Datentransport zwischen Fenstern verwenden - und es funktioniert auch domänenübergreifend. Nicht offiziell unterstützt, funktioniert aber meines Wissens nach sehr gut über Browser.

Mehr Infos hier zu diesem Stackoverflow Post

0
Brad Parks

Alternativ können Sie es der URL hinzufügen und die Skriptsprache (PHP, Perl, ASP, Python, Ruby usw.) auf der anderen Seite verarbeiten. So etwas wie:

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

Ich habe Schwierigkeiten gehabt, erfolgreich Argumente an das neu geöffnete Fenster zu übergeben.
Hier ist was ich erfunden habe:

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

Beispielaufruf:

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

Live-Beispiel

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

0
singe3