Ajax Funktion - Wichtig!
DasNets
- javascript
Hi, habe ne Funktion anhand einiger Templates geschrieben.
Funzt auch sehr gut bis auf die Tatsache, dass ne Variable nicht übergeben wird. Wie kann ich die übergeben?
der Entscheidede Teil des Scriptes sieht so aus:
------------------------------------
function ScriptUser(id) {
url='/index.php?do=ajaxuser&id='+id;
req=getAjax();
req.onreadystatechange=function()
{
if(req.readyState==4&&req.status==200)
{
user=req.responseText;
}
}
return user;
req.open('GET', url , true);
req.send( null );
}
abs=ScriptUser('10');
alert(abs);
------------------------------------
Eigentlich sollte nun ein alert-Fenster kommen indem der Inhalt aus der Datei
/index.php?do=ajaxuser&id='+id;
steht. Tuts aber nicht.
Kann mir jemand sagen, wie ich die Inhalte aus der Variable user in der Funktion in die Variable abs außerhalb bekomme?!
Ist ganz wichtig! Bitte um schnelle Antwort! Danke!
Hallo DasNets,
function ScriptUser(id) {
url='/index.php?do=ajaxuser&id='+id;
req=getAjax();
req.onreadystatechange=function()
{
if(req.readyState==4&&req.status==200)
{
user=req.responseText;
}
}
return user;
sollte das return ... nicht eine Zeile weiter oben, also vor dem Ende der FKT stehen? Sonst werden die beiden folgenden Befehle nie ausgeführt.
req.open('GET', url , true);
req.send( null );
}
abs=ScriptUser('10');
alert(abs);
Ajax ist asyncron. Wenn die Funktion "ScriptUser" fertig ist und der alert kommt, ist die Ajax-Anfrage noch lange nicht fertig. Daher ja der Evenhandler "onreadystatechange". Und wenn Du den return wie oben geschrieben verschiebst, hat die Funktion "ScriptUser" sowieso keinen Rückgabewert mehr. Wenn der alert (und weitere Verarbeitungsschritte) im Eventhandler sind, müsste es gehen.
Gruß, Jürgen
Habe so einiges durchprobiert, und nichts hat geklappt.
Egal wo ich das "return user;" hingestellt habe.
Ich brauche eigentlich nur eine ajax-Funktion die mir als rückgabewert den Inhalt einer Datei gibt.
Hallo DasNets,
Du solltest Dir noch einmal klarmachen, was sich hinter A(synchron)jax verbirgt. Ich bin kein Ajax-Experte, aber soviel ich weiß, wird eine Übertragung "angestoßen" und dann läuft das script weiter. Das Ergebnis wird dann im Eventhandler (on...ready...) verarbeitet. Ob Deine Funktionen die Richtigen sind, kann ich nicht sagen.
Stell Dir vor, Dein Chef ruft ins Büro: "Schreib mir mal eben ein Programm!". Keiner, auch Dein Chef nicht, wird erwarten, dass er das Programm sofort mitnehmen kann. Statt dessen wird dein Chef verschwinden und sich mit anderen Dingen beschäftigen, während Du programmierst. Und wenn Du die Arbeit dann getan hast, rufst Du deinem Chef zu: "Ich bin fertig.". Dann kann er seine Arbeit unterbrechen (oder aufwachen) und sich mit Deinem Werk beschäftigen.
Gruß, Jürgen
Das ist mir alles klar und das weiß ich auch. Ich kann die Variable ja auch in einen DIV-Content schreiben
-------------------------------------------------
function ScriptUser(id) {
url='/index.php?do=ajaxuser&id='+id;
req=getAjax();
req.onreadystatechange=function()
{
if(req.readyState==4&&req.status==200)
{
document.getElementByID('layer').innerHTML=req.responseText;
}
}
req.open('GET', url , true);
req.send( null );
}
-------------------------------------------------
und so funktioniert das auch!
Aber das erfüllt dann nicht den Zweck es soll nicht in irgendnem layer oder so rumliegen, sondern eben in der JavaScript-Variable.
Das hab ich damit gemacht indem ich "document.getElementByID('layer').innerHTML" durch die Variable "user" ersetzt habe.
Wenn ich nun aber versuche die Variable user mittels return in eine andere Funktion zu laden, also:
-------------------------------------------------
function ScriptUser(id) {
url='/index.php?do=ajaxuser&id='+id;
req=getAjax();
req.onreadystatechange=function()
{
if(req.readyState==4&&req.status==200)
{
user=req.responseText;
}
}
req.open('GET', url , true);
req.send( null );
return user;
}
function GetContents() {
user1 = ScriptUser('1');
user2 = ScriptUser('2');
user3 = ScriptUser('3');
// Ausgabe der Variablen z.B. alert(user1+' '+user2+' '+user3);
}
-------------------------------------------------
dann sagt er mir, dass "user" undefiniert sei!
Ich denke, dass es daran liegt, dass die Variable "user" nicht aus der eventHandler-Funktion "req.onreadystatechange" rauskommt, denn wenn ich ein "alert(user)" direkt unter "user=req.responseText;" mache, dann wird mir die Variable im Alert ausgegeben, wenn das alert aber direkt über dem "req.open('GET', url , true);" steht, dann bringt er mir wieder, dass "user" undefiniert ist.
Yerf!
Probiers doch mal mit SJAX (ungetestet):
function ScriptUser(id) {
url='/index.php?do=ajaxuser&id='+id;
req=getAjax();
req.open('GET', url , false);
req.send( null );
user=req.responseText;
return user;
}
Falls das funktioniert versuch trotzdem noch die Ausführungen von Jürgen zu verstehen, weshalb deine anderen Versuche nicht funktionierten.
Gruß,
Harlequin
Danke nochmals - hat nun geklappt!
Hallo DasNets,
Das ist mir alles klar und das weiß ich auch.
Wirklich?
Gruß, Jürgen
Das ist mir alles klar und das weiß ich auch. Ich kann die Variable ja auch in einen DIV-Content schreiben
Das behauptest Du. Das stimmt aber nicht wie man an Deinen weitern Ausfuehrungen sieht.
req.onreadystatechange=function()
{
if(req.readyState==4&&req.status==200)
{
user=req.responseText;
}
}
Das hier ist die Sekretaerin die alle 2 Minuten bei dir reinkommt und fragt: ist der code fertig? Wenn er das ist (if bedingung erfuellt) sagst Du ja! (user=req.responseText)
Ich sehe aber nirgends dass Dein chef mit dem lesen des Programmcodes wartet, bis er fertig ist. Ich seh ihn sich nur wundern warum da nix ist.
Das einzige mal, dass er das tut ist als du in das Div schreibst.
Wie willst Du Variablen uebergeben die noch gar nicht existieren? Du definierst sie ja erst wenn die angeforderten Daten angekommen sind. Das sind sie aber beim Aufruf der Funktion doch noch nicht.
Du rufst eine Funktion auf die einen Datenabruf anstoesst und erwartest dass sie die Daten gleich mitbringt, obwohl niemand weiss wann sie da sind.
Du schmeisst nen Dollar in nen einarmigen Banditen und erwartest, dass er dir Geld ausspuckt, obwohl die Scheiben grad erst beginnen sich zu drehen.
Also lies doch bitte wirklich nochmal genau was man dir hier erklaert hat.