kostenloser Webspace werbefrei: lima-city


AJAX Reqeust onComplete ohne Funktion?

lima-cityForumDie eigene HomepageHTML, CSS & Javascript

  1. Autor dieses Themas

    beachteam

    beachteam hat kostenlosen Webspace.

    Hallo Leute. ich hab da ein kleines Problem mit einem AJAX.Request.

    Generell wird es ja so gehandhabt, dass die Anfrage an myphpscript.php gesendet wird, wobei ich per post die Parameter in data übergebe und danach, wenn der Request beendet ist die Funktion reaction aufgerufen wird, welche ein XMLHTTPRequest Objekt mit übergeben bekommt, sodass ich dann letztlich auf meine Ausgabe zugreifen kann und diese zB in ein HTML element mit der ID output schreiben kann. Im Folgenden mal die code-Segmente

    AJAX-Request
    var myAjax = new Ajax.Request("myphpscript.php",
     {method: 'post', parameters: data, onComplete: reaction});


    myphpscrip.php
    <?php echo "meine Ausgabe"; ?>


    JS Funktion reaction
    function reaction ( request ) {
       document.getElementById('output').innerHTML=reqeust.responseText;}


    Nun möchte ich allerdings am Ende des Requests bei onComplete keine Funktion aufrufen, sondern die rückgabe DIREKT verarbeiten. Unter onComplete muss hier ja die Funktion ohne die Klammern () angegeben werden, damit die funktion nicht direkt, sondern erst nach Ende des Requests aufgerufen wird. Wenn ich dort also eine Funktion einbau, dann ist das ganze zeitlich versetzt. Also zum Beispiel könnte ich das ganze direkt in eine Variable foo reinschreiben.

    onComplete: function(o){ foo = o.responseText;}


    Aufgrund des zeitl. versatzes ist diese Variable allerdings beim ersten Zugriff auf den Request zum Zeitpunkt des schreibens noch leer, erst bei einem zweiten Aufgruf ist sie dann (noch vom vorherigen) gefüllt, was denke ich mal damit zusammenhängt, dass ich hier ja praktisch eine Funktion mit Klammern () angebe und diese daher direkt ausgeführt wird, bevor der eigentliche Request beendet ist.

    Jetzt also meine Frage ob ihr eine Idee habt wie ich das ganze realisieren könnte?


  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. also meiner meinung nach müssts schon so gehen...

    var myAjax = new Ajax.Request("myphpscript.php",
    {
        method: 'post', 
        parameters: data, 
        onComplete: function(res) {
             alert(res.responseText);
        }
    });


    ansonsten versuchs mal mit onSuccess.
  4. t*****b

    beachteam schrieb:
    Unter onComplete muss hier ja die Funktion ohne die Klammern () angegeben werden, damit die funktion nicht direkt, sondern erst nach Ende des Requests aufgerufen wird. Wenn ich dort also eine Funktion einbau, dann ist das ganze zeitlich versetzt. Also zum Beispiel könnte ich das ganze direkt in eine Variable foo reinschreiben.

    onComplete: function(o){ foo = o.responseText;}


    Aufgrund des zeitl. versatzes ist diese Variable allerdings beim ersten Zugriff auf den Request zum Zeitpunkt des schreibens noch leer, erst bei einem zweiten Aufgruf ist sie dann (noch vom vorherigen) gefüllt, was denke ich mal damit zusammenhängt, dass ich hier ja praktisch eine Funktion mit Klammern () angebe und diese daher direkt ausgeführt wird, bevor der eigentliche Request beendet ist.


    Wie arbeitest du mit foo weiter? Ich vermute, dein Zeitversetztes Problem liegt darin, dass das Script trotzdem weiter läuft, in etwa so:

    1. Aufruf
    - foo ist leer
    - Request wird aufgerufen
    - foo ausgeben / weiter arbeiten mit foo (aber foo ist noch nicht geändert)
    - foo wird jetzt erst geändert, da erst jetzt die Daten "ankommen"
    
    2. Aufruf
    - foo hat den Wert des ersten Aufrufes
    - Request wird aufgerufen
    - foo ausgeben / weiter arbeiten mit foo (Wert ist gesetzt)
    - foo wird jetzt erst aktualisiert, da erst jetzt die Daten "ankommen"


    Dadurch kannst du mit foo erst nach dem zweiten Aufruf arbeiten, da der Wert erst dann geändert wurde. Du könntest aber direkt in onComplete arbeiten und nicht über eine Variable.



    Beitrag zuletzt geändert: 24.2.2010 10:55:07 von trueweb
  5. Autor dieses Themas

    beachteam

    beachteam hat kostenlosen Webspace.

    Naja ok dann gebe ich doch nochmal ein paar mehr Details preis xD

    Das Problem tirtt bei der Registrierung für meine Seite auf. Der Benutzer soll einen Benutzernamen (und weiter Angaben) machen, drückt er den SUBMIT-Button wird per onclick und JS vorher mal geprüft ob alle Angaben korrekt sind, was sich ja wunderbar per JS machen lässt. Alelrdings soll bei dieser Prozedur auch gleich geprüft werden, ob der Benutzername schon vergeben ist, ich brauche also eine Datenbankabfrage. Mit JS etwas schwierig, also PHP, allerdings bin ich in einem JS Skript, also AJAXRequest.

    Nun rufe ich eben in diesem JS Skript einige Funktionen auf, welche die Eingaben prüfen und sich mit TRUE oder FALSE zurück melden, je nachdem ob die Eingabe korrekt ist oder nicht. Das gleiche Verhalten möchte ich auch bei dem Check des Benutzernamens machen.

    Ich mache also eine DB Abfrage in der ich einfach zB die UserID für den besagten Benutzernamen auslese, ist die Antwort NULL ist er noch nicht vergeben. Wenn ich nun allerdings am Ende des Requests eine andere Funktion aufrufe, dann bekomme ich keine Rückgabe von TRUE oder FALSE mehr durch meine aufgerufen Funktion hin, welche den Request absetzt.

    Ich müsste also irgendwas machen wie:

    var myAjax = new Ajax.Request("myphpscript.php",
    {
        method: 'post', 
        parameters: data, 
        onComplete: function(o) { foo = o.responseText; }
    }
    
    if (isset(foo)) {
      return false;
    } else {
      return true;
    }


    Wobei das PHP Skript hier in dem Fall eben einfach die DB Abfrage zurückgibt, also NULL falls der Name nicht existiert, und eben die ID falls er existiert.

    Hoffe meni Problem ist dadurch klarer geworden und was ich mit "Variable weiterverarbeiten" meine.
  6. t*****b

    Dein Problem habe ich schon erläutert, hier nochmal im Quelltext kommentiert:

    var myAjax = new Ajax.Request("myphpscript.php",
    {
        method: 'post', 
        parameters: data, 
        onComplete: function(o) { foo = o.responseText; } // wird zwar aufgerufen sobald das Request fertig ist, jedoch läuft das Script weiter
    }
    
    // wird ausgeführt, auch wenn das Request noch nicht fertig ist. foo ist also noch leer
    if (isset(foo)) {
      return false;
    } else {
      return true;
    }
    
    // jetzt irgendwann ist das Script fertig und foo gesetzt. Beim zweiten Aufruf hat es also einen Wert.


    Lösen könntest du es zB so:

    var myAjax = new Ajax.Request("myphpscript.php",
    {
        method: 'post', 
        parameters: data, 
        onComplete: function(o) { foo(o.responseText); } 
    }
    
    function foo(bar) {
     alert(bar);
    }


    oder eben direkt:

    var myAjax = new Ajax.Request("myphpscript.php",
    {
        method: 'post', 
        parameters: data, 
        onComplete: function(o) { alert(o.responseText); } 
    }
  7. Autor dieses Themas

    beachteam

    beachteam hat kostenlosen Webspace.

    Hm ja ok, wie gesagt, das ganze funktioniert echt super, in dem alert() Fenstert steht dann der entsprechende Wert. Das ganze bringt mich allerdings nicht weiter, weil ich trotzdem nicht auf die Variable zugreifen kann...

    Wenn ich etwas versuche wie
    function checkit() {     
          var myAjax = new Ajax.Request("usernamecheck.php",
    	  {method: 'post', parameters: 'username=XXX', 
               onComplete: function f(o) {val = o.responseText}});
    	  return val;
        }


    komme ich nicht weiter...

    Beitrag zuletzt geändert: 25.2.2010 17:17:42 von beachteam
  8. g****e

    maaaal ne ganz dumme frage: welches framework nutzt ihr 0.0
    wenn du es dir leicht machen willst les dich mal in jQuery rein, denn des Ajax nutzen von da ist sehr leicht. sollte es nicht dein fall sein, dann anders ;-)

    also, ähm, die grund ajaxfunktion wird in einem readystate gemessen, das heißt der server antwortet dir wie weit er ist.
    das heißt deine datenverarbeitung kannst du hier ansetzen (ich hab ma ne uralte ajax function von mir modelliert):

    function ajax_request(page) {
    
    var xmlhttp;
    //im folgenen wird erstmal geprüft was für nen browser die anfrage sendet, oder ob er es überhaupt kann.
    if (window.XMLHttpRequest) {
      // code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp = new XMLHttpRequest();
      } else if (window.ActiveXObject) {
      // code for IE6, IE5
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } else {
      alert("Your browser does not support XMLHTTP!");
      }
    //prüfung auf tauglichkeit  fertig, nun setzen wir den eventhändler
    
    xmlhttp.onreadystatechange = function() {
    
    if(xmlhttp.readyState==4) {
    //xmlhttp.readyState ist der zustand des servers, wie weit er mit dem script ist. bei dem wert 4 ist er fertig. also kommt hier rein, was du //bearbeiten willst
      
      document.getElementById("content").innerHTML = xmlhttp.responseText;
    
    }
    
    //nun initialisiere ich ne anfrage über die methode GET (tut mir leid, des POST hab ich nie wirklich verstanden, darum nutz ich jQuery)
    
    xmlhttp.open("GET",page,true); //anfrage vorbereiten und einstellen
    xmlhttp.send(null); //anfrage senden. der wert null representiert deine POST werte. da du über GET gehst übergibt man null, wie du 
                                       //willst
    }


    so, ich weiß das ist vllt weit hergeholt, unsauber und an sich vllt nicht das beste, schitt drauf.aber im readyState kannst du direkt damit arbeiten ;-)

    ich hoffe es hat geholfen, sonst würde mich mal interessieren welches framework ihr da behandelt xD ich kenn mich nur mit jQuery aus.

    meine quellen es irgendwann gelernt zu haben:
    AJAX: http://www.w3schools.com/ajax/
    jQuery: http://www.w3schools.com/jquery/

    ich hoffe ich konnte helfen, bitte nicht hauen xD
  9. Autor dieses Themas

    beachteam

    beachteam hat kostenlosen Webspace.

    Das is ja alles schön und gut, und ich könnte mich auch mit dem Gedanken anfreunden direkt in dem onComplete Handling irgendwelche DIVs zu füllen und das dokument zu verändern.

    Aber das wichtige hier für das ich eben einfach keine Lösung finde ist der return

    Die grobe Struktur soll so sein

    function checkit() {
    
      /*
       * AJAX-Request
       */
    
     if (Request == success) {
         return "Name vergeben";
      else {
        return null;
      }


    Die Variablen schreiben und überprüfen klappt super, aber wie bekomme ich in meine Funktion, welche einen AJAX-Request enthält eine Möglichkeit zum return rein?

    Beitrag zuletzt geändert: 26.2.2010 12:51:59 von beachteam
  10. g****e

    öhh

    if(xmlhttp.readyState==4) {
    //xmlhttp.readyState ist der zustand des servers, wie weit er mit dem script ist. bei dem wert 4 ist er fertig. also kommt hier rein, was du //bearbeiten willst
      
     return xmlhttp.responseText;
    
    }


    dann wird der wert nirgenswo hingeschrieben oder so, sondern du erhälst es als rückgabe wert der funktion.
    wenn du des dann so wie ich mit ner funktionsvariable "page" machst, also welche seite du abfragen willst, ist das ne universelle abfrage methode mit return wert.
    mit dem rückgabewert kannst du dann arbeiten. also die rückgabe von forne rein in eine variable speichern:

    var foo;
    foo = ajax_request('news.php');


    dann kannst du dannach dann deine news noch durchsuchen, formatieren oder bearbeiten mit JS. meinste des so oder steh ich komplet auf der leitung?

    falls du testen willst ob die anfrage erfolgreich war, so muss ich dir sagen, dass fällt leider flach. ajax gibt IMMER einen wert zurück. und sei es nur ein 404 Error ;-)
    also müsstest du den return wert auf vllt ein unsichtbaren füllwert einer divbox prüfen, sodass du eine eigene 404-error seite bastelst, und die bei der rückggabe vllt sowas enthält:

    <div style="display:none;" id="error">true</div>


    und den eben nur auf der selbstdefinierten errorpage, und dann abfragst was darin steht und es vergleichst.
    wäre nur nen vorschlag, gibt sicherlich ne millionmal bessere ideen ;-)
    aber mir fällt gerade nichts ein xD

    ich hoffe das hilft :-)
  11. Autor dieses Themas

    beachteam

    beachteam hat kostenlosen Webspace.

    Naja ich habs analog mit nem einfachen ajax.Request versucht:

    if(checkit() != null) {
          alert("CHECK");
        }
        
        
        function checkit() {
          var myAjax = new Ajax.Request(myscript.php",
          {method: 'post', parameters: 'username=XXX', 
          onComplete: 
            function f(response) { 
              if(typeof response.responseText != "undefined") {
                return "BLA"
              } else {
                return null
              }
            }
          })
        }


    Leider ohne erfolg =(
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!