<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[devshare.de - Ajax Manager]]></title>
	<link rel="self" href="http://www.devshare.de/feed/atom/topic/41132/"/>
	<updated>2005-11-15T07:55:51Z</updated>
	<generator>PunBB</generator>
	<id>http://devshare.de/topic/41132/ajax-manager/</id>
		<entry>
			<title type="html"><![CDATA[Re: Ajax Manager]]></title>
			<link rel="alternate" href="http://devshare.de/post/45917/#p45917"/>
			<content type="html"><![CDATA[<p>Hey cool, werde ich wohl die woche noch testen.</p>]]></content>
			<author>
				<name><![CDATA[Panzergrenadier]]></name>
				<uri>http://devshare.de/user/4464/</uri>
			</author>
			<updated>2005-11-15T07:55:51Z</updated>
			<id>http://devshare.de/post/45917/#p45917</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Ajax Manager]]></title>
			<link rel="alternate" href="http://devshare.de/post/45916/#p45916"/>
			<content type="html"><![CDATA[<p>Ich habe nach dem ausgiebigen Nutzen des Ajax-Managers einige kleine Verbesserungsmöglichkeiten entdeckt, um die ich den Manager erweitert habe. Hier die neueste Version:</p><div class="codebox"><pre><code>//---------------------------------- XML-Requests ------------------------------

//attempt, um doppelte Requests nicht nach doppelten Requests aussehen zu lassen
var attempt          = 0;
//busy-Flag, um anzuzeigen, ob der XML-Prozess beschäftigt ist
var busy             = false;
//Exception-Flag, um nur eine Exception auszugeben
var exceptionOccured = false;
//sollen die Exceptions ausgegeben werden?
var exceptionOutput  = true;
//Array mit noch anstehenden Requests
var requests         = new Array();

//Request-Klasse mit 
function RequestElement()
{
    this.url = &quot;&quot;;
    this.fFunct = null;
    this.textMessage = false;    
}

//neuer Request wird angelegt
function newRequest(url, fFunct, textMessage)
{
    //Request-Element wird angelegt
    var request = new RequestElement();
    
    //mit Variablen belegt
    request.url         = url;
    request.fFunct      = fFunct;
    request.textMessage = textMessage;
    
    //und zurückgeliefert
    return request;
}

//ein Request wird der Liste hinzugefügt
function addRequest (url, fFunct, textMessage)
{
    //der Request wird an die Request-Liste angehängt
    requests.push (newRequest (url, fFunct, textMessage));
    
    //und ausgeführt
    executeRequests();
}

//alle Requests werden nacheinander ausgeführt
function executeRequests()
{
    //falls der Request noch beschäftigt ist
    if (busy)
    {
        //wird die Ausführung in 200 ms noch einmal versucht
        setTimeout (&quot;executeRequests();&quot;, 200);    
        return;
    }

    //das Exception-Flag wird gelöscht
    exceptionOccured = false;
    
    //falls noch Requests vorhanden sind
    if (requests.length &gt; 0)
    {
        //die Variablen werden ermittelt
        var url         = requests[0].url;
        var fFunct      = requests[0].fFunct;
        var textMessage = requests[0].textMessage;
        
        
        //und der Request ausgeführt
        try
        {
            request (url, fFunct, textMessage);
        }
        //falls ein Fehler auftritt
        catch (e)
        {
            //wird die Fehlermeldung ausgegeben
            alert (&quot;Exception (&quot; + url + &quot;):\n&quot; + e);    
        }
        
        //wird executeRequests nochmals ausgeführt
        executeRequests();
    }
    //sonst
    else
    {
        //wird die Funktion beendet
        return;    
    }
}

//ein Request wird gelöscht
function deleteRequest()
{
    //falls der Request bereits inaktiv ist
    if (!busy)
    {
        //wird nicht fortgefahren
        return;    
    }

    //der erste Request wird gelöscht
    requests.shift();    
    //und die Resourcen wieder freigegeben
    busy = false;
}

//Request-Verarbeitung
//fragt nach einer URL und gibt den Text bzw. die XML-Datei an die Folgefunktion weiter
//jede Folgefunktion muss im Format &quot;function folge (XML-Daten, Text)&quot; sein und Bool zurückliefern
function request (url, fFunct, textMessage)
{
    //falls ein anderer Request beschäftigt ist
    if (busy)
    {
        //wird nicht fortgefahren
        return false;    
    }
    
    //der Request wird beansprucht
    busy = true;
    
    //für Mozilla, Opera, usw.
    if (window.XMLHttpRequest) 
    {
        //Request wird angelegt
        http_request = new XMLHttpRequest();
        //Request wird angepasst, falls keine automatische Umformatierung stattfindet
           if (http_request.overrideMimeType) 
           {
            http_request.overrideMimeType(&#039;text/xml&#039;);
           }
    }
    //für IE
    else if (window.ActiveXObject)
    {
        //MSXML1 wird versucht
        try 
        {
            http_request = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);
        }
        //falls eine Ausnahme auftritt
        catch (e) 
        {}
    }
    
    //falls der Request nicht exisitiert
    if (!http_request) 
    {
        
        deleteRequest();
        //eine Exception wird geworfen
        throw &quot;Bad HTTP Request&quot;;
        //die Funktion wird beendet
        return false;
    }
    
    //sobald der Request bearbeitet ist
    http_request.onreadystatechange = function()
    {
        //die Funktion wird versucht
        try
        {
            //falls er vollständig abgearbeitet wurde
            if (http_request.readyState == 4) 
            {
                
                   //falls kein Fehler beim Laden auftrat
                if (http_request.status == 200 || http_request.status == 304) 
                {
                    //Daten werden bestimmt
                    var data = http_request.responseXML;
                    var text = http_request.responseText;
                    
                    //falls es sich nicht um einen Text handelt
                    if (!textMessage)
                    {
                        //falls kein Erfolgs-Tag vorhanden ist
                        if (data.getElementsByTagName (&quot;success&quot;).item (0) == null)
                        {
                            //wird der Request gelöscht
                            deleteRequest();
                            //eine Exception wird geworfen
                            throw &quot;No success Tag defined&quot;;
                            //die Funktion wird beendet
                            return false;    
                        }
                    
                        //die Variable für Erfolg wird geladen            
                        var success = data.getElementsByTagName (&quot;success&quot;).item (0).firstChild.data;
                    }
                    //sonst
                    else
                    {
                        //ist kein XML-Objekt erforderlich
                        success = 1;    
                    }
                    
                    //falls diese 1 ist
                    if (success == 1)
                    {
                        //wird zur angegebenen Funktion verzweigt
                        //falls diese erfolgreich war
                        if (fFunct (data, text))
                        {
                            //war die Ausführung erfolgreich
                            deleteRequest();
                            return true;    
                        }
                        //die Ausführung war nicht erfolgreich
                        deleteRequest();
                        //eine Exception wird geworfen
                        throw &quot;An error occured during execution of fFunction&quot;;
                        //die Funktion wird beendet
                        return false;                
                    }
                    //sonst
                    else
                    {
                        //wird der Request gelöscht 
                        deleteRequest();
                        //eine Exception wird geworfen
                        throw &quot;Success Tag incorrect&quot;;
                        //die Funktion wird beendet
                        return false;
                    }            
                }
                //sonst
                else
                {
                    //der Request gelöscht
                    deleteRequest();
                    //eine Exception wird geworfen
                    throw &quot;HTTP Error No. &quot; + http_request.status + &quot; occured&quot;;
                    //die Funktion wird beendet
                    return false;    
                }
            }
            //sonst
            else
            {
                //die Funktion wird beendet
                return false;    
            }
        }
        //falls ein Fehler auftritt
        catch (e)
        {
            //falls der Fehler eine Exception ist
            if (typeof e == &#039;string&#039;)
            {    
                //falls noch keine Exception aufgetreten ist    
                if (!exceptionOccured)
                {
                    //ist nun eine Exception aufgetreten
                    exceptionOccured = true;
                    //falls die Exception ausgegeben werden soll
                    if (exceptionOutput)
                    {
                        //die Exception wird ausgegeben
                        alert (&quot;Exception (&quot; + url + &quot;):\n&quot; + e);
                    }
                }
            }
        }    

    };
    
    //dem Request wird die URL mitgeteilt
    http_request.open(&#039;GET&#039;, url + &quot;&amp;attempt=&quot; + (attempt + Math.random()), true);
    http_request.setRequestHeader (&quot;Content-Type&quot;, &quot;text/xml&quot;);
    
    //attempt-Zahl wird erhöht
    attempt++;
    
    //der Request wird versandt
    http_request.send (&quot;&quot;);
    
    //die Ausführung war erfolgreich
    return true;
}


//Request-Funktion für reine Actions (tut nichts)
//wird mit &quot;request (url, doNothing)&quot; ausgeführt
function doNothing (data, text)
{
    return true;    
}

//Beispiel-Request-Funktion
//wird mit &quot;request (url, exampleProcess)&quot; ausgeführt
function exampleProcess (data, text)
{
    //der Text wird ausgegeben
    alert (text);
    
    //die Ausführung war erfolgreich
    return true;
}

//---------------------------------- /XML-Requests -----------------------------</code></pre></div><p>Verbesserungen:<br />- falls ein Fehler in der Ausührung des Requests auftrat, wird dieser ausgegeben (falls exceptionOutput auf true gesetzt ist)<br />- der Prozess &quot;doNothing&quot; tut nichts (für ActionURL&#039;s sinnvoll)</p>]]></content>
			<author>
				<name><![CDATA[the-one]]></name>
				<uri>http://devshare.de/user/4573/</uri>
			</author>
			<updated>2005-11-14T20:43:16Z</updated>
			<id>http://devshare.de/post/45916/#p45916</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Ajax Manager]]></title>
			<link rel="alternate" href="http://devshare.de/post/45822/#p45822"/>
			<content type="html"><![CDATA[<p>Hallo,</p><p>ein sehr schöner Beitrag zu Ajax. Vielen Dank dafür! </p><p>vg<br />Hannes</p>]]></content>
			<author>
				<name><![CDATA[j|g]]></name>
				<uri>http://devshare.de/user/4/</uri>
			</author>
			<updated>2005-11-01T08:51:04Z</updated>
			<id>http://devshare.de/post/45822/#p45822</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Ajax Manager]]></title>
			<link rel="alternate" href="http://devshare.de/post/45821/#p45821"/>
			<content type="html"><![CDATA[<p>Hi,</p><p>Für alle, denen eine intensive Einarbeitung in Ajax zu umständlich ist, hab ich einen netten kleinen Manager aus meinem Projekt.</p><div class="codebox"><pre><code>//---------------------------------- XML-Requests ------------------------------

//attempt, um doppelte Requests nicht nach doppelten Requests aussehen zu lassen
var attempt = 0;
//busy-Flag, um anzuzeigen, ob der XML-Prozess beschäftigt ist
var busy    = false;
//Array mit noch anstehenden Requests
var requests = new Array();

//Request-Klasse mit 
function RequestElement()
{
    this.url = &quot;&quot;;
    this.fFunct = null;
    this.textMessage = false;    
}

//neuer Request wird angelegt
function newRequest(url, fFunct, textMessage)
{
    //Request-Element wird angelegt
    var request = new RequestElement();
    
    //mit Variablen belegt
    request.url         = url;
    request.fFunct      = fFunct;
    request.textMessage = textMessage;
    
    //und zurückgeliefert
    return request;
}

//ein Request wird der Liste hinzugefügt
function addRequest (url, fFunct, textMessage)
{
    //der Request wird an die Request-Liste angehängt
    requests.push (newRequest (url, fFunct, textMessage));
    
    //und ausgeführt
    executeRequests();
}

//alle Requests werden nacheinander ausgeführt
function executeRequests()
{
    //falls der Request noch beschäftigt ist
    if (busy)
    {
        //wird die Ausführung in 200 ms noch einmal versucht
        setTimeout (&quot;executeRequests();&quot;, 200);    
        return;
    }
    
    //falls noch Requests vorhanden sind
    if (requests.length &gt; 0)
    {
        //die Variablen werden ermittelt
        var url         = requests[0].url;
        var fFunct      = requests[0].fFunct;
        var textMessage = requests[0].textMessage;
        
        //und der Request ausgeführt
        request (url, fFunct, textMessage);
        
        //wird executeRequests nochmals ausgeführt
        executeRequests();
    }
    //sonst
    else
    {
        //wird die Funktion beendet
        return;    
    }
}

//ein Request wird gelöscht
function deleteRequest()
{
    //falls der Request bereits inaktiv ist
    if (!busy)
    {
        //wird nicht fortgefahren
        return;    
    }
    
    //der erste Request wird gelöscht
    requests.shift();    
    //und die Resourcen wieder freigegeben
    busy = false;
}

//Request-Verarbeitung
//fragt nach einer URL und gibt den Text bzw. die XML-Datei an die Folgefunktion weiter
//jede Folgefunktion muss im Format &quot;function folge (XML-Daten, Text)&quot; sein und Bool zurückliefern
function request (url, fFunct, textMessage)
{
    //falls ein anderer Request beschäftigt ist
    if (busy)
    {
        //wird nicht fortgefahren
        return false;    
    }
    
    //der Request wird beansprucht
    busy = true;
    
    //für Mozilla, Opera, usw.
    if (window.XMLHttpRequest) 
    {
        //Request wird angelegt
        http_request = new XMLHttpRequest();
        //Request wird angepasst, falls keine automatische Umformatierung stattfindet
           if (http_request.overrideMimeType) 
           {
            http_request.overrideMimeType(&#039;text/xml&#039;);
           }
    }
    //für IE
    else if (window.ActiveXObject)
    {
        //MSXML2 wird versucht
        try 
        {
            http_request = new ActiveXObject(&quot;Msxml2.FreeThreadedDOMDocument.5.0&quot;);
        }
        //falls eine Ausnahme auftritt
        catch (e) 
        {
            //MSXML1 wird versucht
            try 
            {
                http_request = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);
            }
            catch (e) {}
        }
        
    }
    
    //falls der Request nicht exisitiert
    if (!http_request) 
    {
        //wird die Funktion beendet
        deleteRequest();
        return false;
    }
    
    //sobald der Request bearbeitet ist
    http_request.onreadystatechange = function()
    {
        //falls er vollständig abgearbeitet wurde
        if (http_request.readyState == 4) 
        {
               //falls kein Fehler beim Laden auftrat
            if (http_request.status == 200 || http_request.status == 304) 
            {
                //Daten werden bestimmt
                var data = http_request.responseXML;
                var text = http_request.responseText;
                
                //falls es sich nicht um einen Text handelt
                if (!textMessage)
                {
                    //falls kein Erfolgs-Tag vorhanden ist
                    if (data.getElementsByTagName (&quot;success&quot;).item (0) == null)
                    {
                        //wird die Funktion beendet
                        deleteRequest();
                        return false;    
                    }
                
                    //die Variable für Erfolg wird geladen            
                    var success = data.getElementsByTagName (&quot;success&quot;).item (0).firstChild.data;
                }
                //sonst
                else
                {
                    //ist kein XML-Objekt erforderlich
                    success = 1;    
                }
                
                //falls diese 1 ist
                if (success == 1)
                {
                    //wird zur angegebenen Funktion verzweigt
                    //falls diese erfolgreich war
                    if (fFunct (data, text))
                    {
                        //war die Ausführung erfolgreich
                        deleteRequest();
                        return true;    
                    }
                    //die Ausführung war nicht erfolgreich
                    deleteRequest();
                    return false;                
                }
                //sonst
                else
                {

                    //wird die Funktion beendet 
                    deleteRequest();
                    return false;
                }            
            }
            //sonst
            else
            {
                //wird die Funktion beendet
                deleteRequest();
                return false;    
            }
        }
        //sonst
        else
        {
            //wird die Funktion beendet
            return false;    
        }
    };
    
    //dem Request wird die URL mitgeteilt
    http_request.open(&#039;GET&#039;, url + &quot;&amp;attempt=&quot; + (attempt + Math.random()), true);
    http_request.setRequestHeader (&quot;Content-Type&quot;, &quot;text/xml&quot;);
    
    //attempt-Zahl wird erhöht
    attempt++;
    
    //der Request wird versandt
    http_request.send (&quot;&quot;);
    
    //die Ausführung war erfolgreich
    return true;
}

//Beispiel-Request-Funktion
//wird mit &quot;request (url, exampleProcess)&quot; ausgeführt
function exampleProcess (data, text)
{
    //der Text wird ausgegeben
    alert (text);
    
    //die Ausführung war erfolgreich
    return true;
}

//---------------------------------- /XML-Requests -----------------------------</code></pre></div><p>Alles, was ihr hier tun müsst, ist, einen Request zu stellen. Das geschieht folgendermaßen</p><div class="codebox"><pre><code>  addRequest (url, functionPointer, textMessage)</code></pre></div><p>url ist die Url, die ihr anfordern wollt (WICHTIG: bitte immer ein &quot;?&quot; hinten anhängen!!!), functionPointer ist der FP für die Funktion, an die ihr die Daten übergeben wollt und textMessage ist eine bool-Variable, die festlegt, ob ihr nur Text oder auch das XML-Objekt braucht (false steht für XML-Objekt, true für alleinige Text-Message).</p><p>Die Folgefunktion sollte in der Form &quot;function funct (data, text) {...}&quot; angeben sein und mit einem bool-Wert zurückgeben, ob sie korrekt beendet wurde oder nicht.</p><p>Noch einige Sachen, die für die&nbsp; XML-Datei wichtig sind:</p><p>- falls XML erwünscht ist, muss ein Feld &lt;success&gt;1&lt;/success&gt; in der Datei stehen<br />- um im IE richtig zu funktionieren, muss bei PHP-Files der Header mit &quot;header (&quot;Content-type: text/xml&quot;);&quot; gesetzt werden<br />- die Datei muss wohlgeformt sein, um akzeptiert zu werden<br />- browserabhängige Fehler treten nicht auf (z.B. wie beim IE ohne attempt-Variable)</p><br /><p>Leistungsmerkmale der addRequest-Funktion:<br />- mehrere Requests können gestellt werden, ohne dass Ajax durcheinander kommt<br />- einfachste Handhabung, kein Gedanke muss mehr an Ajax verschwendet werden<br />- relativ einfacher Aufbau der Response Files möglich (auch Texte sind möglich)</p><br /><p>Ich hoffe, ich kann einigen damit die Schikanen ersparen, die ich anfangs mit Ajax hatte.</p>]]></content>
			<author>
				<name><![CDATA[the-one]]></name>
				<uri>http://devshare.de/user/4573/</uri>
			</author>
			<updated>2005-11-01T00:02:55Z</updated>
			<id>http://devshare.de/post/45821/#p45821</id>
		</entry>
</feed>

