Cross domain AJAX
I fredags öppnades mina ögon en aning när jag förstod att de javascript som man inkluderar faktiskt kan köra kod från det anropande scriptet. Det konstiga är egentligen att jag inte förstått det tidigare eftersom jag skrivit en diger mängd javascript som inkluderar andra javascript. Nåväl det som är coolt och lite nytt för mig är att man på detta sätt kan “plantera” callback funktioner och i dessa callback funktioner passar det ju utmärkt om man för in JSON data som är evaluerad och klar att användas på klienten.
Exempel:
mydomain1.com/client.html:
<script src=”http://mydomain2.com/client.js”></script>
mydomain2.com/client.js:
function myCallback(data)
{
var theDate = data.date;
//handle theDate…
}
var req = ‘http://mydomain2.com/server.js’;
document.write(”<scr”+”ipt></scr”+”ipt>”);
mydomain2.com/server.js:
myCallback({”date”:new Date()});
Självklart ska server.js vara en server-side komponent.
Det som är helt suveränt är att man kan sluta krångla med iframes och document.domain odyl och bara skriva fina webbtjänster a’la REST som sprutar ur sig JSON. Nu återstår egentligen en enda sak för mig och det är att kunna göra exakt ovanstående men synkront. Denna metod är ju asynkron då browsern kommer ladda tredjepartsscriptet efter att detta script är färdigevaluerat. Om nån vet hur man gör synkrona requests cross-domain så får man gärna kommentera här
Exempel på hur man gör inom en domän: Synchronous javascript
Uppdatering: Läste igenom hur man kan göra samma sak med XhrIframeProxy, vilket är ett ramverk som DOJO bjuder på. Lärde mig också att servern måste sätta content-type till text/javascript för att det anropande scriptet ska autoevaluera det.
Etiketter:AJAX, cross domain, Javascript


Lämna svar
trackback
maj 18th, 2008 at 9:17 e m
Varför synkront? Du kan väl lika gärna göra en (eller flera) globala variabler som används i din JSON-callback? jQuery har nog annars stöd även för synkrona anrop. Men gör du en inline function som JSON-callback i jQuery så funkar det ju ungefär som ett synkront anrop, typ som jag har i mitt JSON-exempel på http://www.frisim.com/kategori/twingly.php?q=tailsweep
Eller menar du något annat?
maj 18th, 2008 at 9:45 e m
Ja precis det är ju ett sätt.
Nu när jag tänker efter så kan man nog lösa det mesta med callbacks men det finns nog svårare lägen.
Tänk om du först inkluderar script1 som laddar server.js asynkront.
script2 ska göra ett val baserat på data som ska vara initierat när script1 kört klart. script2 kan ju mycket väl laddas innan server.js. script1 och 2 är två filer som en html sida ropar in i detta fall.
Enlighten me!
maj 18th, 2008 at 10:25 e m
Njo, okej. Min erfarenhet är att mycket av logiken kan flyttas till serverscript, vilket gör att du inte behöver inkludera två script från “förstasidan”.
Annars är nog det mest komplexa jag gjort när det gäller Javascript/Ajax/includes det som finns på Catweb.nu (utprovad på http://www.n7.se/lokala.php ) som också använder en cookie.
Knuff.se och Yahoo “related content” gör ungefär samma sak, men utan cookie.
maj 19th, 2008 at 8:10 f m
Hej.
Jag har faktiskt ett konkret fall där det blir problem med asynkrona anrop.
1. Kolla om sessions cookie X finns om inte anropa servern och få ett UUID som stoppas in i en ny sessionscookie. Värdet taget antingen från servern eller den befintliga cookien vill man använda i steg3.
2. Kolla om persistent cookie Y finns om inte anropa servern och få ett UUID som stoppas in i en ny persistent cookie. Värdet taget antingen från servern eller den befintliga cookien vill man använda i steg3.
3. Anropa en server-side statisitikkomponent, skicka in både session-UUID och “globalt” UUID och räkna besöket.
Jag skulle vilja ha två olika server-side komponenter, en som är ansvarig för sessioner och en som ansvarig för att generera globala UUID’s.
Detta fall kan ju lösas genom att bara skicka in olika kommandon till en enda server-side komponent men inte lika vackert och löskopplat.
För att fatta mig kort så skulle jag vilja kunna välja “stil” på hur jag utvecklar men livet är inte alltid fullt av val.
BYTW så har öppnat search.tailsweep.com för JSON svar med callbacks. Ska deploya det idag tänkte jag.