<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>RE-Design - Enrico Reinsdorf &#187; Beispiel</title>
	<atom:link href="http://www.re-design.de/tag/beispiel/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.re-design.de</link>
	<description>Trainer für Konzeption und Umsetzung von medialen Internet-Projekten</description>
	<lastBuildDate>Fri, 02 Jul 2010 09:11:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>AJAX-Klasse, einfach gebaut</title>
		<link>http://www.re-design.de/2007/12/15/ajax-klasse-einfach-gebaut/</link>
		<comments>http://www.re-design.de/2007/12/15/ajax-klasse-einfach-gebaut/#comments</comments>
		<pubDate>Fri, 14 Dec 2007 23:00:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Adventskalender 2007]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Beispiel]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Klasse]]></category>

		<guid isPermaLink="false">http://www.re-design.de/workbook/?p=32</guid>
		<description><![CDATA[Bei der Erstellung von moderen Websites spielt AJAX eine immer wichtigere Rolle. In diesem Tutorial möchte ich euch eine kleine JavaScript-Klasse vorstellen. Diese Klasse kann dann Grundlage für weiter tolle Webanwendungen sein kann. Die einfache und trotzdem flexible Verwendung der erstellten Klasse lag mir dabei besonders am Herzen. Verwendung der AJAX-Klasse Eingebunden und verwendet wird [...]]]></description>
			<content:encoded><![CDATA[<p>Bei der Erstellung von moderen Websites spielt AJAX eine immer wichtigere Rolle. In diesem Tutorial möchte ich euch eine kleine JavaScript-Klasse vorstellen. Diese Klasse kann dann Grundlage für weiter tolle Webanwendungen sein kann.</p>
<p>Die einfache und trotzdem flexible Verwendung der erstellten Klasse lag mir dabei besonders am Herzen.<br />
<span id="more-32"></span></p>
<h3>Verwendung der AJAX-Klasse</h3>
<p>Eingebunden und verwendet wird die Klasse über folgende Befehle:</p>
<ol class="Sourcecode">
<li><code>&lt;script type="text/javascript" src="ajax.js"&gt;&lt;/script&gt; </code></li>
<li><code>&lt;script type="text/javascript"&gt; </code></li>
<li><code>//&lt;![CDATA[ </code></li>
<li><code>function afterLoad(xml) </code></li>
<li><code>{ </code></li>
<li><code>    alert(xml.toString()); </code></li>
<li><code>} </code></li>
<li><code>ajax.callback = function() </code></li>
<li><code>{ </code></li>
<li><code>    afterLoad(this.responseXML); </code></li>
<li><code>} </code></li>
<li><code>  </code></li>
<li><code>ajax.init(); </code></li>
<li><code>ajax.load('getXML.php'); </code></li>
<li><code>  </code></li>
<li><code>//]]&gt; </code></li>
<li><code>&lt;/script&gt;</code></li>
</ol>
<p>Wie ihr seht ist diese Verarbeitung sehr einfach einzusetzen. Als erstes muss natürlich die Klasse in das HTML-Dokument eingebunden werden. Dann legt man fest was passieren soll, wie die Daten verarbeiter werden sollen. Zusätzlich sollte man in der eigentlichen Klasse definieren das diese Funktion auch aufgerufen wird, sonst passiert gar nichts. Dazu habe ich einen sogenannten Hock vordefiniert, der dann einfach mit Funktionalität gefüllt wird. Zum Schluß initialisiert man nur nach die Klasse, um das XMLHttpRequest-Objekt anzulegen und läd dann die entsprechende Datei von Server. Fertig ist ist ein flexibles Ladesystem per JavaScript.</p>
<h3>Detail zur AJAX-Klasse</h3>
<p>Natürlich möchte ich euch auch noch den Inhalt meiner Klasse kurz präsentieren, denn ich denke dadurch wird der Ausbau ud die Erweiterung relativ einfach.</p>
<ol class="Sourcecode">
<li><code>var ajax = { </code></li>
<li><code>    req             : null, </code></li>
<li><code>    url             : null, </code></li>
<li><code>    method          : 'GET', </code></li>
<li><code>    async           : false, </code></li>
<li><code>    responseXML     : null, </code></li>
<li><code>    responseText    : null, </code></li>
<li><code>    init : function() </code></li>
<li><code>        { </code></li>
<li><code>            try </code></li>
<li><code>            { </code></li>
<li><code>                this.req = new XMLHttpRequest(); </code></li>
<li><code>            } </code></li>
<li><code>            catch(e) </code></li>
<li><code>            { </code></li>
<li><code>                try </code></li>
<li><code>                { </code></li>
<li><code>                    this.req = new ActiveXObject('Microsoft.XMLHTTP'); </code></li>
<li><code>                } </code></li>
<li><code>                catch(e) </code></li>
<li><code>                { </code></li>
<li><code>                    this.req = null; </code></li>
<li><code>                } </code></li>
<li><code>            } </code></li>
<li><code>            if(this.req != null) </code></li>
<li><code>            { </code></li>
<li><code>                this.req.onreadystatechange = this.response; </code></li>
<li><code>            } </code></li>
<li><code>        }, </code></li>
<li><code>    load : function(u,m,a) </code></li>
<li><code>        { </code></li>
<li><code>            this.url = u; </code></li>
<li><code>            this.method = m || this.method; </code></li>
<li><code>            this.async = a || this.async; </code></li>
<li><code>            if(this.req != null) </code></li>
<li><code>            { </code></li>
<li><code>                this.req.open(this.method,this.url,this.async); </code></li>
<li><code>                this.req.send(); </code></li>
<li><code>            } </code></li>
<li><code>        }, </code></li>
<li><code>    response : function() </code></li>
<li><code>        { </code></li>
<li><code>            var a = ajax.req; </code></li>
<li><code>            if(a.readyState == 4) </code></li>
<li><code>            { </code></li>
<li><code>                if(a.status==0 || a.status==200 || a.statusText=='OK') </code></li>
<li><code>                { </code></li>
<li><code>                    ajax.responseXML = a.responseXML; </code></li>
<li><code>                    ajax.responseText = a.responseText; </code></li>
<li><code>                    ajax.callback(); </code></li>
<li><code>                } </code></li>
<li><code>            } </code></li>
<li><code>        }, </code></li>
<li><code>    callback : function(){} </code></li>
<li><code>};</code></li>
</ol>
<p>Ich habe mich bei der Erstellung der Klasse für Literal-Objekt entschieden, da ich die Verwendbarkeit dadurch als sehr einfach empfinde und das Instanzieren des Objektes entfällt.</p>
<h4>Eigenschaften der Klasse</h4>
<ul>
<li><strong>req</strong><br />
Hier wird später das XMLHttpRequest-Objekt abgespeichert, welches ja für den Verbindungsaufbau zu Datenquellen nötig ist.</li>
<li><strong>url</strong><br />
Um später die URL auch in einem regelmäßigen Verfahren immer wieder abzurufen, wird sie in dieser Eigenschaft abgespeichert.</li>
<li><strong>method</strong><br />
Auch wird für weitere Verwendung die Übertragungsmethode als Eigenschaft festgehalten. Mögliche sinnvolle Werte sind in diesem Fall HEAD, PUT und GET, wobei letzteres der Defaultwert ist.</li>
<li><strong>async</strong><br />
Um eine synchrone Übertragen der Daten ein zustellen, setzt man diese Eigenschaft auf true.</li>
<li><strong>responseXML</strong> und <strong>responseText</strong><br />
In diesen beiden Eigenschaften wird nach erfolgreicher Übertragung der Daten die Ergebnis gespeichert. Einmal als normale Zeichenkette und einmal als ein XML-Objekt.</li>
</ul>
<h4>Methoden der Klasse</h4>
<ul>
<li><strong>init()</strong><br />
Diese Methode sollte immer vor allen anderen Methodenaufrufen benutzt werden, da sie das XMLHttpREquest instanziert und gleichzeitig wird festgelegt, dass die response()-Methode beim Statuswechsel aufgerufen werden soll.</li>
<li><strong>load(u,m,a)</strong><br />
Durch die 3 übergebenen Parameter wird als erstes die URL der Datenquelle, die Übertragungsmethode und synchrone oder asynchrone Art festgelegen. Dann wird die Datenquelle geladen.</li>
<li><strong>response()</strong><br />
In dieser Methode wird der Status der Übertragung und der Status des Übertragenen überprüft. Im Erfolgsfall werden die übertragenen Daten in die entsprechenen Eigenschaften übertragen und die callback()-Methode aufgerufen.</li>
<li><strong>callback()</strong><br />
Dieser Hock dient zur flexiblen Benutzung der Klassen. Mit dem Überschreiben der leeren Funktion bestimmt man extern was mit dem Daten nach dem Laden geschehen soll.</li>
</ul>
<h4>Download der Dateien</h4>
<ul>
<li><a href="http://www.er-design.de/Downloads/AJAX-Klasse/ajax.js">AJAX-Klasse</a></li>
<li><a href="http://www.er-design.de/Downloads/AJAX-Klasse/ajax.html">HTML-Datei </a></li>
<li><a href="http://www.er-design.de/Downloads/AJAX-Klasse/ajax-klasse.zip">Kompletes Beispiel als ZIP-Datei</a></li>
</ul>
<h3  class="related_post_title">Ähnliche Beiträge</h3><ul class="related_post"><li><a href="http://www.re-design.de/2007/12/12/dynamische-linkliste-bringt-mehr-usability/" title="dynamische Linkliste bringt mehr Usability">dynamische Linkliste bringt mehr Usability</a></li><li><a href="http://www.re-design.de/2007/12/23/ajax-abressbuch-tutorial-teil-3/" title="AJAX Abressbuch &#8211; Tutorial Teil 3">AJAX Abressbuch &#8211; Tutorial Teil 3</a></li><li><a href="http://www.re-design.de/2007/12/22/ajax-adressbuch-tutorial-teil-2/" title="AJAX Adressbuch &#8211; Tutorial Teil 2">AJAX Adressbuch &#8211; Tutorial Teil 2</a></li><li><a href="http://www.re-design.de/2008/12/13/ajax-php-schulung-in-stuttgart/" title="AJAX &ndash; PHP Schulung in Stuttgart">AJAX &ndash; PHP Schulung in Stuttgart</a></li><li><a href="http://www.re-design.de/2008/01/29/ajax-adressbuch/" title="AJAX Adressbuch">AJAX Adressbuch</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.re-design.de/2007/12/15/ajax-klasse-einfach-gebaut/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>dynamische Linkliste bringt mehr Usability</title>
		<link>http://www.re-design.de/2007/12/12/dynamische-linkliste-bringt-mehr-usability/</link>
		<comments>http://www.re-design.de/2007/12/12/dynamische-linkliste-bringt-mehr-usability/#comments</comments>
		<pubDate>Tue, 11 Dec 2007 23:00:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Adventskalender 2007]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Beispiel]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Link-Generator]]></category>

		<guid isPermaLink="false">http://www.re-design.de/workbook/?p=61</guid>
		<description><![CDATA[Heute möchte ich euch ein kleines JavaScript geben, welches aus einem vorgegebenen &#60;div&#62;-Container alles Links extrahiert und sie als Linkliste am Ende des Containers anhängt. Hier gibt es das Demo. Warum macht es Sinn eine solche Linkliste zu erstellen? Nun fast jeder der sich mit benutzerfreundlichen Websites auseinandersetzt weiß, dass Links innerhalb von Fließtext den [...]]]></description>
			<content:encoded><![CDATA[<p>Heute möchte ich euch ein kleines JavaScript geben, welches aus einem vorgegebenen <code>&lt;div&gt;</code>-Container alles Links extrahiert und sie als Linkliste am Ende des Containers anhängt. Hier gibt es das <a href="http://re-design.de/Demo/Linklist/linklist.html" title="weiter zur Demonstration" rel="demo">Demo</a>.</p>
<p>Warum macht es Sinn eine solche Linkliste zu erstellen? Nun fast jeder der sich mit benutzerfreundlichen Websites auseinandersetzt weiß, dass Links innerhalb von Fließtext den Lesefluss stören. Außerdem kann es möglich sein Leser zu verlieren, wenn sie den Links innerhalb des Textes folgen und nicht wieder zurück kommen. Es ist besser erst am Ende des Textes alle im Text empfohlenen Links aufzulisten.</p>
<p><span id="more-61"></span></p>
<p>Leider kann es sehr mühselig sein, die Passagen im Text mit Fußnoten zu kennzeichnen und dann im unteren Bereich eine Linkliste mit Ankerpunkten zu erstellen. Sowas kann wunderbar JavaScript mit einem Automatismus übernehmen.</p>
<h3>Einbindung des Link-Generators</h3>
<p>Ich habe mir überlegt, dass die Einbindung möglichst einfach sein sollte. Deshalb habe ich ein externes Script geschrieben, welches eine Variable mit einem Literal erzeugt. Dieses Script muss nur in die eigene Website eingebunden werden und ein Event festgelegt werden, wann die Abarbeitung beginnen soll.</p>
<ol class="Sourcecode">
<li><code>&lt;script src="RED_LinkGenerator.js" type="text/javascript"&gt;&lt;/script&gt;</code></li>
<li><code>&lt;script type="text/javascript"&gt;</code></li>
<li><code>//&lt;![CDATA[</code></li>
<li><code>window.onload = function()</code></li>
<li><code>{</code></li>
<li><code>var content = document.getElementById('content');</code></li>
<li><code>RED_LinkGenerator.init(content);</code></li>
<li><code>RED_LinkGenerator.writeList();</code></li>
<li><code>}</code></li>
<li><code>//]]&gt;</code></li>
<li><code>&lt;/script&gt;</code></li>
</ol>
<p>Als Übergabeparameter für die Initialisierung wird der Container gewählt in dem die Links enthalten sind. Hier z.B. der <code>&lt;div&gt;</code>-Container mit der ID <dfn>content</dfn>. Als nächstes muss nur noch die <code>writeList()</code>-Methode ausgeführt werden und das Script erzeugt am Ende des übergebenen Containers eine sortierte Liste.</p>
<p>Ich habe extra diesen Vorgang in 2 Schritte unterteilt, um flexibel zu bleiben, denn ich kann mir vorstellen später eine Methode zu schreiben, die in einen komplett anderen Container die Liste schreibt oder auch einfach nur den Array zurückgibt.</p>
<h3>Der Link-Generator selbst</h3>
<p>Ich werde jetzt hier nicht jeden einzelnen Schritt erklären. Ich versuche mich auf die wichtigsten Punkte zu beschränken.</p>
<h4>Die Initialisierung</h4>
<p>Hier wird einfach nur der übergebene Container abgespeichert.</p>
<ol class="Sourcecode">
<li><code>init: function(content)</code></li>
<li><code>{</code></li>
<li><code>this.container = content;</code></li>
<li><code>},</code></li>
</ol>
<h4>Die Methode <code>writeList()</code></h4>
<ol class="Sourcecode">
<li><code>writeList: function()</code></li>
<li><code>{</code></li>
<li><code>var nodes = this.container.getElementsByTagName('A');</code></li>
<li><code>var ol = document.createElement('OL');</code></li>
<li></li>
<li><code>for(var n=nodes.length-1, f=nodes.length; n&gt;=0; n--, f--)</code></li>
<li><code>{</code></li>
<li><code>var parent = nodes[n].parentNode;</code></li>
<li></li>
<li><code>var a = document.createElement('A');</code></li>
<li><code>a.setAttribute('href', '#a_'+n);</code></li>
<li><code>a.appendChild(document.createTextNode('['+f+']'));</code></li>
<li></li>
<li><code>var foot = document.createElement('SUB');</code></li>
<li><code>foot.appendChild(a);</code></li>
<li></li>
<li><code>var span = document.createElement('SPAN');</code></li>
<li><code>span.appendChild(document.createTextNode(nodes[n].firstChild.nodeValue));</code></li>
<li><code>span.appendChild(foot);</code></li>
<li></li>
<li><code>var li = document.createElement('LI');</code></li>
<li><code>var a = document.createElement('A');</code></li>
<li><code>a.appendChild(document.createTextNode(nodes[n].firstChild.nodeValue));</code></li>
<li><code>a.setAttribute('href', nodes[n].href);</code></li>
<li><code>a.setAttribute('id', 'a_'+n);</code></li>
<li><code>li.appendChild(a);</code></li>
<li></li>
<li><code>this.list.push(li);</code></li>
<li></li>
<li><code>parent.insertBefore(span, nodes[n]);</code></li>
<li><code>parent.removeChild(nodes[n+1]);</code></li>
<li><code>}</code></li>
<li><code>for(var n=this.list.length-1; n&gt;=0;n--)</code></li>
<li><code>{</code></li>
<li><code>ol.appendChild(this.list[n]);</code></li>
<li><code>}</code></li>
<li><code>this.container.appendChild(ol);</code></li>
<li><code>}</code></li>
</ol>
<p>In Zeile 15 werden aus dem Text alle Link gesucht und in Zeile 16 schon mal ein <abbr title="Hypertext Markup Language">HTML</abbr>-Knoten für die sortierte Liste angelegt.</p>
<p>Danach wird über eine <code>for</code>-Schleife alle Link-Knoten von hinten nach vorne verarbeitet, die Erklärung folgt später. Dabei wird als Erstes ein Verweis auf den Eltern-Knoten gespeichert und dann ein Link als Fußnote generiert (Zeile 22 &#8211; 27).</p>
<p>Diese Fußnote wird zusammen mit dem Linktext in einen neuen <code>&lt;span&gt;</code>-Tag gestellt (Zeile 29 &#8211; 31).</p>
<p>Danach wird der Listeneintrag mit einer Kopie des Orginallinks erzeugt (Zeile 33 &#8211; 39). Dieser Listeneintrag wird erstmal in einem Array zwischengespeichert.</p>
<p>Anschließend wird der Span-Knoten vor dem eigentlichen Link eingesetzt (Zeile 42) und der Link gelöscht (Zeile 43). Dabei muss aber darauf geachtet werden, dass in der Variablen <var>nodes</var> ein Verweis auf alle Links innerhalb des Container ist und wenn wie hier ein neuer Link, die Fußnote, hinzukommt auch die Anzahl der Links innerhalb des Textes steigt. Deshalb muss beim Löschen <code>n+1</code> gerechnet werden. Durch diese dynamische Änderung der Menge der Links im Array hat mich auch veranlasst von hinten nach vorne zu arbeiten, denn dadurch wird der Löschvorgang vereinfacht.</p>
<p>Zum Schluss muss nur noch die geordnete Liste erzeugt werden. Da aber die Links im Array in der verkehrten Reihenfolge stehen, habe ich wieder von hinten nach vorne gearbeitet, um die richtige Reihenfolge zu bekommen (Zeile 45 &#8211; 48).</p>
<h4>Fazit</h4>
<p>Ich hoffe ich konnte mit diesem kleine Beispiel zeige, wie JavaScript das Arbeiten im Web erleichtern kann. Keine Ahnung ob das schon ein Ansatz von Web 2.0 ist, aber ich finde der Automatismus kann sich schon sehen lassen.</p>
<ul>
<li><a href="http://www.re-design.de/workbook/wp-content/uploads/2007/12/linklist.html" title="HTML-Datei">HTML-Datei</a></li>
<li><a href="http://www.re-design.de/workbook/wp-content/uploads/2007/12/red_linkgenerator.js" title="JavaScript-Datei">JavaScript-Datei</a></li>
<li><a href="http://www.re-design.de/workbook/wp-content/uploads/2007/12/linklist.zip" title="komplettes Set">komplettes Set</a></li>
</ul>
<h3  class="related_post_title">Ähnliche Beiträge</h3><ul class="related_post"><li><a href="http://www.re-design.de/2007/12/15/ajax-klasse-einfach-gebaut/" title="AJAX-Klasse, einfach gebaut">AJAX-Klasse, einfach gebaut</a></li><li><a href="http://www.re-design.de/2007/12/23/ajax-abressbuch-tutorial-teil-3/" title="AJAX Abressbuch &#8211; Tutorial Teil 3">AJAX Abressbuch &#8211; Tutorial Teil 3</a></li><li><a href="http://www.re-design.de/2007/12/22/ajax-adressbuch-tutorial-teil-2/" title="AJAX Adressbuch &#8211; Tutorial Teil 2">AJAX Adressbuch &#8211; Tutorial Teil 2</a></li><li><a href="http://www.re-design.de/2007/12/19/slideshow-mit-einer-html-seite-teil-2/" title="Slideshow mit einer HTML-Seite Teil 2">Slideshow mit einer HTML-Seite Teil 2</a></li><li><a href="http://www.re-design.de/2007/12/18/slideshow-mit-einer-html-seite-teil-1/" title="Slideshow mit einer HTML-Seite Teil 1">Slideshow mit einer HTML-Seite Teil 1</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.re-design.de/2007/12/12/dynamische-linkliste-bringt-mehr-usability/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
