Toon posts:

ajax: javascript returnen en evalueren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Volgende probleem: op een site wordt een session countdown getoond en dmv. een klik kan de sessie tijd verlengt worden. Dit verloopt -mijn inziens- het best via AJAX: in de achtergrond worden de requests afgehandeld en uiteindelijk dient aan de client slechts alleen de nieuwe resterende sessietijd terug te worden gezonden.

Alhoewel de Prototype evalscript() functie goed werkt, gebruik ik deze library niet, omdat deze voor de rest niet gebruikt wordt en daarom eigenlijk te groot is voor deze site. De evalScript methode van AHAH vind ik zeer omslachtig: javascript via DOM in een element schrijven en daarna weer terughalen en dan evalueren. Dubbel werk, dat kan de boel niet sneller maken.

Dus mijn idee was om direct een XML pakket met JS te laten retourneren en vervolgens gelijk te evalueren zonder nieuwe elementen te moeten creeeren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
...
if(xhr.readyState == 4 && xhr.status == 200) {
    if(document.all)
        scriptText = xhr.responseXML.getElementsByTagName("script-response")[0].firstChild.firstChild.xml;
    else {
        var xmlSerializer = new XMLSerializer()
        scriptText = xmlSerializer.serializeToString(xhr.responseXML.getElementsByTagName("script-response")[0].childNodes[1].firstChild);
    }
    
    eval(scriptText);
}
...


Dit is het XML pakket dat wordt terug gezonden:
code:
1
2
3
4
5
6
<?xml version="1.0" encoding="ISO-8859-1" ?>
<script-response>
    <script type="text/javascript">
        endOfSession = new Date(<%= now.getTimeInMillis() %>);
    </script>
</script-response>


Dit werkt ook goed, maar de -2- gebruikte xpaths bevallen mijn niet. Dar moet toch beter kunnen, of niet?! Of zouden jullie de de JS totaal anders laten evalueren?

Dank!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Je response op een Ajax-request hoeft natuurlijk geen XML te zijn; er is ook nog zoiets als responseText ;)

Intentionally left blank


Verwijderd

Topicstarter
Klopt. En als je die al gebruikt en geen reg-ex wil gebruiken om je stukje JS terug te vinden?

Verwijderd

Topicstarter
Misschien JSON maar gebruiken > http://www.json.org/js.html ?

/ps
wat is er gebeurd met de "edit/bewerken" knop?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op maandag 09 oktober 2006 @ 17:42:
Klopt. En als je die al gebruikt en geen reg-ex wil gebruiken om je stukje JS terug te vinden?
Dan zorg je toch dat je response enkel dat bevat wat je nodig hebt zodat je in je script alleen nog maar dit hoeft te doen:
JavaScript:
1
endOfSession  = new Date(xhr.responseText);

Intentionally left blank


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Crisp's idee is in dit geval niet eens zo heel gek, alleen jammer dat je dan geen XML meer gebruikt, maar platte tekst. Als je dan een keer iets toevoegt, moet je de hele boel omgooien.

JSON is dan wel een mooie middenweg. Niet zo plat als gewone tekst, maar compacter dan XML.

Aan de andere kant, als je meer AJAX functionaliteiten hebt, zou ik bij XML blijven, gewoon omdat het dan consistent is. Voor de performance maakt het niet zo ontzettend veel uit.

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

Topicstarter
Crisp: bedankt!

Punt is inderdaad dat ik niet alleen deze sessie waarde wil/moet terug geven en dan is de oplossing van responseText niet genoeg.

/offtopic
Net overigens iets raars, 2x Firefox 1.5.0.7 UK op WinXP Pro, maar bij de ene versie werkt onder/bovenstaand script alleen als er bij aan de xhr.send een null als parameter werd mee gegeven. Raar?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var xhr;

if (window.XMLHttpRequest) {
    // IE7, Mozilla, Safari, Opera: Use native object
    xhr = new XMLHttpRequest()
} else if (window.ActiveXObject) {
    // Otherwise: ActiveX control for IE5.x and IE6
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
} 

var url= "bla";

xhr.open('POST', url, true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(null);

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op dinsdag 10 oktober 2006 @ 11:02:
Crisp: bedankt!

Punt is inderdaad dat ik niet alleen deze sessie waarde wil/moet terug geven en dan is de oplossing van responseText niet genoeg.
Dan is JSON misschien een goed alternatief :)
/offtopic
Net overigens iets raars, 2x Firefox 1.5.0.7 UK op WinXP Pro, maar bij de ene versie werkt onder/bovenstaand script alleen als er bij aan de xhr.send een null als parameter werd mee gegeven. Raar?
[...]
Nee, de parameter voor de send-method is verplicht. Bij een POST zou dat de POST-body moeten zijn, dus ik vind het sowieso al raar dat je daar niets meestuurd maar toch POST gebruikt.

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op dinsdag 10 oktober 2006 @ 11:36:
Nee, de parameter voor de send-method is verplicht. Bij een POST zou dat de POST-body moeten zijn, dus ik vind het sowieso al raar dat je daar niets meestuurd maar toch POST gebruikt.
Ok bedankt, maar toch raar dat ie het op die ene bak wel doet.

POST: Ik ook, maar de opdrachtgever heeft GETs verboden, omdat ie geen parameters in de url wil, in dit geval overbodig. Vooral als je ziet hoe POSTs voor XHR geconfigureerd worden.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op woensdag 11 oktober 2006 @ 12:15:
[...]


Ok bedankt, maar toch raar dat ie het op die ene bak wel doet.

POST: Ik ook, maar de opdrachtgever heeft GETs verboden, omdat ie geen parameters in de url wil, in dit geval overbodig. Vooral als je ziet hoe POSTs voor XHR geconfigureerd worden.
Die parameters zie je toch niet bij een Ajax-request? :?
En ik heb het idee dat je toch stiekum parameters in je URL meestuurd (dus GET-vars), of zijn er ueberhaupt geen parameters?

Blijkbaar snapt je opdrachtgever het gewoon niet helemaal, en als hij dingen als ?foo=bar lelijk vind dan kan je altijd nog kijken naar 'mooie' URL's zoals /foo/bar. Om nou alles met POST te gaan zitten doen terwijl in veel gevallen GET gewoon de geijkte methode is lijkt me niet helemaal de juiste manier ;)

Intentionally left blank

Pagina: 1