Prüfen in welchem Fenster eine Funktion aufgerufen wurde.
Christian S.
- javascript
0 Jurik0 Don P0 Christian S.0 Don P0 Don P0 Christian S.0 Don P
0 Don P
Hallo,
ich hab ein iframe. In diesem Iframe rufe ich eine Funktion am parent auf.
im Parent (die Seite selber):
MyNamespace.MyFunction = function()
{
};
Im Iframe:
parent.MyNamespace.MyFunction();
Der Funktionsaufruf an sich klappt auch!
da ich mehrere solcher Iframes habe, wüsste ich gerne auf der Seite, welches Iframe die Funktion aufgerufen hat.
Eine einfache Möglichkeit wäre natürlich das window object mit zu übergeben, und dann in der Funktion alle window.frames[] zu durchlaufen und mit dem contentWindow zu vergleichen.
Nur wäre es wünschenswert, wenn man das auch einfacher, d.h. ohne Parameterübergabe lösen kann.
Seht ihr eine Möglichkeit? Mir schwebte vor, irgendwie durch arguments.callee.window an das window des iframes ranzukommen, aber so geht es leider nicht.
Gruß!
Also deine einfache Möglichkeit finde ich gut - da es doch eh auf dem Client-Rechner geschieht.
Könntest natürlich für jeden iFrame eine neue Funktion schreiben *g* dann wüßtest auch von welchem iFrame es kommt... hehehe ... aber ich glaube das ist nicht so praktikabel.
Was spricht denn dagegen Werte mit zu übergeben?
Hallo,
Was spricht denn dagegen Werte mit zu übergeben?
Genau, das ist hier die Frage.
@Christian:
Eine einfache Möglichkeit wäre natürlich das window object mit zu übergeben, und dann in der Funktion alle window.frames[] zu durchlaufen und mit dem contentWindow zu vergleichen.
Das ist umständlich. Man muss nicht alle window.frames[] durchlaufen, wenn man "self" (das ist genau das iframe-Objekt) übergibt.
im Parent (die Seite selber):
MyNamespace.MyFunction = function(fromIframe)
{
};
Im Iframe:
parent.MyNamespace.MyFunction(self);
Gruß, Don P
Hi
Was spricht denn dagegen Werte mit zu übergeben?
Genau, das ist hier die Frage.
nicht viel eigentlich... Bin nur jemand, der alles möglichst überschaulich haben möchte.
Hätte ja sein können, dass man auf den "Callstack" auch irgendwie zugreifen kann.
Eine einfache Möglichkeit wäre natürlich das window object mit zu übergeben, und dann in der Funktion alle window.frames[] zu durchlaufen und mit dem contentWindow zu vergleichen.
Das ist umständlich. Man muss nicht alle window.frames[] durchlaufen, wenn man "self" (das ist genau das iframe-Objekt) übergibt.
im Parent (die Seite selber):
MyNamespace.MyFunction = function(fromIframe)
{};
Im Iframe:
parent.MyNamespace.MyFunction(self);
Gruß, Don P
Ja, stimmt natürlich... Ich hätte mein Problem etwas ausführlicher beschreiben sollen. Ich habe auf der eltern seite ein array, welches mir Objekte hält, in welchem u.a. jedes iframe drin ist. Darin müsste ich es natürlich suchen, da ich nicht das window object haben will (das dient halt hier nur zum wiederfinden), sondern das Objekt finden, in dem das iframe steckt. Dann mache ich mit dem gefundenen Objekt etwas anderes.
Zum anderen Thread:
Ich bin jetzt für mich erstmal so verblieben, dass es keine praktikable Lösung dafür gibt und das this eben immer anders sein kann. molily hat mich überzeugt.
Gruß!
Hallo,
Hätte ja sein können, dass man auf den "Callstack" auch irgendwie zugreifen kann.
Kann man, über arguments.caller. Aber das ist eben nur die nackte Funktion(sreferenz). Die hat dann leider sozusagen ihr Mutterobjekt "vergessen" bzw. ist quasi aus ihrer Objekthierarchie herausgerissen.
[...] ein array, [...] Darin müsste ich es natürlich suchen, da ich nicht das window object haben will (das dient halt hier nur zum wiederfinden), sondern das Objekt finden, in dem das iframe steckt.
Ok, das ist ein Frage, die ich auch gerne beantwortet wüsste: Wie kann man generell von einem DOM-Objekt aus auf das/die Eltern-Objekt(e) zugreifen? Das geht wohl nicht ohne weiteres.
Denkbar wäre z.B. dass man den fertigen DOM-Objektbaum von Window aus durchläuft und jedem DOM-Objekt eine Eigenschaft "parentObj" explizit zuweist. Das müsste man dann beim dynamischen Erstellen neuer DOM-Objekte entsprechend weiter praktizieren.
Gruß, Don P
Hallo,
Ok, das ist ein Frage, die ich auch gerne beantwortet wüsste: Wie kann man generell von einem DOM-Objekt aus auf das/die Eltern-Objekt(e) zugreifen? Das geht wohl nicht ohne weiteres.
Was verstehst du unter DOM-Objekte? Knoten haben die Eigenschaft »parentNode«, alles andere ist nicht »DOM«.
Denkbar wäre z.B. dass man den fertigen DOM-Objektbaum von Window aus durchläuft und jedem DOM-Objekt eine Eigenschaft "parentObj" explizit zuweist.
Falls du alle JavaScript-Objekte meinst: Das wäre Overkill.
Das müsste man dann beim dynamischen Erstellen neuer DOM-Objekte entsprechend weiter praktizieren.
Es gibt Fälle, wo man Referenzen braucht und wo ein Objekt über sein Umfeld Bescheid wissen muss, z.B. über den Bezeichner, unter dem es in einem anderen Object gespeichert ist. Aber das sind m.Erf.n. absolute Ausnahmen.
Mathias
Hallo,
Was verstehst du unter DOM-Objekte? Knoten haben die Eigenschaft »parentNode«, alles andere ist nicht »DOM«.
Ja, das habe ich inzwischen auch bemerkt, siehe meinen nächsten Beitrag an Christian S.
Denkbar wäre z.B. dass man den fertigen DOM-Objektbaum von Window aus durchläuft und jedem DOM-Objekt eine Eigenschaft "parentObj" explizit zuweist.
Falls du alle JavaScript-Objekte meinst: Das wäre Overkill.
Wenn schon JavaScript, dann mit Macht ;-)
Scherz beiseite: Das war ja nur so ein Gedanke, ist klar, dass das für JavaScript-Objekte schnell ausarten würde, und für DOM-Objekte ist es ja dank »parentNode« nicht nötig.
Gruß, Don P
Hallo,
[...] müsste ich [...] das Objekt finden, in dem das iframe steckt. Dann mache ich mit dem gefundenen Objekt etwas anderes.
Ok, es geht doch, ohne Parameterübergabe und auch ohne Array, in dem man suchen müsste. Aber vermutlich ist dir auch das wieder zu umständlich ;-):
Parent-Dokument:
--------------------------------------------------------------------------
<html><head><title>Test</title>
<script type="text/javascript">[code lang=javascript]
function Test () { alert( document.getElementsByName(arguments.callee.caller["frameName"])[0].parentNode ); }
</script>
</head>
<body>
<!-- 4 iframes in versch. Containern: -->
<iframe src="iframe.htm" name="myIframe0"></iframe>
<p><iframe src="iframe.htm" name="myIframe1"></iframe></p>
<i><iframe src="iframe.htm" name="myIframe2"></iframe></i>
<div><iframe src="iframe.htm" name="myIframe3"></iframe></div>
</body>
</html>[/code]
--------------------------------------------------------------------------
iframe-Dokument "iframe.htm":
--------------------------------------------------------------------------
<html>
<head><title>iframe</title>
<script type="text/javascript">[code lang=javascript]
Function.prototype.frameName = self.name;
var Aufruf = function () { parent.Test(); }
</script>
</head>
<body>
<p>Ich bin ein iframe.</p>
<a href="javascript:Aufruf();">Was ist mein Container?</a>
</body>
</html>[/code]
--------------------------------------------------------------------------
Die Erweiterung durch Function.prototype kommt nur in den iframes zum Tragen. iframes haben ihren einen eigenen Scope.
Bitte.
Don P
Cool, sehr schöner Ansatz. Nur IE 7 kennt bei mir caller nicht. Ist ja auch deprecated. vielleicht deswegen...
Im FF gehts allerdings.
Gruß!
Hallo,
Cool, sehr schöner Ansatz. Nur IE 7 kennt bei mir caller nicht. Ist ja auch deprecated. vielleicht deswegen...
Ja arguments.caller ist deprecated, aber function.caller sollte doch eigentlich funktionieren. arguments.callee ist eine Funktion, also müsste auch arguments.callee.caller funktionieren. Habe leider keinen IE 7...
Gruß, Don P
Hallo,
Cool, sehr schöner Ansatz. Nur IE 7 kennt bei mir caller nicht. Ist ja auch deprecated. vielleicht deswegen...
Ja arguments.caller ist deprecated, aber function.caller sollte doch eigentlich funktionieren. arguments.callee ist eine Funktion, also müsste auch arguments.callee.caller funktionieren. Habe leider keinen IE 7...
Gruß, Don P
Nein. function.caller ist auch deprecated, laut SelfHTML
< http://de.selfhtml.org/javascript/objekte/function.htm#caller>
Gruß!
Hallo,
Erstmal eine Frage: Haben dir unsere Ausführungen im "JavaScript und this"-Thread irgendwie weitergeholfen oder wie hast du es jetzt gelöst? Wäre nett, wenn man dazu ein kurzes Feedback hätte.
Seht ihr eine Möglichkeit? Mir schwebte vor, irgendwie durch arguments.callee.window an das window des iframes ranzukommen, aber so geht es leider nicht.
Nein, callee ist die aufgerufene Funktion. Was du sucht, ist die aufrufende, also aruments.caller. Diese hat aber keine Eigenschaft .self oder .window, die man abfragen könnte. Das Problem ist wieder dasselbe wie im genannten anderen Thread, dass nämlich eine nackte Funktion bzw. Funktionsrefrenz ihr Mutterobjekt nicht kennt. Ändern lässt sich das wie gesagt nur mit Parameterübergabe oder mit Closures.
Gruß, Don P
Hallo Don,
Erstmal eine Frage: Haben dir unsere Ausführungen im "JavaScript und this"-Thread irgendwie weitergeholfen oder wie hast du es jetzt gelöst? Wäre nett, wenn man dazu ein kurzes Feedback hätte.
Sag mal, wenn er dazu kein Feedback gibt, wieso beantwortest du dann seine neuen Fragen?
Helfersyndrom? ;-)
Ciao
Kurt
Hallo,
Sag mal, wenn er dazu kein Feedback gibt, wieso beantwortest du dann seine neuen Fragen?
Weil es mich auch interessiert. Auch ich lerne dabei. Das Feedback konnte ich ihm ja dadurch "aus der Nase ziehen" mit ein paar weiteren Informationen zum konkreten Problem. Bin eben nicht nachtragend, stört dich das?
Gruß, Don P
Kurtz gegrüßt
stört dich das?
nö, nö ... wollte dir nur Entäuschungen ersparen! :-)
Grüße
Kurt
Hallo,
stört dich das?
nö, nö ... wollte dir nur Entäuschungen ersparen! :-)
Danke, aber keine Sorge, ich kann auf mich aufpassen :-).
Gruß, Don P