Zugriff auf Objekte aus anderem Browserfenster
Paul
- javascript
Moin,
ich möchte in einem Hauptfenster per Klick andere Fenster öffnen. Diese bekommen eine laufende Nummer um sie später ansprechen zu können. Dieses Ansprechen möchte ich von einem Kindfenster auf alle anderen Kindfenster durchführen.
Kindfenster über das Hauptfenster öffnen:
// Die Fenster die schon geöffnet sind stehen in diesem hidden-Feld
var fensterNamen = document.getElementById('vFenster').value.split(',');
// aktuelle Fensternummer
var fensterNummer = (fensterNamen == "") ? "1" : fensterNamen.length+1;
// neues Fenster wird geöffnet
v[fensterNummer] = window.open(adresse+"&fenstername=v"+fensterNummer, "", "top=10px, left=10px, width=100px, height=100px");
// Nummer des Fensters wird im hidden-Feld gespeichert
if (document.getElementById('vFenster').value == "") {
document.getElementById('vFenster').value = "v"+fensterNummer;
}
else {
document.getElementById('vFenster').value = document.getElementById('vFenster').value+",v"+fensterNummer;
}
Aus Kindfenster andere Kindfenster ansprechen:
// eigener Fenstername (z.B. "v1")
var fenstername = document.getElementById('fenstername').value; // wird per Expression Language gefüllt
// array mit allen Fensternamen
var alleNamen = opener.document.getElementById('vFenster').value.split(",");
// läuft alle (jemals) geöffneten Fenster durch
for (var j = 1; j <= alleNamen.length; j++) {
// prüft ob das Fenster noch geöffnet ist
if (opener[alleNamen[j-1]]) {
alert("Fenster Nr. "+j+" ist noch offen.");
// dem Objekt wir ein Name gegeben
opener[alleNamen[j-1]].name = alleNamen[j-1];
// Nur wenn es nicht das eigene Fenster betrifft
// Alle anderen werden verändert.
if (opener[alleNamen[j-1]].name != fenstername) {
// hidden-Felder der anderen Fenster werden gesetzt
opener[alleNamen[j-1]].document.getElementById('abc').value = "abc";
}
else {
alert("Aktion wurde aus Fenster Nr. "+j+" ausgeführt.");
}
}
else {
alert("Fenster Nr. "+j+" ist schon geschlossen.");
}
}
Wenn ich im Hauptfenster nicht mit dem array "v[fensternummer]" arbeite, sondern mit
v1 = window.open(...
v2 = window.open(...
v3 = window.open(...
können die Kindfenster aufeinander zugreifen. Nur brauche ich die laufende Nummer da der Benutzer so viele Fenster öffnen kann wie er will.
Wie kann ich nun von einem Kindfenster auf das andere zugreifen wenn ich die laufende Nummer im hidden-Feld habe?
Paul
Hi,
Wenn ich im Hauptfenster nicht mit dem array "v[fensternummer]" arbeite, sondern mit
v1 = window.open(...
v2 = window.open(...
v3 = window.open(...
können die Kindfenster aufeinander zugreifen.
warum sollte das mit dem Array nicht gehen?
Wie kann ich nun von einem Kindfenster auf das andere zugreifen wenn ich die laufende Nummer im hidden-Feld habe?
Arbeite mit einem Array.
Cheatah
Hi,
warum sollte das mit dem Array nicht gehen?
Das Öffnen der neuen Fenster läuft ja.
Arbeite mit einem Array.
Das versuche ich ja:
var alleNamen = opener.document.getElementById('vFenster').value.split(",");
// läuft alle (jemals) geöffneten Vertikalschnitt-Fenster durch
for (var j = 1; j <= alleNamen.length; j++) {
alert(opener[alleNamen[j-1]); // !!!! undefiniert oder kein Objekt !!!!
Paul
Hallo,
alert(opener[alleNamen[j-1]); // !!!! undefiniert oder kein Objekt !!!!
?? Wieso sollte auch eine globale Variable mit dem Namen existieren, wenn du doch offenbar gar keine anlegst? Dir ist schon klar, was dieser Code macht und warum/wie er auf dein verworfenes Konzept zugeschnitten ist?
Mathias
Hallo,
erstmal Danke für die Antwort.
Dir ist schon klar, was dieser Code macht und warum/wie er auf dein verworfenes Konzept zugeschnitten ist?
Ne :-(
Habe das mit opener[abc[i]] hier aus dem Forum.
Paul
... Dir ist schon klar ...
erklärst du's mir?
Hallo,
... Dir ist schon klar ...
erklärst du's mir?
Von vorne:
v1 = window.open();
Damit erzeugst du eine globale Variable namens v1. Globale Variablen sind Eigenschaften vom Fensterobjekt, in dessen Kontext das JavaScript ausgeführt wird. Obige Zuweisung erzeugt also die Eigenschaft window.v1.
Wenn du den Variablennamen in einer String-Variable hast, dann kannst du über die Klammer-Schreibweise auf das gespeicherte Fensterobjekt zugreifen:
var variablenname = "v1"
alert( window[variablenname] );
window[variablenname] ergibt dann dasselbe wie window.v1.
Gut, jetzt machst du das ganze indirekt aus einem Popup-Fenster heraus. Auf das gewünschte Fensterobjekt greifst du mit opener zu. Also wäre opener.v1 die besagte globale Variable und du könntest, wenn du ihren Namen als String hast, über opener[variablenname] darauf zugreifen.
Der Code opener[alleNamen[j-1]] läuft auf ein opener["v1"] usw. hinaus. Der sucht beim übergeordneten Fensterobjekt nach einer globalen Variable mit dem Namen »v1«. Das funktioniert natürlich nur solange, wie du die Popup-Fenster auch mit v1 = window.open(...); v2 = window.open(...); usw. öffnest.
Wenn du aber die Referenzen auf die Popup-Fensterobjekte nicht mehr in den globalen Variablen v1, v2 usw. speicherst, sondern in einem Array, funktioniert auch opener["v1"] logischerweise nicht mehr. Stattdessen musst du auf den Array zugreifen und darin über den Index das Popup-Fensterobjekt nachschlagen.
Im Ursprungsfenster z.B.:
var fensterobjekte = new Array();
fensterobjekte[0] = window.open(...);
Im Popup-Fenster dann:
var i = 0; // Fensternummer
alert( opener.fensterobjekte[i] ); // ergibt das Fensterobjekt
Mathias
Hallo,
opener[alleNamen[j-1]]
Wie kann ich nun von einem Kindfenster auf das andere zugreifen wenn ich die laufende Nummer im hidden-Feld habe?
Ähm, was genau ist jetzt deine Frage?
Mit opener["v1"] greifst du auf eine globale Variable zu. Wenn du jetzt wie empfohlen einen Array verwendest, so hängt der ebenfalls als globale Variable am entsprechenden window-Objekt. Also kannst du gleichermaßen opener.v[fensternummer] notieren. Wolltest du das wissen?
Im Übrigen solltest du nicht immer dieselben Objektketten (opener[alleNamen[j-1]]) wiederholen, sondern das Fensterobjekt in einer Variable speichern. Das erhöht die Übersichtlichkeit und nimmt dem JavaScript-Interpreter die Arbeit ab, diese Ausdrücke immer wieder von neuem aufzulösen.
Mathias