Funktion auf anderer Seite im Kontext dieser Seite aufrufen
Jens Bauer
- javascript
Hi,
ist es irgendwie möglich, eine JS-Funktion auf einer Seite A von einer Seite B aus anzusprechen, und die Funktion läuft danach im Kontext der Seite A?
Ich möchte z.B. eine Funktion bereitstellen, die sich selbst auf Zuruf von außen aktualisiert. Deshalb stehen in der Funktion natürlich Aufrufe wie getElementByID, die direkt auf die Seite selbst verweisen.
Moment ist es so, dass die Fnuktion natürlich im Kontext von Seite B ausgführt wird, und daher diese aktualisiert :-)
Gibts da ne elegante Lösung?
VG,
Jens
:)
ist es irgendwie möglich, eine JS-Funktion auf einer Seite A von einer Seite B aus anzusprechen, und die Funktion läuft danach im Kontext der Seite A?
so wie du es beschreibst, nein.
Struppi.
hi,
ist es irgendwie möglich, eine JS-Funktion auf einer Seite A von einer Seite B aus anzusprechen, und die Funktion läuft danach im Kontext der Seite A?
Vielleicht durch "Klonen" der Funktion?
Function hat eine toString-Methode (die automatisch angewendet wird, wenn du die Funktion in einem String-Kontext verwendest) - und du kannst neue Funktions-Objekte auch unter Übergabe von Javascript-Code in einem String als Parameter des Konstruktors erzeugen.
http://de.wikipedia.org/wiki/Javascript#Funktionen
(Aber vielleicht ist selbst das noch zu umständlich gedcht.)
gruß,
wahsaga
Hallo,
Vielleicht durch "Klonen" der Funktion?
Function hat eine toString-Methode (die automatisch angewendet wird, wenn du die Funktion in einem String-Kontext verwendest) - und du kannst neue Funktions-Objekte auch unter Übergabe von Javascript-Code in einem String als Parameter des Konstruktors erzeugen.
http://de.wikipedia.org/wiki/Javascript#Funktionen
Echtes Kopieren ist eigentlich nicht nötig, Referenzieren reicht.
var objekt1 = new Object; objekt1.name = "1";
var objekt2 = new Object; objekt2.name = "2";
objekt1.func = function () { alert(this.name); };
objekt2.func = objekt1.func;
alert("identisch? " + (objekt1.func === objekt2.func));
objekt1.func(); // ergibt 1
objekt2.func(); // ergibt 2
Die Funktion liegt hier nur einmal im Speicher, objekt1.func und objekt2.func verweisen auf dieselbe Funktion, sind also identisch.
Wohin »this« zeigt, ist nicht einmalig festgelegt, sondern ergibt sich aus dem (syntaktischen) Kontext. Hängt man das Funktionsobjekt an ein Objekt und notiert objekt.func(), dann ist this gleich objekt. Wenn man einfach nur func() schreibt, so ist der Kontext das globale Objekt:
window.name = "global";
var func = objekt1.func;
func(); // würde global ausgeben
Ein echtes Kopieren über toString() ist (immer?) unnötig, schließlich kann ich eine Methode durch Anlegen einer Referenz im Kontext eines beliebigen Objektes aufrufen. Und dann gibts sowieso noch call()/apply(), sodass man nicht einmal notwendigerweise eine Referenz anlegen muss.
Mathias
Hallo,
Ich verstehe deine Frage nicht ganz. Was hast du denn genau vor und wie ist die Ausgangssituation? Zwei Dokumente parallel sind höchstens in einer (i)frame-Umgebung möglich.
Mal angenommen, es gibt A.html und B.html ist darin durch einen iframe eingebunden. In A wird eine Funktion func definiert. In B kann man diese über parent.func() aufrufen. In dem Fall wird func im Kontext des window-Objektes von A ausgeführt. (window.)document.getElementById usw. in func beziehen sich damit auf das Dokument A, nicht B.
Allgemein kann man eine Funktion, egal wo sie notiert wurde und an welchem Objekt sie hängt, im Kontext eines bestimmten anderen Objektes ausführen. So kann bspw. in B eine Funktion definiert werden und dann über call() im Kontext des window-Objektes von A ausgeführt werden. Anstatt über window greift man dann über this auf das jeweilige window-Objekt zu:
function func () { this.document.getElementById(...) ... }
parent.func.call(parent);
Aber genauso könnte man die Funktion kopieren, denn durch die Schreibweise »objekt.methode()« wird Methode immer im Kontext von objekt ausgeführt, wo auch immer sie vorher notiert wurde:
parent.func = func;
parent.func();
Aber wie gesagt, Hintergrundinfos zu deiner Frage wären sehr interessant, denn jetzt hast du drei ganz verschiedene Antworten, die anscheinend alle nicht dein Kernproblem beleuchten.
Mathias