Kuno: wahr bei erfolg ajax

Hab hie rsone standardfunktion für ajax-sachen runtergeladen:

  
function AjaxRequest(script, id) {  
  
 var req = null;  
 try{  
  req = new XMLHttpRequest();  
 } catch (ms){  
  try{  
   req = new ActiveXObject("Msxml2.XMLHTTP");  
  } catch (nonms){  
   try{  
    req = new ActiveXObject("Microsoft.XMLHTTP");  
   } catch (failed){  
    req = null;  
   }  
  }  
 }  
  
 if (req == null)  
  alert("Error creating request object!");  
  req.open("GET", script, true);  
  
  req.onreadystatechange = function(){  
   switch(req.readyState) {  
    case 4:  
    if(req.status!=200) {  
     alert("Fehler:"+req.status);  
    }else{  
     document.getElementById(id).innerHTML = req.responseText;  
    }  
    break;  
  
    default:  
    return false;  
    break;  
   }  
  };  
  
  req.setRequestHeader("Content-Type",  
                                      "application/x-www-form-urlencoded");  
  req.send(null);  
}  

Jetzt hätte ich es aber gern, da diese funktion nur von anderen funktionen verwendet wird, aber nie direkt vom html-dokument aus,
dass AjaxRequest wahr zurückliefern, falls der Request erfolgreich war .
Hab schon an sämtlichen Stellen versucht.

  1. Hello,

    Hab schon an sämtlichen Stellen versucht.

    ich glaube da hast du ein zentrales Logikproblem. Das A in AJAX steht für asynchronous, d.h. während der Request läuft geht für den Rest des Skripts das Leben weiter. Wenn du einen Brief mit einer Anfrage zur Post bringst kannst bleibst du auch nicht am Briefkasten stehen bis die Antwort kommt, sondern du gehst nebenbei wieder arbeiten und stellst irgendwann fest "hoppla, da hat mir einer zurückgeschrieben". Genau so arbeitet AJAX, du schickst den Request los und teilst ihm mit, was er bei einer Veränderung des readystate machen soll. Wenn die eigentliche AjaxRequest-Funktion fertig ist, gibt es noch keine Möglichkeit zu entscheiden ob der Request gelungen ist oder nicht, du kannst lediglich feststellen, ob das Request-Objekt fehlerfrei erzeugt werden konnte.

    MfG
    Rouven

    --
    -------------------
    Inter Arma Enim Silent Leges  --  Cicero
    1. Aber das heisst ja, dass Objektorientierung bei Ajax garnicht möglich ist.
      Dann wäre ja eine Funktion wie die Folgende garnicht möglich:

        
      function AddBookmark () {  
         document.getElementById('bookmark').style.background = 'url(loading.gif)';  
         my ajax = AjaxRequest('/cgi-bin/add.cgi');  
         if (ajax == 1)  
            document.getElementById('bookmark').style.background = 'url(fertig.gif)';  
      }  
      
      

      Ich muss ja irgendwie wissen, wann ich loading.gif durch fertig.gif ersetzen muss.

      1. Hallo Kuno,

        das ist Dein fünfter oder sechster Thread zum immer noch gleichen Thema, hier
        mal wieder die Ausgangsthematik.

        Ich muss ja irgendwie wissen, wann ich loading.gif durch fertig.gif ersetzen muss.

        Schau doch mal in Deinen Code. Dort solltest Du sehen, wo das Ergebnis Deines
        Requests verarbeitet wird. Ganz genau dort könntest Du Deinen Austausch der
        Grafik vornehmen.

        Freundliche Grüße

        Vinzenz

        1. Nein eben nicht, weil dann hätte AjaxRequest keinen Mehrwert mehr! Darum gehts doch gerade in diesem Thread der nichts mit den anderen zu tun hat.
          Ich will AjaxRequest auch von anderen Funktionen aus nutzen können die dann fälschlicherweise plötzlich "fertig.gif" als Hintergrundbild hätten und das wäre einfach falsch!

          1. Hello,

            Ich will AjaxRequest auch von anderen Funktionen aus nutzen können die dann fälschlicherweise plötzlich "fertig.gif" als Hintergrundbild hätten und das wäre einfach falsch!

            wenn du synchron willst, warum nimmst du eine asynchrone Funktion?? Dann führ den Request halt synchron aus, dann weißt du wann er fertig ist.

            MfG
            Rouven

            --
            -------------------
            Let Bygones Be Bygones  --  Robert Pitscottie: "Chronicles of Scotland"
            1. Was ist eine asyncrone funktion und wie nehme ich eine syncrone?

              1. Hello,

                Was ist eine asyncrone funktion und wie nehme ich eine syncrone?

                was eine asynchrone Funktion ist habe ich dir gerade schon erklärt: sie started aber obwohl das Ergebnis noch nicht vorliegt läuft der umliegende Code weiter:

                Beispiel Synchron (schematisch):
                synchroneNachricht("Hallo");
                alert("Du");

                Würde erst Hallo und dann Du ausgeben

                Beispiel asynchron:
                asynchroneNachricht("Hallo");
                alert("Du");

                KÖNNTE auch Du und Hallo ausgeben, je nachdem wie schnell die asynchrone Funktion zu Ende läuft.

                Zunächst mal stimme ich Vinzenz zu, sowohl was dein Doppelpostingverhalten angeht als auch in Bezug auf den logischen Ansatz: füge doch den Bildaustausch einfach an der Stelle ein, wo das Ergebnis verarbeitet wird. Das ändert doch absolut nichts daran, dass die Funktion mehrfach verwendbar ist und es im Bedarfsfall nur einer einzigen Änderung bedarf.
                Wenn du das nicht willst wird es etwas komplizierter, weil es AFAIK kein direktes synchrones Pendant zu dem HTTPRequest gibt. Man müsste sich nach einer Herangehensweise über das ganze Fenster oder ein Unterfenster etwas konstruieren, wobei es auch da schwer ist Synchronität zu sichern. Nur nochmal, die Stärke von AJAX ist eben gerade der explizit gewünschte asynchrone Ablauf im Hintergrund, daher meine Verwunderung.

                MfG
                Rouven

                --
                -------------------
                Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
                1. Hallo,

                  Wenn du das nicht willst wird es etwas komplizierter, weil es AFAIK kein direktes synchrones Pendant zu dem HTTPRequest gibt. Man müsste sich nach einer Herangehensweise über das ganze Fenster oder ein Unterfenster etwas konstruieren, wobei es auch da schwer ist Synchronität zu sichern.

                  Na, warum denn so kompliziert? Es reicht doch völlig einen Parameter zu ändern:
                  [script lang=js]
                  function AjaxRequest(script, id) {

                  var req = null;
                   try{
                    req = new XMLHttpRequest();
                   } catch (ms){
                    try{
                     req = new ActiveXObject("Msxml2.XMLHTTP");
                    } catch (nonms){
                     try{
                      req = new ActiveXObject("Microsoft.XMLHTTP");
                     } catch (failed){
                      req = null;
                     }
                    }
                   }

                  if (req == null)
                    alert("Error creating request object!");
                    req.open("GET", script, false);
                                         // ^ siehst du den Unterschied?

                  req.onreadystatechange = function(){
                     switch(req.readyState) {
                      case 4:
                      if(req.status!=200) {
                       alert("Fehler:"+req.status);
                      }else{
                       document.getElementById(id).innerHTML = req.responseText;
                      }
                      break;

                  default:
                      return false;
                      break;
                     }
                    };

                  req.setRequestHeader("Content-Type",
                                                        "application/x-www-form-urlencoded");
                    req.send(null);
                  }
                  [/script]

                  Grüße,
                  Willi

                  1. Hallo,

                    Sorry, hab die Vorschaufunktion nicht genutzt, hier noch einmal gehighlightet ;-)

                    Wenn du das nicht willst wird es etwas komplizierter, weil es AFAIK kein direktes synchrones Pendant zu dem HTTPRequest gibt. Man müsste sich nach einer Herangehensweise über das ganze Fenster oder ein Unterfenster etwas konstruieren, wobei es auch da schwer ist Synchronität zu sichern.

                    Na, warum denn so kompliziert? Es reicht doch völlig einen Parameter zu ändern:

                      
                    function AjaxRequest(script, id) {  
                     var req = null;  
                     try{  
                      req = new XMLHttpRequest();  
                     } catch (ms){  
                      try{  
                       req = new ActiveXObject("Msxml2.XMLHTTP");  
                      } catch (nonms){  
                       try{  
                        req = new ActiveXObject("Microsoft.XMLHTTP");  
                       } catch (failed){  
                        req = null;  
                       }  
                      }  
                     }  
                      
                     if (req == null)  
                      alert("Error creating request object!");  
                      req.open("GET", script, false);  
                    //                       ^ siehst du den Unterschied?  
                      
                      req.onreadystatechange = function(){  
                       switch(req.readyState) {  
                        case 4:  
                        if(req.status!=200) {  
                         alert("Fehler:"+req.status);  
                        }else{  
                         document.getElementById(id).innerHTML = req.responseText;  
                        }  
                        break;  
                      
                        default:  
                        return false;  
                        break;  
                       }  
                      };  
                      
                      req.setRequestHeader("Content-Type",  
                                                          "application/x-www-form-urlencoded");  
                      req.send(null);  
                    }  
                    
                    

                    Grüße,
                    Willi

                    1. Hello,

                      Na, warum denn so kompliziert? Es reicht doch völlig einen Parameter zu ändern:

                      interessanter Punkt, den Parameter kannte ich noch nicht, macht aber natürlich  Sinn den gerade noch beizusteuern.
                      Wobei wir damit bei SJAX wären...

                      MfG
                      Rouven

                      1. Hallo,

                        interessanter Punkt, den Parameter kannte ich noch nicht, macht aber natürlich  Sinn den gerade noch beizusteuern.
                        Wobei wir damit bei SJAX wären...

                        Wobei meistens auch kein XML ausgeliefert wird, dann bleibt nur noch SJ oder AJ - oder kurz: J übrig …

                        Grüße,
                        Willi

          2. Hallo Kuno,

            Nein eben nicht, weil dann hätte AjaxRequest keinen Mehrwert mehr!

            *g* wieviel Steuer zahlst Du auf diese Funktion?

            Darum gehts doch gerade in diesem Thread der nichts mit den anderen zu tun hat.

            Selbstverständlich geht es immer noch um das ein- und selbe Thema. Ein weiteres
            Detail, das Du erst jetzt verrätst. Es ist schade, dass Du das nicht verstehst.

            Ausgangspunkt: https://forum.selfhtml.org/?t=162017&m=1053890.
            Zugriff auf Elemente: https://forum.selfhtml.org/?t=162046&m=1054093
            (dazwischen ein bereits gelöschtes Doppelposting)
            Syntaxfehler: https://forum.selfhtml.org/?t=162053&m=1054148 und https://forum.selfhtml.org/?t=162063&m=1054211.

            und nun bist Du wieder am Ausgangspunkt angelangt ...

            Vor allem kann man in einem hübschen Gesamtthread viel besser auf Deine
            speziellen Anforderungen eingehen, weil man die Rahmenbedingungen kennt.
            Zudem ist die Wahrscheinlichkeit, kompetente Hilfe zu bekommen, gerade in
            einem solchen großen Gesamtthread viel höher als bei vielen kleinen Threads.
            Dem einen oder anderen ist vielleicht auch schon die Lust vergangen, auf
            Deine Fragen zu antworten. Rückmeldungen sind auch nicht gerade Deine Stärke.

            Ich will AjaxRequest auch von anderen Funktionen aus nutzen können die dann fälschlicherweise plötzlich "fertig.gif" als Hintergrundbild hätten und das wäre einfach falsch!

            Sowas könntest Du konfigurierbar machen.

            Freundliche Grüße

            Vinzenz

            1. Verstehe, du meinst ich soll quasi in AjaxRequest ne if anweisung machen die jedesmal feststellt, was gewünscht ist.
              Dann müsste ich einen zusätzlichen Parameter übergeben... so nach dem Muster

              AjaxRequest(url, id, mode)

              oder so.
              verstehe.

              1. Verstehe, du meinst ich soll quasi in AjaxRequest ne if anweisung machen die jedesmal feststellt, was gewünscht ist.

                Was wo gewünscht?
                Du kannst auch die callback Funktionen im Javascript ändern, du kannst auch readyState und oder status abfragen, aber ich glaube das hab ich dir hier schon gesagt.

                oder so.
                verstehe.

                Nett, wäre es wenn du auch das verstehen würdest was dir Vinzenz nett erklärt hat, du machst es den Leuten die dir durchaus helfen wollen extrem schwer.

                Struppi.

  2. echo ($light == true) ? 'Guten Tag,' : 'Guten Abend,';

    also mir ist nur Bedingt klar was du überhaupt damit erreichen willst. Wenn du mal schreiben würdest was der Sinn und Zweck ist, dass die Ajax Funktion wahr zurückliefert, wäre es wahrscheinlich möglich differenziert und hilfreich auf deine Frage zu antworten.

    Der Sinn einer Ajax abfrage ist das sie im Hintergrund läuft. Deshalb ist es wohl auch Unsinn darauf zu warten das diese Funktion etwas zurückliefert.

    Allerdings kann man durchaus wenn die Abfrage fertig ist (=> onreadystatechange) z.B. eine globale Variable wieder auf true setzen um diese dann irgendwo Abzufragen oder eine Funktion aufrufen die irgendwas tut.

    Grüße

    Markus

    --
    Das Böse ist grau ... color:#666;
    1. Hallo Markus,

      also mir ist nur Bedingt klar was du überhaupt damit erreichen willst. Wenn du mal schreiben würdest was der Sinn und Zweck ist, dass die Ajax Funktion wahr zurückliefert, wäre es wahrscheinlich möglich differenziert und hilfreich auf deine Frage zu antworten.

      In diesem Beitrag habe ich die Links zur ganzen Geschichte zusammengetragen ...

      Freundliche Grüße

      Vinzenz