<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[devshare.de - Ajax Manager]]></title>
		<link>http://devshare.de/topic/41132/ajax-manager/</link>
		<description><![CDATA[Die neusten Beiträge in Ajax Manager.]]></description>
		<lastBuildDate>Tue, 15 Nov 2005 07:55:51 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Ajax Manager]]></title>
			<link>http://devshare.de/post/45917/#p45917</link>
			<description><![CDATA[<p>Hey cool, werde ich wohl die woche noch testen.</p>]]></description>
			<author><![CDATA[dummy@example.com (Panzergrenadier)]]></author>
			<pubDate>Tue, 15 Nov 2005 07:55:51 +0000</pubDate>
			<guid>http://devshare.de/post/45917/#p45917</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ajax Manager]]></title>
			<link>http://devshare.de/post/45916/#p45916</link>
			<description><![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>]]></description>
			<author><![CDATA[dummy@example.com (the-one)]]></author>
			<pubDate>Mon, 14 Nov 2005 20:43:16 +0000</pubDate>
			<guid>http://devshare.de/post/45916/#p45916</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ajax Manager]]></title>
			<link>http://devshare.de/post/45822/#p45822</link>
			<description><![CDATA[<p>Hallo,</p><p>ein sehr schöner Beitrag zu Ajax. Vielen Dank dafür! </p><p>vg<br />Hannes</p>]]></description>
			<author><![CDATA[dummy@example.com (j|g)]]></author>
			<pubDate>Tue, 01 Nov 2005 08:51:04 +0000</pubDate>
			<guid>http://devshare.de/post/45822/#p45822</guid>
		</item>
		<item>
			<title><![CDATA[Ajax Manager]]></title>
			<link>http://devshare.de/post/45821/#p45821</link>
			<description><![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>]]></description>
			<author><![CDATA[dummy@example.com (the-one)]]></author>
			<pubDate>Tue, 01 Nov 2005 00:02:55 +0000</pubDate>
			<guid>http://devshare.de/post/45821/#p45821</guid>
		</item>
	</channel>
</rss>

