1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <textarea id="mytextarea11">my test 1 2 3 </textarea> <textarea id="mytextarea12">my test2 4 5 6</textarea> <br> <input type="button" name="button" value="Submit" onclick="javascript:get(this.parentNode,1);"> </form> <br><br> Server-Response:<br> <hr> <span name="myspan1" id="myspan1">hoi?</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | function makePOSTRequest(url, parameters, nr) { http_request = false; if (window.XMLHttpRequest) { // Mozilla, Safari,... http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { // set type accordingly to anticipated content type //http_request.overrideMimeType('text/xml'); http_request.overrideMimeType('text/html'); } } else if (window.ActiveXObject) { // IE try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!http_request) { alert('Cannot create XMLHTTP instance'); return false; } http_request.onreadystatechange = alertContents; http_request.open('POST', url, true); http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http_request.setRequestHeader("Content-length", parameters.length); http_request.setRequestHeader("Connection", "close"); http_request.send(parameters); } function alertContents() { if (http_request.readyState == 4) { if (http_request.status == 200) { //alert(http_request.responseText); result = http_request.responseText; document.getElementById("myspan1").innerHTML = result + "<input type="button" name="close" value="sluiten" onClick="sluit(1)">"; // alert("myspan"+nr+""); } else { alert('There was a problem with the request.'); } } if (http_request.readyState == 1) { document.getElementById("myspan1").innerHTML = "<img src='img.gif'>" } if (http_request.readyState == 2) { document.getElementById("myspan1").innerHTML = "<img src='img.gif'>" } if (http_request.readyState == 3) { document.getElementById("myspan1").innerHTML = "<img src='img.gif'>" } } function get(obj, nr) { var poststr = "mytextarea"+nr+"1=" + encodeURI( document.getElementById("mytextarea"+nr+"1").value ) + "&mytextarea"+nr+"2=" + encodeURI( document.getElementById("mytextarea"+nr+"2").value ); makePOSTRequest('update2.php', poststr, nr); } function sluit(nr) { document.getElementById("myspan"+nr).innerHTML = ""; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | function makePOSTRequest(url, parameters, nr) { http_request = false; if (window.XMLHttpRequest) { // Mozilla, Safari,... http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { // set type accordingly to anticipated content type //http_request.overrideMimeType('text/xml'); http_request.overrideMimeType('text/html'); } } else if (window.ActiveXObject) { // IE try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!http_request) { alert('Cannot create XMLHTTP instance'); return false; } http_request.onreadystatechange = alertContents(nr); http_request.open('POST', url, true); http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http_request.setRequestHeader("Content-length", parameters.length); http_request.setRequestHeader("Connection", "close"); http_request.send(parameters); } function alertContents(nr) { if (http_request.readyState == 4) { if (http_request.status == 200) { //alert(http_request.responseText); result = http_request.responseText; document.getElementById("myspan"+nr+"").innerHTML = result + "<input type="button" name="close" value="sluiten" onClick="sluit("+nr+")">"; // alert("myspan"+nr+""); } else { alert('There was a problem with the request.'); } } if (http_request.readyState == 1) { document.getElementById("myspan"+nr+"").innerHTML = "<img src='img.gif'>" } if (http_request.readyState == 2) { document.getElementById("myspan"+nr+"").innerHTML = "<img src='img.gif'>" } if (http_request.readyState == 3) { document.getElementById("myspan"+nr+"").innerHTML = "<img src='img.gif'>" } } function get(obj, nr) { var poststr = "mytextarea"+nr+"1=" + encodeURI( document.getElementById("mytextarea"+nr+"1").value ) + "&mytextarea"+nr+"2=" + encodeURI( document.getElementById("mytextarea"+nr+"2").value ); makePOSTRequest('update2.php', poststr, nr); } function sluit(nr) { document.getElementById("myspan"+nr).innerHTML = ""; } |
1 2 3 | alertContents(nr); } |
check! :)quote:Op zondag 1 april 2007 10:41 schreef SuperRembo het volgende:
onreadystatechange moet een functie zijn die uitgevoer kan worden als de readystate van de request veranderd. In de oude versie is het inderdaad een functie, in de nieuwe versie wordt de functie alertContents meteen uitgevoerd en het resultaat (null/undefinded) wordt aan onreadystatechange toegekend.
Extra parameters doorgeven kan met behulp van een closure:
[ code verwijderd ]
hoe bedoel je dat? Het is de bedoeling dat er meerdere 'forms' komen (zoals dit dus-->)quote:Als je toch alle gegevens via javascript wil ophalen en de form submit niet gebruikt, dan kan je beter de hele form tag weg laten.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <input id="mytextarea11" value="my test"> <input id="mytextarea12" value="my test"> <input type="button" name="button" value="Submit" onclick="javascript:get(this.parentNode,1);"> </form> <div id="myspan1"></div> meteen wat tekst? <form action="javascript:get(document.getElementById('myform'),2);" name="myform2" id="myform2"> <input id="mytextarea21" value="my test"> <input id="mytextarea22" value="my test"> <input type="button" name="button" value="Submit" onclick="javascript:get(this.parentNode,2);"> </form> <div id="myspan2"></div> meteen wat tekst? |
je bedoelt dmv style="display:none"?quote:In een onclick attribuut hoort javascript te staan, dus "javascript:" is daar overbodig.
Ik zou de sluit-knop gewoon in je html zetten. Standaard is ie verborgen, alleen als je 'm nodig hebt maak je 'm zichtbaar. Dat werkt een stuk makkelijker dan in javascript een hele button in innerHTML zetten. Hetzelfde geldt voor het 'busy' plaatje.
De action van het form doet hetzelfde als de onclick van de submit button. Ik vraag me af of die action überhaupt uitgevoerd wordt.quote:Op zondag 1 april 2007 15:13 schreef qu63 het volgende:
hoe bedoel je dat? Het is de bedoeling dat er meerdere 'forms' komen (zoals dit dus-->)
HTML
Ja.quote:je bedoelt dmv style="display:none"?
wordt idd niet uitgevoerd..quote:Op zondag 1 april 2007 15:59 schreef SuperRembo het volgende:
[..]
De action van het form doet hetzelfde als de onclick van de submit button. Ik vraag me af of die action überhaupt uitgevoerd wordt.
Maar is wel nodig voor de validatie van je document. Als dat je uberhaupt iets uitmaakt.quote:
Jup.quote:Op dinsdag 10 april 2007 14:36 schreef Geqxon het volgende:
Op wat voor manier moet er ingelogd worden? Een username / password veld op een pagina oid?
1 |
1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | // functie 1 function getpageBody(name) { http.open("GET", urlpageBody + escape(name), true); http.onreadystatechange = function() { if (http.readyState == 4) { results = http.responseText; if(results!=''){ document.getElementById('PageVersion').innerHTML=getVersions(name); // dit gaat dus blijkbaar fout }else{ document.getElementById('PageVersion').innerHTML=' '; } } } http.send(null); } //functie 2 function getVersions(page) { http.open("GET", urlgetVersions + escape(page), true); http.onreadystatechange = function() { if (http.readyState == 4) { results = http.responseText; if(results!=''){ return http.responseText; }else{ return('leeg'); } } } http.send(null); } ?> |
Volgens mij begrijp jij het concept van AJAX niet helemaal. De eerste A staat namelijk voor asynchronous. Dit houdt in dat je functie niet gaat zitten wachten op input van de webserver. De hele onreadystate functie wordt pas aangeroepen op het moment dat de webserver iets terugstuurt. Je functie retourneert dus inderdaad nooit iets.quote:Op vrijdag 20 april 2007 11:20 schreef George.W.Bush het volgende:
Ik heb een javascript functie welke een andere functie aanroept.
functie 2 haalt via AJAX een aantal waarden op en zou die moeten returnen naar functie 1.
functie 1 moet vervolgens die values in een innerHMTL zetten:
[ code verwijderd ]
Zodra ik deze functies aanroep/ activeer, geeft mijn element PageVersions 'undefined' te zien.
Als ik in functie 2 de return verander in een document.write laat deze wel degelijk de te verwachten output zien. Maar deze output komt op de een of andere manier niet correct in functie 1 terecht.
Wat doe ik fout?
eh nee, die functie retourneert wel degelijk wat. De volgende regel:quote:Op vrijdag 20 april 2007 11:27 schreef cyberstalker het volgende:
[..]
Volgens mij begrijp jij het concept van AJAX niet helemaal. De eerste A staat namelijk voor asynchronous. Dit houdt in dat je functie niet gaat zitten wachten op input van de webserver. De hele onreadystate functie wordt pas aangeroepen op het moment dat de webserver iets terugstuurt. Je functie retourneert dus inderdaad nooit iets.
Je zult dus vanuit die functie zelf wat dingen moeten veranderen.
1 |
1 |
1 2 3 4 5 6 7 | <select onChange="getpageVersion(this.options[this.selectedIndex].value)"> <option selected="selected">Huidige versie</option> <option value="6">-1</option> <option value="2">-2</option> <option value="1">-3</option> </select> |
Je snapt het nog steeds niet. Het stuk vanaf de http.onreadystatechange = function() { tot en met de bijbehorende } wordt niet uitgevoerd totdat er een resultaat is. Dit is dus wat er direct wordt uitgevoerd:quote:Op vrijdag 20 april 2007 11:36 schreef George.W.Bush het volgende:
[..]
eh nee, die functie retourneert wel degelijk wat. De volgende regel:
[ code verwijderd ]
is wat helderder als je deze erbij hebt
[ code verwijderd ]
Nogmaals, als ik in functie 2 document.write('http.responseText'); schrijf ipv return http.responseText; krijg ik gewoon keurig datgene van de webserver te zien wat ik nodig heb.
1 2 3 4 5 | { http.open("GET", urlgetVersions + escape(page), true); http.send(null); } |
quote:Op vrijdag 20 april 2007 11:44 schreef cyberstalker het volgende:
[..]
Je snapt het nog steeds niet. Het stuk vanaf de http.onreadystatechange = function() { tot en met de bijbehorende } wordt niet uitgevoerd totdat er een resultaat is. Dit is dus wat er direct wordt uitgevoerd:
[ code verwijderd ]
En natuurlijk werkt een document.write daar. Die wordt dan uitgevoerd op het moment dat er een resultaat is. Op dat moment is jouw functie getVersions al gestopt zonder een returnvalue.
Klopt inderdaad. Verschil is alleen dat op het moment van die onreadystatechange de functie getVersions allang gestopt is. Die gaat daar niet op zitten wachten. Dat is het hele idee van dat asynchronous. Jij denkt in lineaire code en daar ga je de mist in.quote:Op vrijdag 20 april 2007 11:48 schreef George.W.Bush het volgende:
[..]
Die document.write wordt toch op hetzelfde moment uitgevoerd als die return. Die return vind pas plaats bij de onreadstate
Je bedoelt dat functie een al gestopt is?quote:Op vrijdag 20 april 2007 11:51 schreef cyberstalker het volgende:
[..]
Klopt inderdaad. Verschil is alleen dat op het moment van die onreadystatechange de functie getVersions allang gestopt is. Die gaat daar niet op zitten wachten. Dat is het hele idee van dat asynchronous. Jij denkt in lineaire code en daar ga je de mist in.
1 |
1 2 | setTimeout("document.getElementById('PageVersion').innerHTML="+version+"",1000); |
Je begrijpt het zo te zien nog steeds niet. Omdat ik niet het idee heb dat ik het je zo uit kan leggen dat je het zelf begrijpt heb ik hier een voorbeeldje dat zou moeten werken (niet getest):quote:Op vrijdag 20 april 2007 12:44 schreef George.W.Bush het volgende:
fuck, ook met een timertje ingebouwd werkt het niet.
[ code verwijderd ]
iemand nog een idee hoe ik functie 1 kan laten wachten op de results van functie 2?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | { http.open("GET", urlpageBody + escape(name), true); http.onreadystatechange = function() { if (http.readyState == 4) { results = http.responseText; if(results!='') { document.getElementById('PageVersion').innerHTML=results; } else { document.getElementById('PageVersion').innerHTML=' '; } } } http.send(null); } |
Zie de post boven je, ik heb iets soortgelijks gedaan. Ik begreep je wel, maar wist even niet hoe het op te lossen. Door inderdaad beide functie's in 1 functie te integreren is het probleem opgelost.quote:Op vrijdag 20 april 2007 13:29 schreef cyberstalker het volgende:
[..]
Je begrijpt het zo te zien nog steeds niet. Omdat ik niet het idee heb dat ik het je zo uit kan leggen dat je het zelf begrijpt heb ik hier een voorbeeldje dat zou moeten werken (niet getest):
[ code verwijderd ]
Dat valt wel mee volgens mij. http request 1 trekt de inhoud van een gekozen pagina uit de pagina tabel en plaatst die in mijn fckeditor (getPageBody). In deze funtie heb ik nu getVersions geintegreerd die via een xmlhttprequest een andere query uitvoert die uit de versie tabel het aantal versies van de gekozen pagina haalt en deze toont.quote:Sowieso is het vreemd dat je in zowel functie 1 als functie 2 een http request doet.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |