Wir standen vor kurzen vor dem Problem, dass ein bestimmtes, recht aufwendiges, Ajax-ergebnis auf einem anderen Serververbund laufen soll sollte, damit hier die Ressourcen der normalen Webserver entlastet werden.

Im Beispiel liegt die Webseite auf www.example.org und die anzufordernen Daten auf ajax.example.org. Die zweite Domain war hier einfach ein weiterer virtual Service im Loadbalancer, der die Anfragen auf andere Server verteilt, als sie für die eigentliche Webseite genutzt werden.

Die ersten Ansätze nutzen die Methode, via Javascript ein dynamisches Script-Tag in den DOM-Baum einzubinden, diesem die als src das PHP-Skript zu geben und den PHP Teil Javascriptcode ausführen zu lassen. An sich eine recht einfache Methode, wenn man Frameworks nutzt. Den ersten Versuch starteten wir mit Cows-Ajax, hier ergaben sich allerdings Probleme mit Safari. Der zweite Versuch lief dann über dsr.js (Dynamic-Script-Resource), als Teil des Tagneto-Frameworks. Diese Lösung lief in allen Browsern, allerdings war es unschön, dass die Browser angaben, dass hier noch ein Webseiten-Element nicht geladen ist (das PHP-Skript läuft bis zu einer Minute, bevor eine Ausgabe kommt, die Gründe hierfür erläutere ich hier jetzt nicht, wenns wen interessiert, fragt nach).

Dann kamen wir auf die Idee, einfach ein iframe einzubinden, welches auf den “anderen” Webservern liegt, doch dies funktionierte auch nicht, da die “Browser-Domain-Policy” dies nicht zulässt. Ajax-Requests sind nur innerhalb derselben Domain zulässig.

Dan stießen wir auf die Javascript Globale “document.domain”, hierrüber lässt sich die Domain-Policy auflockern. Setzt man document.domain nun auf example.org (in der iframe UND auf der normalen Webseite), ist es möglich, dass das IFrame (ajax.example.org/iframe.php) einen Ajaxrequest an die eigene Domain absendet und das Ergebnis an eine Funktion auf der Hauptdomain weitergibt (parent.funktionsname(ajaxantwort);).

Diese Lösung klappte einwandfrei und war, im gegensatz zur dynamischen-Script-Tag Lösung, sogar wieder mit Firebug zu debuggen. Hier die stark verkürzten Quellcodes:

Hauptseite:

document.domain = "example.org";
function output(answer) { alert(answer); }

IFrame:

document.domain = "example.org";
function getdata(){
//normales ajax request, post oder get,
//url: getdata.php, onreadystatechange: if(alles ok) { gotdata(answer); }
}
function gotdata(answer){
parent.output(answer);
}

Hinterlasse einen Kommentar.

Network-wide options by YD - Freelance Wordpress Developer