Mit XMLHTTPRequest Formular prüfen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mit XMLHTTPRequest Formular prüfen

    Hi,

    ich habe hier ein Formular desenen Werte des Komforts wegen mit JavaScript überprüft werden.

    Auf der Seite wird sich per email/passwort Kennung eingeloggt. Demzufolge darf also keine Email-Adresse doppelt vorkommen. Ich habe mir eine XML-Schnittstelle gebaut die mir diese Information liefert.

    Nun habe ich aber ein Problem:
    Ich komm irgendwie mit dem Timing für das prüfen des Formulars nicht klar. Ich prüfe zuerst die Felder auf Logik und das Email Feld mit ner RegularExpression. Erst wenn das alles passiert ist wir das XMLHTTPRequest Objekt rausgeholt und es wird eine Anfrage gestellt. Ich versuch es momentan Syncron, weil ich ja auf das Ergebnis warten will.

    Leider kann ich aber bei der Definition der Funktion für den onreadystatechange keine Returnwert der aufgerufenen Funktion entgegen nehmen - und da liegt mein Problem. Ich kann also das Ergebniss der Funktion, die mein Request Ergebniss auswertet, nicht nach oben durchreichen um dem Form ein true oder false zu signalisieren.
    Wahsaga hatte im selfhtml Forum auch schon erwähnt das das nicht geht.

    Nun meine Frage: Hat irgendwer nen Tipp oder nen Denkansatz für mich, wie ich das lösen kann?

    Danke.

  • #2
    Re: Mit XMLHTTPRequest Formular prüfen

    Ich verstehe nicht so ganz, wo das Problem liegt.

    Wenn du den Request schon synchron machst, dann "wartet" dein Script doch danach, bis die Serverantwort da ist.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Ja, richtig. Aber ich kann das Ergebniss aus der Funktion die auf das HTTP 200 reagiert nicht hochgeben.

      Beispiel:

      PHP-Code:

      function checkForm(form){
        if(
      form.firstname.value ''){
          
      //...
        
      }

        var 
      RegExpr 
        /^[
      a-zA-Z0-9-_]+(\.[_a-zA-Z0-9-_]+)*@[a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*\.([a-zA-Z]{2,5})$/;
        if(!
      RegExpr.exec(form.email.value) || form.email.value == ''){
          
      //Email nicht valide
        
      }else{
          
      //Email anscheinend ok - Prüfung
          
      if(check_email(form.email.value)){
            
      //misst, email schon vergeben
          
      }else{
            
      //email noch frei - gogogo
          
      }
        }
      }

      var 
      req false;
      function 
      check_email(email){
        var 
      url '/_xml/check_email.php?data=' email;
        
        
      //... req = neues XML HTTP Request Objekt

        
      if(req) {
            
      req.open("GET"urlfalse); //false = syncron, oder?
            
      req.onreadystatechange reqChange//Hier ist das Problem
            
      req.send("");
        }
        
      }

      function 
      reqChange(){
        if (
      req.readyState == 4) {
          if (
      req.status == 200) {
            if(
      req.responseText == 'true'){
              return 
      true;
            }else{
              return 
      false;
            }
          } else {
            
      alert("Problem:\n" +
            
      req.statusText);
          }
        }

      Bei "Hier ist das Problem" kann ich eben das Ergebniss aus reqChange nicht an check_email "hochgeben" - dadurch hängts.

      Ich mein, fals der Ansatz überhaupt so ok ist.


      EDIT:
      fehler im script korrigiert
      Zuletzt geändert von prego; 12.04.2006, 10:45.

      Kommentar


      • #4
        Original geschrieben von prego
        Ich mein, fals der Ansatz überhaupt so ok ist.
        Ich würde mal behaupten, Nein.

        Den Handler für onreadystatechange brauchst du bei einem asynchronen Aufruf, weil da dein Script nach dem senden des Requests einfach mit dem nachfolgenden Code weitermacht.

        Beim Synchronen senden brauchst du aber m.W. keinen Handler, sondern notierst die Verarbeitung der Serverantwort einfach direkt nach dem Aufruf der send()-Methode - dein Script wartet ja in diesem Falle so lange, bis die Antwort da ist.

        Und von dieser Position aus solltest du auch kein Problem haben, eine Rückgabewert hochzureichen.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Klasse wahsaga - ich danke dir. Gedanklich wars ja nur ein kleiner Schritt, aber ich musste erst draufgehoben werden.

          Hier die funktionieren check_email() Funktion:

          PHP-Code:
              function check_email(email){
                  var 
          url '/_xml/xml.check_mail.php?data=' email;
                  
                  if(
          window.XMLHttpRequest) {
                      try {
                          
          req = new XMLHttpRequest();
                      } catch(
          e) {
                          
          req false;
                      }
                  } else if(
          window.ActiveXObject) {
                      try {
                          
          req = new ActiveXObject("Msxml2.XMLHTTP");
                      } catch(
          e) {
                          try {
                              
          req = new ActiveXObject("Microsoft.XMLHTTP");
                          } catch(
          e) {
                              
          req false;
                          }
                      }
                  }
                  
                  
                  if(
          req) {
                      
          req.open("GET"urlfalse); 
                      
          //req.onreadystatechange = reqChange; 
                      
          req.send("");
                    
                    
                      if (
          req.readyState == 4) {
                          if (
          req.status == 200) {
                              if(
          req.responseText == 'true'){
                                  return 
          true;
                              }else{
                                  return 
          false;
                              }
                          } else {
                              
          alert("Problem:\n" +
                              
          req.statusText);
                          }
                      }
                  }
                } 

          Kommentar

          Lädt...
          X