<?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>webthreads.de &#187; Tutorial</title>
	<atom:link href="http://webthreads.de/category/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://webthreads.de</link>
	<description>- Web 2.0, Web-Entwicklung und Netzkultur von Markus Kühle</description>
	<lastBuildDate>Fri, 09 Dec 2011 06:49:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Service EJBs als JMX MBeans f&#252;r JBoss AS erstellen</title>
		<link>http://webthreads.de/2008/01/service-ejbs-als-jmx-mbeans-fuer-jboss-as-erstellen/</link>
		<comments>http://webthreads.de/2008/01/service-ejbs-als-jmx-mbeans-fuer-jboss-as-erstellen/#comments</comments>
		<pubDate>Thu, 31 Jan 2008 09:18:08 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JEE 5]]></category>
		<category><![CDATA[JMX]]></category>
		<category><![CDATA[MBean]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/2008/01/service-ejbs-als-jmx-mbeans-fuer-jboss-as-erstellen/</guid>
		<description><![CDATA[Dieser Artikel wurde auf javathreads.de verschoben: http://javathreads.de/2008/06/eine-ejb-als-jmx-mbean-fuer-jboss-as-erstellen]]></description>
			<content:encoded><![CDATA[<p>Dieser Artikel wurde auf javathreads.de verschoben: <a href="http://javathreads.de/2008/06/eine-ejb-als-jmx-mbean-fuer-jboss-as-erstellen">http://javathreads.de/2008/06/eine-ejb-als-jmx-mbean-fuer-jboss-as-erstellen</a></p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2008/01/service-ejbs-als-jmx-mbeans-fuer-jboss-as-erstellen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google Maps in zwei Schritten in die eigene Seite einbetten</title>
		<link>http://webthreads.de/2007/08/google-maps-in-zwei-schritten-in-die-eigene-seite-einbetten/</link>
		<comments>http://webthreads.de/2007/08/google-maps-in-zwei-schritten-in-die-eigene-seite-einbetten/#comments</comments>
		<pubDate>Thu, 23 Aug 2007 16:03:51 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/2007/08/google-maps-in-zwei-schritten-in-die-eigene-seite-einbetten/</guid>
		<description><![CDATA[Dass man Google Maps auf die eigene Seite einbinden und einiges damit anstellen kann ist mittlerweile schon h&#228;ufig bewiesen worden. Dass es f&#252;r viele Leute, gerade solche die wenige mit Web Entwicklung zu tun haben, schwierig sein kann einen Anfang zu finden kam auch oft zu Tage. Vor gut 1,5 Jahren habe ich selbst angefangen [...]]]></description>
			<content:encoded><![CDATA[<p>Dass man Google Maps auf die eigene Seite einbinden und einiges damit anstellen kann ist mittlerweile schon h&#228;ufig bewiesen worden. Dass es f&#252;r viele Leute, gerade solche die wenige mit Web Entwicklung zu tun haben, schwierig sein kann einen Anfang zu finden kam auch oft zu Tage.</p>
<p>Vor gut 1,5 Jahren habe ich selbst angefangen eine kleine Anwendung zu schreiben welche diesen ersten Schritt vereinfachen sollte, aber das Tool leider nie online gestellt. Dann kam Google selbst und hat einen Google Maps Wizzard ver&#246;ffentlicht, mit dem an sich das Grundger&#252;st generieren lassen konnte. Seit ein paar Tagen allerdings hat Google das Einbetten einer ausgew&#228;hlten Karte noch sehr viel vereinfacht. So ist es jetzt m&#246;glich mit zwei Schritten den Code f&#252;r eine Karte erstellen zu lassen um ihn anschlie&#223;end ganz ohne das bisher notwendige Erstellen eines <a href="http://www.google.com/apis/maps/">Google Maps API Keys</a> auf der eigenen Seite zu verwenden.</p>
<p>1. Schritt: Den gew&#252;nschten Ort/Punkt auf bei Google Maps heraussuchen und &#8220;URL zu dieser Seite&#8221; anklicken:</p>
<div style="text-align:center;"><img style="border: 1px solid black;" src='http://www.webthreads.de/article-data/uploads/2007/08/googlemapseinbetten_1.jpg' alt='Google Maps einbetten - URL zu dieser Seite' /></div>
<p>Diese URL kann dann auch gleich noch ein wenig verfeinert werden. Dazu einfach den Link &#8220;Eingebettete Karte anpassen und Vorschau anzeigen&#8221; anklicken. Es &#246;ffnet sich ein Popup mit Vorschau in dem man noch die Gr&#246;&#223;e einstellen kann:</p>
<div style="text-align:center"><img style="border: 1px solid black;" src='http://www.webthreads.de/article-data/uploads/2007/08/googlemapseinbetten_2.jpg' alt='Google Maps einbetten - Einstellungen' /></div>
<p>2. Schritt den erstellen Source Code in die eigene Seite einbetten. Die besonderheit hier ist, dass man f&#252;r diesen Source Code keinen Google Maps Key mehr erstellen muss. Folgender Source Code wurde bei mir erstellt:</p>
<div class="codebox" style="margin-top: 10px">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">iframe </span><span style="color: #FF0000; ">width</span><span style="color: #0000FF; ">=&quot;500&quot;</span><span style="color: #FF0000; "> height</span><span style="color: #0000FF; ">=&quot;350&quot;</span><span style="color: #FF0000; "> frameborder</span><span style="color: #0000FF; ">=&quot;no&quot;</span><span style="color: #FF0000; "> scrolling</span><span style="color: #0000FF; ">=&quot;no&quot;</span><span style="color: #FF0000; ">
  marginheight</span><span style="color: #0000FF; ">=&quot;0&quot;</span><span style="color: #FF0000; "> marginwidth</span><span style="color: #0000FF; ">=&quot;0&quot;</span><span style="color: #FF0000; ">
  src</span><span style="color: #0000FF; ">=&quot;http://maps.google.com/maps?f=q&amp;hl=de&amp;geocode=&amp;q=mainz,+deutschland&amp;...&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">iframe</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">br</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">a </span><span style="color: #FF0000; ">href</span><span style="color: #0000FF; ">=&quot;http://maps.google.com/maps?f=q&amp;hl=de&amp;geocode=&amp;q=mainz,+deutschland&amp;...&quot;</span><span style="color: #FF0000; ">
  style</span><span style="color: #0000FF; ">=&quot;color:#0000FF;text-align:left;font-size:small&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  Gr&#246;&#223;ere Kartenansicht
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">a</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Und so sieht dann das eingebettete Ergebnis aus:</p>
<div style="text-align:center;"><iframe style="border: 1px solid black" width="500" height="350" frameborder="no" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&#038;hl=de&#038;geocode=&#038;q=mainz,+deutschland&#038;ie=UTF8&#038;om=1&#038;s=AARTsJrKpiotINPyM4RWidAuo2UfaBQv9Q&#038;ll=50.050085,8.301544&#038;spn=0.154318,0.343323&#038;z=11&#038;iwloc=addr&#038;output=embed"></iframe><br/><a href="http://maps.google.com/maps?f=q&#038;hl=de&#038;geocode=&#038;q=mainz,+deutschland&#038;ie=UTF8&#038;om=1&#038;ll=50.050085,8.301544&#038;spn=0.154318,0.343323&#038;z=11&#038;iwloc=addr&#038;source=embed" style="color:#0000FF;text-align:left;font-size:small">Gr&#246;&#223;ere Kartenansicht</a>
</div>
<p>Allerdings sie noch erw&#228;hnt, dass man einiges mehr mit Google Maps und der dazugeh&#246;rigen Google Maps API machen kann. Dazu reicht auch schon ein kleiner Blick in die <a href="http://www.google.com/apis/maps/documentation/">Google Maps API Dokumentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2007/08/google-maps-in-zwei-schritten-in-die-eigene-seite-einbetten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Einf&#252;hrung in Yahoo! Pipes</title>
		<link>http://webthreads.de/2007/08/einfuehrung-in-yahoo-pipes/</link>
		<comments>http://webthreads.de/2007/08/einfuehrung-in-yahoo-pipes/#comments</comments>
		<pubDate>Thu, 16 Aug 2007 09:59:44 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Yahoo]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/2007/08/einfuehrung-in-yahoo-pipes/</guid>
		<description><![CDATA[Yahoo! hat mit seiner Anwendung Yahoo! Pipes schon vor einiger Zeit f&#252;r Aufsehen gesorgt. Bisher bin ich selbst noch nicht dazu gekommen es einmal auszuprobieren aber das haben daf&#252;r schon andere f&#252;r mich gemacht. So ist eine kurze aber gute Einf&#252;hrung in ein Anwendungssbeipiel der Verarbeitung eines RSS Feeds auf Guxx.de zu finden. Er beschreibt [...]]]></description>
			<content:encoded><![CDATA[<p>Yahoo! hat mit seiner Anwendung <a href="http://pipes.yahoo.com/">Yahoo! Pipes</a> schon vor einiger Zeit f&#252;r Aufsehen gesorgt. Bisher bin ich selbst noch nicht dazu gekommen es einmal auszuprobieren aber das haben daf&#252;r schon andere f&#252;r mich gemacht. So ist eine kurze aber gute Einf&#252;hrung in ein Anwendungssbeipiel der Verarbeitung eines RSS Feeds auf <a href="http://guxx.de/2007/08/15/yahoo-pipes-eine-einfuhrung/">Guxx.de</a> zu finden.</p>
<div style="text-align:center"><a href="http://guxx.de/2007/08/15/yahoo-pipes-eine-einfuhrung/" title="Einf&#252;hrung in Yahoo! Pipes"><img src='http://www.webthreads.de/article-data/uploads/2007/08/yahoopipes_filter.png' alt='Yahoo! Pipes Einf&#252;hrung' /></a></div>
<p>Er beschreibt anschaulich wie man mit wenigen ein RSS Feed (in diesem Beispiel nat&#252;rlich sein eigener) mit Yahoo! Pipes bearbeiten, Filtern und in einer anderen Sprache ausgeben lassen kann. Der Screenshot zeigt gerade das Bearbeiten eines Filters an.</p>
<p>Wem das lesen zu schwer f&#228;llt und es lieber vorgetragen bekommen m&#246;chte der kann sich eine andere Yahoo! Pipes Einf&#252;hrung auch bei <a href="http://www.digitalupgrade.de/index.php?id=31#c245">DigitalUpgrade 2.0</a> als Video herunterladen und ansehen. </p>
<div style="text-align:center"><a href="http://www.digitalupgrade.de/index.php?id=31#c245" title="Video Einf&#252;hrung in Yahoo! Pipes"><img src='http://www.webthreads.de/article-data/uploads/2007/08/yahoopipes_digitalupgradvideo.jpg' alt='Yahoo! Pipes DigitalUpgrade Video Tutorial' /></a></div>
<p>Das Thema Yahoo! Pipes wurde in der Geekshow 6 aufgenommen und mit folgendem Satz eingeleitet:</p>
<blockquote><p>Wer schon immer mal ein Rohr verlegen wollte, kann das online sehr einfach tun. Mit &#214;ffnet einen externen Link in einem neuen FensterYahoo Pipes.</p></blockquote>
<p>Wie auch immer &#8211; jetzt steht der gro&#223;en Entwicklung mit Yahoo! Pipes nichts mehr im Wege..</p>
<p>(via <a href="http://www.yigg.de/249190_YahooPipes_eine_Einfuehrung">Yigg</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2007/08/einfuehrung-in-yahoo-pipes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML Tipp: &lt;div style=&#8221;vertical-align:middle&#8221;&gt; geht nicht&#8230; oder doch?</title>
		<link>http://webthreads.de/2007/05/html-tipp-div-stylevertical-alignmiddle-geht-nicht-oder-doch/</link>
		<comments>http://webthreads.de/2007/05/html-tipp-div-stylevertical-alignmiddle-geht-nicht-oder-doch/#comments</comments>
		<pubDate>Wed, 09 May 2007 06:23:26 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/2007/05/html-tipp-div-stylevertical-alignmiddle-geht-nicht-oder-doch/</guid>
		<description><![CDATA[Wie oft sucht man nach &#60;div style=&#8221;vertical-align:middle&#62; und findet immer nur die gleiche Antwort: es funktioniert nicht, funktionierte noch nie und wird wohl so schnell auch nicht funktionieren. Soweit die ern&#252;chternde erste Antwort. Wozu braucht man &#252;berhaupt einen mittigen Schriftzug? Gerade im &#8220;Ajax-Zeitalter&#8221;, wo die animierten Loading Bilder &#252;berall auftauchen m&#246;chte man doch ab und [...]]]></description>
			<content:encoded><![CDATA[<p>Wie oft sucht man nach <span class="code">&lt;div style=&#8221;vertical-align:middle&gt;</span> und findet immer nur die gleiche Antwort: es funktioniert nicht, funktionierte noch nie und wird wohl so schnell auch nicht funktionieren. Soweit die ern&#252;chternde erste Antwort. </p>
<p>Wozu braucht man &#252;berhaupt einen mittigen Schriftzug? Gerade im &#8220;Ajax-Zeitalter&#8221;, wo die animierten Loading Bilder &#252;berall auftauchen m&#246;chte man doch ab und an auch den Text &#8211; &#8220;Loading..&#8221; mittig neben dem Bild haben und beide Elemente (Bild und Text) mittig im darum liegenden Block-Element. Aus diesem Grund wird oft das <span class="code">div</span> Element verwendet um Bild und Text gemeinsam auszurichten. Oft l&#228;uft der erste Versuch dann folgenderma&#223;en ab:</p>
<div style="vertical-align:middle;border:1px solid black"><img src='http://www.webthreads.de/article-data/uploads/2007/05/ajax-loader.gif'/> Loading&#8230;</div>
<div class="codebox" style="margin-top: 10px">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">style</span><span style="color: #0000FF; ">=&quot;vertical-align:middle;&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">img </span><span style="color: #FF0000; ">src</span><span style="color: #0000FF; ">='http://www.webthreads.de/.../ajax-loader.gif'</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "> Loading...
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Diese Herangehensweise funktioniert nicht, weil vertical-align nur auf die H&#246;he einer Zeile reagiert und nicht auf die H&#246;he eines umliegenden Block Elements.</p>
<p>Aber was tun? Selbst habe ich auch oft genug danach gegoogelt, mir L&#246;sungen angeschaut und Erl&#228;uterungen entgegengenommen die mir sagen, dass es nur mit einer Tabelle funktioniert. Hei&#223;t es also wenn ich einen Text mittig neben einem Bild ausrichten m&#246;chte muss ich eine Tabelle nehmen? Das w&#252;rde dann wie folgt aussehen:</p>
<table style="border:1px solid black; height:40px;">
<tr>
<td style="vertical-align:middle; width: 25px;"><img src='http://www.webthreads.de/article-data/uploads/2007/05/ajax-loader.gif'/></td>
<td style="vertical-align:middle">Loading&#8230;</td>
</tr>
</table>
<div class="codebox" style="margin-top: 10px">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">table </span><span style="color: #FF0000; ">style</span><span style="color: #0000FF; ">=&quot;height: 40px;&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">tr</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">td </span><span style="color: #FF0000; ">style</span><span style="color: #0000FF; ">=&quot;vertical-align: middle; width: 25px;&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
      </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">img </span><span style="color: #FF0000; ">src</span><span style="color: #0000FF; ">=&quot;http://www.webthreads.de/.../ajax-loader.gif&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">td</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">td </span><span style="color: #FF0000; ">style</span><span style="color: #0000FF; ">=&quot;vertical-align: middle;&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
      Loading…
    </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">td</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">tr</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">table</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Sieht ja grunds&#228;tztlich im Ergebnis schonmal nicht schlecht aus. Die Frage ist ob man daf&#252;r immer eine Tabelle verwenden soll bzw. muss:</p>
<p>Wenn man dar&#252;ber nachdenkt, dann kann man doch ein Block Element nehmen welches auf die Zeilenh&#246;he reagiert, wie z.b. das <span class="code">&lt;p&gt;</span> Element. D.h. man erstellt ein solches Element, mit einer angegebenen festen Zeilenh&#246;he und sagt, dass es sich mittig ausrichten soll:</p>
<p style="vertical-align:middle;border:1px solid black"><img src='http://www.webthreads.de/article-data/uploads/2007/05/ajax-loader.gif'/> Loading&#8230;</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">p </span><span style="color: #FF0000; ">style</span><span style="color: #0000FF; ">=&quot;vertical-align:middle;&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">img </span><span style="color: #FF0000; ">src</span><span style="color: #0000FF; ">='http://www.webthreads.de/.../ajax-loader.gif'</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "> Loading...
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">p</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Das kann nat&#252;rlich nicht funktionieren weil sich die CSS Angabe <span class="code">vertical-align:middle</span> auf den Text einer Zeile bezogen auf das Eltern Element auswirkt, welches wiederum ein Inline-Element sein muss. Dabei orientiert sich die Zeile an der gr&#246;&#223;ten Box die die Zeile enth&#228;lt. Das hei&#223;t, hat man mehrere Inline-Elemente nebeneinander und sie orientieren sich mit der Basislinie an dem gr&#246;&#223;ten Element, dann erstellt man einfach zwei separate Inline-Elemente, setzt bei einem die Schriftgr&#246;&#223;e zum ausrichten und orientieren f&#252;r die anderen Boxen. Siehe dazu auch in der W3C CSS Level 2 Beschreibung  zu der Eigenschaft &#8220;<a href="http://www.edition-w3c.de/TR/1998/REC-CSS2-19980512/kap10.html#heading-10.8%A0">vertical-align:middle</a>&#8221; (deutsche &#220;bersetzung).</p>
<p>Folgende Variante funktioniert somit um einen Text neben einer Grafik mittig auszurichten:</p>
<div>
<p style="border:1px solid black"><span style="vertical-align:middle;font-size:40px;"><img src='http://www.webthreads.de/article-data/uploads/2007/05/ajax-loader.gif'/></span><span style="vertical-align:middle">Loading&#8230;</span></p>
</div>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">p </span><span style="color: #FF0000; ">style</span><span style="color: #0000FF; ">=&quot;padding:0;margin:0;&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">span </span><span style="color: #FF0000; ">style</span><span style="color: #0000FF; ">=&quot;vertical-align:middle; font-size:40px;&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">img </span><span style="color: #FF0000; ">src</span><span style="color: #0000FF; ">='http://www.webthreads.de/.../ajax-loader.gif'</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">span</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">span </span><span style="color: #FF0000; ">style</span><span style="color: #0000FF; ">=&quot;vertical-align:middle&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Loading...</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">span</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">p</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Vor allem wichtig ist die Angabe <span class="code">font-size</span> in einem Inline-Element denn diese erstellt die entsprechende Zeilenh&#246;he an der sich die weiteren Boxen (<span class="code">span</span> Elemente) ausrichten. Am einfachsten ist es diese Angabe entweder in einer leeren Box anzugeben oder bei einer Box, wie hier bei dem Bild, bei der es nicht weiter st&#246;rt. Zur weiteren Versch&#246;nerung kann man die default <span class="code">padding</span> und <span class="code">margin</span> CSS Eigenschaften des <span class="code">p</span> Elementes noch au&#223;er Gefecht setzen.</p>
<p>Ob diese L&#246;sung eine gute, eine einfache oder eine bessere L&#246;sung als die Tabellen-L&#246;sung ist, dass darf jeder selbst entscheiden. Falls einer eine weitere M&#246;glichkeit f&#252;r das mittige Ausrichten eines Textes neben einem Bild hat so darf er sie hier gerne kund tun &#8211; bin sehr gespannt darauf.</p>
<p>(F&#252;r das Erstellen des animierten Loading Bildes wurde <a href="http://www.ajaxload.info/">ajaxload.info</a> verwendet.)</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2007/05/html-tipp-div-stylevertical-alignmiddle-geht-nicht-oder-doch/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>IBM developerWorks: Mastering Ajax</title>
		<link>http://webthreads.de/2007/02/ibm-developer-works-mastering-ajax/</link>
		<comments>http://webthreads.de/2007/02/ibm-developer-works-mastering-ajax/#comments</comments>
		<pubDate>Sat, 03 Feb 2007 09:19:10 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/2007/02/ibm-developer-works-mastering-ajax/</guid>
		<description><![CDATA[Wer mit Ajax loslegen m&#246;chte ben&#246;tigt einige gute einf&#252;hrende Artikel. Eine gute Reihe von Artikel finden sich bei IBM developerWorks unter dem Namen &#8220;Mastering Ajax&#8220;. Ich hatte dar&#252;ber schon einmal vor Monaten berichtet, aber mittlerweile hat sich die Anzahl der Artikel verdoppelt &#8211; es sind nun 9 Artikel in der Reihe. Mastering Ajax, Part 1: [...]]]></description>
			<content:encoded><![CDATA[<p>Wer mit Ajax loslegen m&#246;chte ben&#246;tigt einige gute einf&#252;hrende Artikel. Eine gute Reihe von Artikel finden sich bei IBM developerWorks unter dem Namen &#8220;<a href="http://www-128.ibm.com/developerworks/views/web/libraryview.jsp?search_by=Mastering+Ajax">Mastering Ajax</a>&#8220;. Ich hatte dar&#252;ber schon einmal vor Monaten <a href="http://www.webthreads.de/2006/03/html-javascript-dom-und-ajax-bei-ibm-developerworks/">berichtet</a>, aber mittlerweile hat sich die Anzahl der Artikel verdoppelt &#8211; es sind nun 9 Artikel in der Reihe.</p>
<ol>
<li><a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro1.html">Mastering Ajax, Part 1: Introduction to Ajax</a><br />
Einf&#252;hrung in Ajax unter der Verwendung von HTML, JavaScript, DHTML und DOM.<a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro1.html"><br />
</a></li>
<li><a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro2/index.html">Mastering Ajax, Part 2: Make asynchronous requests with JavaScript and Ajax</a><br />
Erste Interaktion zum Server mit Hilfe von Ajax.<a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro2/index.html"><br />
</a></li>
<li><a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro3/index.html">Mastering Ajax, Part 3: Advanced requests and responses in Ajax</a><br />
Es wird tiefer in den Ajax Request gegangen und die verschiedenen Status, Codes und das XMLHttpRequest Objekt erl&#228;utert.<a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro3/index.html"><br />
</a></li>
<li><a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro4/index.html">Mastering Ajax, Part 4: Exploiting DOM for Web response</a><br />
Wichtig ist es sich mit dem Document Object Model (DOM) auszukennen und hier wird tiefer darauf eingegangen.<a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro4/index.html"><br />
</a></li>
<li><a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro5/index.html">Mastering Ajax, Part 5: Manipulate the DOM</a><br />
Nachdem man das DOM nun kennengelernt hat soll man sehen wie man es ver&#228;ndern und mit ihm arbeiten kann.<a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro5/index.html"><br />
</a></li>
<li><a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro6/index.html">Mastering Ajax, Part 6: Build DOM-based Web applications</a><br />
Es wird eine kleine Beispielanwendung erstellt in der man das DOM manipuliert.<a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro6/index.html"><br />
</a></li>
<li><a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro7.html">Mastering Ajax, Part 7: Using XML in requests and responses Part 1</a><br />
Ajax mit XML verwenden &#8211; was passiert beim XMLHttpRequest und wie gelangt man an die Daten mit Hilfe von XML?<a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro7.html"><br />
</a></li>
<li><a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro8.html">Mastering Ajax, Part 8: Using XML in requests and responses Part 2</a><br />
Die XML Antwort muss mit JavaScript verarbeitet werden.<a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro8.html"><br />
</a></li>
<li><a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro9/index.html">Mastering Ajax, Part 9: Using the Google Ajax Search API</a><br />
Google Search bietet eine Ajax Schnittstelle (ich <a href="http://www.webthreads.de/2006/06/google-ajax-search-api/">berichtete</a>) und hier wird beschrieben wie man sie nutzen kann.</li>
</ol>
<p>Ich pers&#246;nlich finde die Artikel ganz n&#252;tzlich und vor allem die ersten dienen sehr gut der Einf&#252;hrung. Was noch fehlt ist ein Artikel der die Verwendung der JavaScript Object Notation (<a href="http://www.json.org/">JSON</a>) beschreibt, aber das kann ja noch kommen.</p>
<p>Viel Spass beim durcharbeiten, lesen und ausprobieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2007/02/ibm-developer-works-mastering-ajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Style deine Radio Buttons und Checkboxes</title>
		<link>http://webthreads.de/2006/10/style-deine-radio-buttons-und-checkboxes/</link>
		<comments>http://webthreads.de/2006/10/style-deine-radio-buttons-und-checkboxes/#comments</comments>
		<pubDate>Thu, 12 Oct 2006 07:35:50 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/2006/10/style-deine-radio-buttons-und-checkboxes/</guid>
		<description><![CDATA[Ein sch&#246;nes Tutorial wie man Radio Buttons und Checkboxes in ihrem Style verbessern kann liefert Phillip Howard. Grunds&#228;tzlich besteht das Problem bei der Erstellung von Html Formularen, dass bis auf Radio Buttons und Checkboxes alle anderen Formularelemente einfach mit Style Attributen in ihrer Darstellung versch&#246;nert oder an das Seitendesign angepasst werden k&#246;nnen. In dem Tutorial [...]]]></description>
			<content:encoded><![CDATA[<p>Ein sch&#246;nes Tutorial wie man Radio Buttons und Checkboxes in ihrem Style verbessern kann liefert Phillip Howard. Grunds&#228;tzlich besteht das Problem bei der Erstellung von Html Formularen, dass bis auf Radio Buttons und Checkboxes alle anderen Formularelemente einfach mit Style Attributen in ihrer Darstellung versch&#246;nert oder an das Seitendesign angepasst werden k&#246;nnen.</p>
<p>In dem Tutorial &#8220;<a href="http://www.dxdec.com/wod/formstyle/index.html">Styled Form Elements</a>&#8221; wird gezeigt, wie man auch Radio Buttons und Checkboxes in ihrer Darstellung verbessern kann. Dabei beachtet er, dass Browser, die kein CSS oder JavaScript unterst&#252;tzen die default Darstellung angezeigt bekommen, was diese L&#246;sung noch viel interessanter macht. Dabei k&#246;nnen folgende Konstellationen auftreten: kein JavaScript, kein  CSS oder kein JavaScript und kein CSS &#8211; alle diese drei F&#228;lle werden beachtet.</p>
<div style="text-align: center"><a title="Styled Radio Buttons und Checkboxes" href="http://www.dxdec.com/wod/formstyle/index.html"><img id="image431" alt="Tutorial Styled Formular Elements " src="http://www.webthreads.de/article-data/uploads/2006/10/tutorialstyledcheckboxesradiobuttons.gif" /></a></div>
<p>Dass er eine L&#246;sung daf&#252;r gefunden hat und wie sie funktioniert zeigt das Live Beispiel auf der Tutorial Seite. Die Seite inklusive den Beispielen stehen auch direkt zum <a href="http://www.dxdec.com/wod/formStyle/formStyle.zip">Download</a> zu Verf&#252;gung.</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2006/10/style-deine-radio-buttons-und-checkboxes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neue GWT Tutorials</title>
		<link>http://webthreads.de/2006/07/neue-gwt-tutorials/</link>
		<comments>http://webthreads.de/2006/07/neue-gwt-tutorials/#comments</comments>
		<pubDate>Fri, 07 Jul 2006 15:20:06 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/2006/07/neue-gwt-tutorials/</guid>
		<description><![CDATA[Weitere zwei interessante GWT Tutorials die es Wert sind durchgearbeitet zu werden. Das erste Tutorial von java.net mit dem Titel &#8220;Kickstarting Google Web Toolkit on the Client Side&#8221; erl&#228;utert anhand von drei verschiedenen Beispielen mit wachsendem Schwierigkeitsgrad das GWT. Dabei beginnt es bei dem Grunds&#228;tzlichen Verst&#228;ndnis des GWT und dem Erstellen eines GWT Projektes bis [...]]]></description>
			<content:encoded><![CDATA[<p>Weitere zwei interessante GWT Tutorials die es Wert sind durchgearbeitet zu werden.</p>
<p>Das erste Tutorial von <a href="http://www.java.net/">java.net</a> mit dem Titel &#8220;<a href="http://today.java.net/pub/a/today/2006/06/27/client-side-google-web-toolkit.html">Kickstarting Google Web Toolkit on the Client Side</a>&#8221; erl&#228;utert anhand von drei verschiedenen Beispielen mit wachsendem Schwierigkeitsgrad das GWT. Dabei beginnt es bei dem Grunds&#228;tzlichen Verst&#228;ndnis des GWT und dem Erstellen eines GWT Projektes bis hin zu einem komplexerem Beispiel bei der eine Animation abl&#228;uft wenn Maus Events gefeuert werden.</p>
<div style="text-align: center"><a title="java.net - Kickstarting Google Web Toolkit on the Client Side" href="http://today.java.net/pub/a/today/2006/06/27/client-side-google-web-toolkit.html"><img id="image202" alt="java.net GWT Example 3 Moon Walk" src="http://www.webthreads.de/article-data/uploads/2006/07/gwtTutorialMoonWalk.png" /></a></div>
<p>Das zweite Tutorial  von <a href="http://www.ibm.com/developerworks/">IBM developerWorks</a> mit dem Titel &#8220;<a href="http://www-128.ibm.com/developerworks/library/j-ajax4/index.html?ca=dnw-723">Exploring the Google Web Toolkit</a>&#8221; gef&#228;llt mir pers&#246;nlich ein wenig besser weil es mehr Informationen rund um das GWT mitbringt und beschreibt. Das Tutorial startet auch von einem Einstiegslevel mit einem sehr einfach &#8220;Hello World&#8221; Beispiel. Als komplexere Beispiel Applikation wird eine Wetteransage Anwendung erstellt, die erst ganz einfach erstellt wird und im Laufe des Tutorials immer mehr erweitert wird.</p>
<div style="text-align: center"><a title="IBM developerWorks - Exploring the Google Web Toolkit" href="http://www-128.ibm.com/developerworks/library/j-ajax4/index.html?ca=dnw-723"><img alt="IBM developer works gwt tutorial example" id="image204" src="http://www.webthreads.de/article-data/uploads/2006/07/DevWorksGTWTutorialExample.jpg" /></a></div>
<p>Neben dem Erstellen der Anwendung und dem Debuggen mit Eclipse wird erl&#228;utert wie nativer JavaScript Code aufgerufen werden kann um zum Beispiel eine JavaScript Effekt Bibliothek aufzurufen oder warum eine serverseitige Validierung eingegebener Daten notwendig ist.</p>
<p>Und weil gerade die serverseitige Validierung angesprochen wurde hier gleich noch ein Hinweis darauf was passieren kann wenn diese nicht implementiert ist:</p>
<div style="text-align: center"><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/MJNJjh4jORY"></param><embed src="http://www.youtube.com/v/MJNJjh4jORY" type="application/x-shockwave-flash" width="425" height="350"></embed></object></div>
<p>Viel Spass beim lesen und Video schauen =)</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2006/07/neue-gwt-tutorials/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Akkordeon Effekt mit der Yahoo! User Interface Library</title>
		<link>http://webthreads.de/2006/06/akkordeon-effekt-mit-der-yahoo-user-interface-library/</link>
		<comments>http://webthreads.de/2006/06/akkordeon-effekt-mit-der-yahoo-user-interface-library/#comments</comments>
		<pubDate>Wed, 21 Jun 2006 06:30:43 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[Yahoo! UI Library]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/2006/06/akkordion-effekt-mit-der-yahoo-user-interface-library/</guid>
		<description><![CDATA[Der Akkordion Effekt ist in der letzten Zeit durch die Verwendung von JavaScript Bibliotheken immer popul&#228;rer geworden. In dem webthreads WM 2006 Info Mashup wurde dieser Effekt f&#252;r die Darstellung der WM Stadien sowie der WM L&#228;nder genutzt. Einige Bibliotheken bieten diesen Effekt schon von Haus aus an und mann kann ihn direkt einsetzen. Mit [...]]]></description>
			<content:encoded><![CDATA[<p>Der Akkordion Effekt ist in der letzten Zeit durch die Verwendung von JavaScript Bibliotheken immer popul&#228;rer geworden. In dem webthreads <a href="http://www.webthreads.de/wm2006/">WM 2006 Info Mashup</a> wurde dieser Effekt f&#252;r die Darstellung der WM Stadien sowie der WM L&#228;nder genutzt.<br />
Einige Bibliotheken bieten diesen Effekt schon von Haus aus an und mann kann ihn direkt einsetzen. Mit der <a href="http://developer.yahoo.com/yui/index.html">Yahoo! User Interface Library</a> (YUI) muss man sich diesen Effekt erst noch &#8220;bauen&#8221;. Im folgenden wird erl&#228;utert was zu diesem Effekt ben&#246;tigt wird und wie das Ergebnis aussehen kann. Wie schon im Artikel zu dem <a href="http://www.webthreads.de/2006/06/wm-2006-hat-begonnen-wm-info-mashup/">WM Info Mashup angek&#252;ndigt</a> hier nun also das erste Tutorial.</p>
<p>Gliederrung:</p>
<ul>
<li><a href="#LiveBeispiel">Live Beispiel</a></li>
<li><a href="#YUILibraryKomponenten">Ben&#246;tigte YUI Library Komponenten</a></li>
<li><a href="#AufbauHTMLAkkordion">Aufbau des HTML f&#252;r die Akkordion Elemente</a></li>
<li><a href="#AkkordionJavaScript">Akkordion JavaScript</a></li>
<ul>
<li><a href="#JavaScriptAkkordionElementIterieren">&#220;ber alle gegebenen Akkordion Elemente iterieren</a></li>
<li><a href="#AkkordionElementSpeichern">Jedes Akkordion Element speichern und das aktive Element finden</a></li>
<li><a href="#EventListenerRegistrieren">Jedem Element die Akkordion Animation als Click-Event registieren</a></li>
</ul>
<li><a href="#Ressourcen">Ressourcen</a></li>
</ul>
<p><br/><br />
<strong id="LiveBeispiel">Live Beispiel</strong><br />
Das fertige Akkordion Beispiel sieht am Ende wie folgt aus:</p>
<div style="text-align:center">
<iframe src="http://www.webthreads.de/article-data/tutorials/060619_YahooAccordionEffect/beispiel/index.html" style="height:180px; width:400px; border-style:none; text-align:center;"></iframe>
</div>
<p><br/></p>
<div><strong id="YUILibraryKomponenten">Ben&#246;tigte YUI Library Komponenten</strong></div>
<ul>
<li>YUI Library base (<span class="code">yahoo.js</span>)</li>
<li><a href="http://developer.yahoo.com/yui/event/">Event</a> (<span class="code">event.js</span>)</li>
<li><a href="http://developer.yahoo.com/yui/dom/">Dom</a> (<span class="code">dom.js</span>)</li>
<li><a href="http://developer.yahoo.com/yui/animation/">Animation</a> (<span class="code">animation.js</span>)</li>
</ul>
<p>Die YUI Library kann bei SourceForge <a href="http://sourceforge.net/projects/yui">heruntergeladen</a> werden. Anschlie&#223;end die entsprechenden Komponenten aus dem <span class="code">build</span> Verzeichnis in ein geeignetes Unterverzeichnis kopieren (hier wird das Verzeichnis <span class="code">js</span> verwendet) und in die HTML Seite einbinden:</p>
<pre>
<div class="codebox"><span style="color: #008000; ">&lt;!--</span><span style="color: #008000; "> Yahoo! User Interface Library </span><span style="color: #008000; ">--&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script </span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="text/javascript"</span><span style="color: #FF0000; "> src</span><span style="color: #0000FF; ">="js/yahoo/yahoo.js"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script </span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="text/javascript"</span><span style="color: #FF0000; "> src</span><span style="color: #0000FF; ">="js/yahoo/event.js"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script </span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="text/javascript"</span><span style="color: #FF0000; "> src</span><span style="color: #0000FF; ">="js/yahoo/dom.js"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script </span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="text/javascript"</span><span style="color: #FF0000; "> src</span><span style="color: #0000FF; ">="js/yahoo/animation.js"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span></div>
</pre>
<p><br/></p>
<div><strong id="AufbauHTMLAkkordion">Aufbau des HTML f&#252;r die Akkordion Elemente</strong></div>
<p>Ein Akkordion hat immer eine &#220;berschrift und den eigentlichen Inhalt. Im folgenden <em>accordion header</em> und <em>accordion body</em> gennant. Somit wird jeweils ein <span class="code">&lt;div&gt;</span> Element f&#252;r den accordion header und accordion body ben&#246;tigt und auch gleich ein entsprechender CSS-Klassenname f&#252;r das Design und zur sp&#228;teren Identifikation definiert. Ein Accordion Element (also accordion header und accordion body) wird wiederum mit einem weiteren <span class="code">&lt;div&gt;</span> Element gekapselt und auch wieder mit einem entsprechendem CSS-Klassenname versehen.</p>
<p>Ein vollst&#228;ndiges Accordion Element sieht nun wie folgt aus:</p>
<pre>
<div class="codebox"><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionItem"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionHeader"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">accordion header</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionBody"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">accordion body</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span></div>
</pre>
<p>Eine letzte Kapselung wird bei einer Menge von accordion items erstellt um dem JavaScript Aufruf zu vereinfachen.<br />
Der vollst&#228;ndige HTML Code f&#252;r ein Accordion mit drei Elementen sieht wie folgt aus:</p>
<pre>
<div class="codebox"><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="myAccordion"</span><span style="color: #FF0000; "> class</span><span style="color: #0000FF; ">="accordion"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionItem"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionHeader"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">accordion header 1</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionBody"</span><span style="color: #FF0000; "> style</span><span style="color: #0000FF; ">="height:100px;"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">accordion body</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionItem"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionHeader"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">accordion header 2</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionBody"</span><span style="color: #FF0000; "> style</span><span style="color: #0000FF; ">="overflow:auto"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">accordion body</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionItem"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionHeader"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">accordion header 3</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="accordionBody"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">accordion body</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span></div>
</pre>
<p>Durch die Angabe der H&#246;he des ersten accordion body mit <span class="code">style=&#8221;height:100px&#8221;</span> wird die H&#246;he der Akkordion Elemente konfiguriert und gleichzeit das initial ge&#246;ffnete Element definiert. </p>
<div style="text-decoration:underline">CSS Definitionen</div>
<p>Die CSS Klassennamen sind f&#252;r die jeweiligen Element schon definiert &#8211; nun fehlen nur noch die entsprechenden CSS Klassendefinitionen. Generell muss nat&#252;rlich die Gesamtbreite des Akkordions angegeben werden sonst erscheint dieser &#252;ber die gesamte verf&#252;gbar Breite der Seite. Aber auch der accordion header sowie der accordion body m&#252;ssen mit H&#246;hen ausgestattet werden, wobei zu beachten ist, dass bei dem accordion body nur das initial aktive Element eine H&#246;he direkt angegeben bekommt und per default alle anderen eine H&#246;he von 0 Pixel haben.</p>
<pre>
<div class="codebox"><span style="color: #800000; ">&lt;style type="text/css" media="screen"&gt;
  .accordion </span><span style="color: #000000; ">{</span><span style="color: #FF0000; ">
    width</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> 300px</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    border</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> 1px solid #999999</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    font-family</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> Helvetica,Arial,sans-serif</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    font-size</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> 12px</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    color</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> #000000</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
  </span><span style="color: #000000; ">}</span><span style="color: #800000; ">

  .accordionHeader </span><span style="color: #000000; ">{</span><span style="color: #FF0000; ">
    height</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> 16px</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    background-color</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> #CFD8E4</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    border</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> 1px solid #999999</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    font-size</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> 14px</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    padding</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> 1px 0px 1px 3px</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    cursor</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> pointer</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
  </span><span style="color: #000000; ">}</span><span style="color: #800000; ">

  .accordionBody </span><span style="color: #000000; ">{</span><span style="color: #FF0000; ">
    height</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> 0px</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    overflow</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> hidden</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    padding</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> 0px 2px</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
    background-color</span><span style="color: #000000; ">:</span><span style="color: #0000FF; "> #EEEEEE</span><span style="color: #000000; ">;</span><span style="color: #FF0000; ">
  </span><span style="color: #000000; ">}</span><span style="color: #800000; ">
&lt;/style&gt;</span></div>
</pre>
<p>Per default ist der accordion body bei meinem Beispiel mit dem style <span class="code">overflow:hidden</span> gesetzt. Das bedeutet, dass auch bei einer gr&#246;&#223;eren Datenmenge f&#252;r einen accordion body kein Scollbalken erscheint. M&#246;chte man einen Scrollbalken haben so muss der style entweder nur f&#252;r das entsprechende Akkordion Elemement oder generell in der CSS-Klasse auf <span class="code">overflow:auto</span> gesetzt werden. In meinem Beispiel hat das zweite Akkordion Element einen Scrollbalken.<br />
Es sei noch erw&#228;hnt, dass die CSS Definitionen zwecks des guten Stils nat&#252;rlich in eine eigene CSS Datei ausgelagert werden sollten. In diesem Beispiel werden der &#220;bersicht wegen die CSS Definitionen nicht ausgelagert um den HTML Code direkt mit den dazugeh&#246;rigen CSS Angaben sehen zu k&#246;nnen.</p>
<p><br/></p>
<div id="AkkordionJavaScript" style="font-weight:bold">Akkordion JavaScript</div>
<p>Das JavaScript f&#252;r die Akkordion Effekt kann in drei Teile aufgeteilt werden.</p>
<ul>
<li><a href="#JavaScriptAkkordionElementIterieren">&#220;ber alle gegebenen Akkordion Elemente iterieren</a></li>
<li><a href="#AkkordionElementSpeichern">Jedes Akkordion Element speichern und das aktive Element finden</a></li>
<li><a href="#EventListenerRegistrieren">Jedem Element die Akkordion Animation als Click-Event registieren</a></li>
</ul>
<p>Der JavaScript Code der nun erstellt wird sollte so allgemein wie nur m&#246;glich sein, damit er einfach wiederverwendet werden kann. Aus diesem Grund wurden bei dem Erstellen des HTMLs eindeutige Klassennamen verwendet, die zum einen den Zweck haben eine einheiltiche Gestaltung zu gew&#228;hrleisten und zum anderen eine einfache Identifikation zu erm&#246;glichen. Zudem wurde dem gesamten Akkordion eine eindeutige ID vergeben. Diese Id wird verwendet um ein Akkordion Objekt zu erstellen.</p>
<p>Wem die kompletten JavaScript Erl&#228;uterungen zu viel sind, der kann sich nur das folgende JavaScript Grundger&#252;st sowie die Erstellung ein solches Akkordion Objektes anschauen und gleich zu den Resourcen springen um entweder nur die accordion.js oder das gesamte Beispiel herunterzuladen. Generell reichen die bisherigen Erl&#228;uterungen und das accordion.js aus um ein Akkordion Effekt zu erstellen.</p>
<div style="text-decoration:underline">Grundger&#252;st des Akkordion JavaScript</div>
<p>Es wird eine Accordion Funktion erstellt, die als Parameter die Id des Akkordion Rahmen &lt;div&gt; Elements erh&#228;lt. Sch&#246;ner Stil ist nat&#252;rlich, wenn der JavaScript Code in eine separate Datei ausgelagert wird. In diesem Beispiel heisst diese Datei <span class="code">accordion.js</span>. Das Grundger&#252;st f&#252;r die Accordion Funktion sieht wie folgt aus:</p>
<pre class="codebox"><span style="color: #0000FF; ">function</span><span style="color: #000000; "> Accordion(id) {
  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Akkordion JavaScript Code</span><span style="color: #008000; ">
</span><span style="color: #000000; ">}</span></pre>
<p>Um f&#252;r den oben beschriebenen Akkordion HTML Code den Akkordion Effekt zu geben wird folgender Code genutzt:</p>
<pre class="codebox"><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script </span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="text/javascript"</span><span style="color: #FF0000; "> src</span><span style="color: #0000FF; ">="js/accordion.js"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">

</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script </span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="text/javascript"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
<span style="color: #0000FF; ">var</span><span style="color: #000000; ">  myAccordions;

  </span><span style="color: #0000FF; ">function</span><span style="color: #000000; "> init() {
    accordionWMCities </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Accordion(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">myAccordion</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);
  }
  YAHOO.util.Event.addListener(window, 'load', init);
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span></pre>
<p>Dabei wird die YUI Event Funktionalit&#228;t genutzt um das Akkordion Objekt nach dem Erstellen des DOMs mit dem <span class="code">onLoad</span>zu erzeugen.</p>
<p><br/></p>
<div id="JavaScriptAkkordionElementIterieren" style="text-decoration:underline">&#220;ber alle gegebenen Akkordion Elemente iterieren</div>
<p>Nachdem das Erstellen eines Akkordion Objektes gekl&#228;rt ist werden nun als erstes anhand der &#252;bergebenen Akkordion Id die Akkordion Elemente geholt und lokal gespeichert.<br />
In der YUI Library besteht seit der Version 0.10.0 die M&#246;glichkeit Dom Elemente anhand ihres CSS-Klassennamens zu selektieren. Die Funktion ist in er <a href="http://developer.yahoo.com/yui/dom/">Dom Komponente</a> zu finden (siehe auch <a href="http://developer.yahoo.com/yui/docs/dom/YAHOO.util.Dom.html#getElementsByClassName">JSDoc</a> der DOM-Funktion) und lautet:</p>
<pre class="codebox">Array YAHOO.util.Dom.getElementsByClassName( className,  tag,  root)</pre>
<p>Es w&#252;rde reichen wenn nur der CSS-Klassenname angegeben wird. F&#252;r eine Verbesserung der Performance sollte allerdings der Tag Name der Elemente nach denen gesucht wird (in unserem Fall ist das ein <span class="code">&lt;div&gt;</span>) und ein Start Knoten angegeben werden.</p>
<pre class="codebox"><span style="color: #0000FF; ">function</span><span style="color: #000000; "> Accordion(id) {
  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Speicher das Element der &#252;bergebenen ID als Akkordion Container</span><span style="color: #008000; ">
</span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accContainer </span><span style="color: #000000; ">=</span><span style="color: #000000; "> document.getElementById(id);

  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Alle Elemente mit der CSS-Klasse 'accordionItem' holen</span><span style="color: #008000; ">
</span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems </span><span style="color: #000000; ">=
    </span><span style="color: #000000; "> YAHOO.util.Dom.getElementsByClassName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accordionItem</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">div</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accContainer);

  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> default Akkordion body H&#246;he definieren</span><span style="color: #008000; ">
</span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItemBodyHeight </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;

  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> &#220;ber alle Akkordion Elemente iterieren und jedes einzelne in einem Array speichern</span><span style="color: #008000; ">
</span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">var</span><span style="color: #000000; "> i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems.length; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {
    ...
  }
}</span></pre>
<p><br/></p>
<div id="AkkordionElementSpeichern" style="text-decoration: underline;">Jedes Akkordion Element speichern und das aktive Element finden</div>
<p>In der for Schleife wird nun &#252;ber jedes Akkordion Element (CSS Klasse <span class="code">accordionItem</span>) iteriert und jedes Element sowie deren accordion Header und accordion Body soll gespeichert werden. Gleichzeitig soll gepr&#252;ft werden ob das aktuelle Element das aktive Element ist. Das aktive Element hat als einzigstes Element eine H&#246;he im accordion body definiert.</p>
<pre class="codebox"><span style="color: #000000; ">  </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">var</span><span style="color: #000000; "> i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems.length; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {
    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Aktuelles Akkordion Element als Eltern-Element f?r dazugeh?rigen Header und </span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Body speichern</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].parent </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;
    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Akkordion Header und Body des aktuellen Akkordion Elements holen und speichern</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].header </span><span style="color: #000000; ">=</span><span style="color: #000000; ">
      YAHOO.util.Dom.getElementsByClassName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accordionHeader</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">div</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,
        </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i])[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];
    </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].body </span><span style="color: #000000; ">=</span><span style="color: #000000; ">
      YAHOO.util.Dom.getElementsByClassName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accordionBody</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">div</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,
        </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i])[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];

    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Pr&#252;fen ob das aktuelle Akkordion Element das aktive Element ist (also eine </span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> gr&#246;&#223;ere H&#246;he f?r den accordion body gesetzt hat). Normalerweise sollte nur ein</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Element eine H&#246;he gr&#246;&#223;er 0 Pixel definiert haben. Wenn die H&#246;he gr&#246;&#223;er der</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> H&#246;he des bisherigen aktiven Akkordion oder am Anfang 0 Pixel ist wird dieser </span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> als aktives Element gespeichert.</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].body.offsetHeight </span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItemBodyHeight) {
      </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItemBodyHeight </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].body.offsetHeight;
      </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.activeItem </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i];
      </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.activeItem.body.style.height </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItemBodyHeight </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">px</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;
    }

    ...
  }</span></pre>
<p><br/></p>
<div id="EventListenerRegistrieren" style="text-decoration: underline;">Jedem Element die Akkordion Animation als Click-Event registieren</div>
<p>Als letztes muss nur noch die Animation f&#252;r das Zusammenfahren des aktiven Elements und das Ausdehnen des selektierten Elements definiert werden. Dies wird mit Hilfe der <a href="http://developer.yahoo.com/yui/animation/">Animation</a> und <a href="http://developer.yahoo.com/yui/event/">Event</a> Kompontente der YUI Library implementiert. Auf die Animation Komponente wird in diesem Tutorial nicht weiter eingegangen. Dieses Thema wird separat in einem weiteren Tutorial behandelt.</p>
<pre class="codebox"><span style="color: #000000; ">  </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">var</span><span style="color: #000000; "> i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems.length; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {
    ...

    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Einen Click Event Listener f&#252;r jeden accordion header registrieren</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    YAHOO.util.Event.addListener(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].header, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">click</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(){
      </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Wenn auf das aktive Element geklickt wurde - nichts machen</span><span style="color: #008000; ">
</span><span style="color: #000000; ">      </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.parent.activeItem </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">){
          </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;
      }

      </span><span style="color: #008000; ">//</span><span style="color: #008000; "> F&#252;r das aktive Element eine "Schrumpf" Animation definieren</span><span style="color: #008000; ">
</span><span style="color: #000000; ">      </span><span style="color: #0000FF; ">var</span><span style="color: #000000; "> shrinkLastAccAnim </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> YAHOO.util.Anim(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.parent.activeItem.body, {
      height:{from:</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.parent.accItemBodyHeight, to:</span><span style="color: #000000; ">0</span><span style="color: #000000; ">}}, </span><span style="color: #000000; ">0.5</span><span style="color: #000000; ">);

      </span><span style="color: #008000; ">//</span><span style="color: #008000; "> F&#252;r das angeklickte Elment eine "Ausdehnen" Animation definieren</span><span style="color: #008000; ">
</span><span style="color: #000000; ">      </span><span style="color: #0000FF; ">var</span><span style="color: #000000; "> expandNewActiveAccAnim </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> YAHOO.util.Anim(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.body, {
      height:{from:</span><span style="color: #000000; ">0</span><span style="color: #000000; ">, to:</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.parent.accItemBodyHeight}}, </span><span style="color: #000000; ">0.5</span><span style="color: #000000; ">);

      </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Selektiertes Element als aktives Element setzen</span><span style="color: #008000; ">
</span><span style="color: #000000; ">      expandNewActiveAccAnim.onStart.subscribe(</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">() {
        </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.parent.activeItem </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;
      }, </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);

      </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Animation starten</span><span style="color: #008000; ">
</span><span style="color: #000000; ">      shrinkLastAccAnim.animate();
      expandNewActiveAccAnim.animate();
    }, </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i], </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);

  }</span></pre>
<p><br/></p>
<div style="text-decoration: underline;">Vollst&#228;ndiger JavaScript Code</div>
<p>Der gesamte JavaScript Code f&#252;r den Accordion Effekt ist im folgenden Listing zu erkennen. Dieser ist ausf&#252;hrlich kommentiert und sieht auf den ersten Blick evtl. komplexer aus als er wirklich ist. Die H&#228;lfte des Listings besteht aus Kommentaren. Das JavaScript f&#252;r den Akkordion Effekt kann auch direkt als Datei heruntergeladen werden (siehe <a href="#Ressourcen">Ressourcen</a>).</p>
<pre class="codebox"><span style="color: #0000FF; ">function</span><span style="color: #000000; "> Accordion(id) {
  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Speicher das Element der ?bergebenen ID als Akkordion Container</span><span style="color: #008000; ">
</span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accContainer </span><span style="color: #000000; ">=</span><span style="color: #000000; "> document.getElementById(id);

  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Alle Elemente mit der CSS-Klasse 'accordionItem' holen</span><span style="color: #008000; ">
</span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems </span><span style="color: #000000; ">=</span><span style="color: #000000; ">
    YAHOO.util.Dom.getElementsByClassName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accordionItem</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">div</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accContainer);

  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> default Akkordion body H?he definieren</span><span style="color: #008000; ">
</span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItemBodyHeight </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;

  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> ?ber alle Akkordion Elemente iterieren und jedes einzelne in einem Array speichern</span><span style="color: #008000; ">
</span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">var</span><span style="color: #000000; "> i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems.length; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {
    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Aktuelles Akkordion Element als Eltern-Element f?r dazugeh?rigen Header und </span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Body speichern</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].parent </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;
    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Akkordion Header und Body des aktuellen Akkordion Elements holen und speichern</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].header </span><span style="color: #000000; ">=</span><span style="color: #000000; ">
      YAHOO.util.Dom.getElementsByClassName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accordionHeader</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">div</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,
        </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i])[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];
    </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].body </span><span style="color: #000000; ">=</span><span style="color: #000000; ">
      YAHOO.util.Dom.getElementsByClassName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accordionBody</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">div</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,
        </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i])[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];

    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Pr&#252;fen ob das aktuelle Akkordion Element das aktive Element ist (also eine </span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> gr&#246;&#223;ere H&#246;he f?r den accordion body gesetzt hat). Normalerweise sollte nur ein</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Element eine H&#246;he gr&#246;&#223;er 0 Pixel definiert haben. Wenn die H&#246;he gr&#246;&#223;er der</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> H&#246;he des bisherigen aktiven Akkordion oder am Anfang 0 Pixel ist wird dieser </span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> als aktives Element gespeichert.</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].body.offsetHeight </span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItemBodyHeight) {
      </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItemBodyHeight </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].body.offsetHeight;
      </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.activeItem </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i];
      </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.activeItem.body.style.height </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItemBodyHeight </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">px</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;
    }

    </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Einen Click Event Listener f?r jeden accordion header registrieren</span><span style="color: #008000; ">
</span><span style="color: #000000; ">    YAHOO.util.Event.addListener(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].header, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">click</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(){
      </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Wenn auf das aktive Element geklickt wurde - nichts machen</span><span style="color: #008000; ">
</span><span style="color: #000000; ">      </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.parent.activeItem </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">){
        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;
      }

      </span><span style="color: #008000; ">//</span><span style="color: #008000; "> F?r das aktive Element eine "Schrumpf" Animation definieren</span><span style="color: #008000; ">
</span><span style="color: #000000; ">      </span><span style="color: #0000FF; ">var</span><span style="color: #000000; "> shrinkLastAccAnim </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> YAHOO.util.Anim(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.parent.activeItem.body, {
        height:{from:</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.parent.accItemBodyHeight, to:</span><span style="color: #000000; ">0</span><span style="color: #000000; ">}}, </span><span style="color: #000000; ">0.5</span><span style="color: #000000; ">);

      </span><span style="color: #008000; ">//</span><span style="color: #008000; "> F?r das angeklickte Elment eine "Ausdehnen" Animation definieren</span><span style="color: #008000; ">
</span><span style="color: #000000; ">      </span><span style="color: #0000FF; ">var</span><span style="color: #000000; "> expandNewActiveAccAnim </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> YAHOO.util.Anim(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.body, {
        height:{from:</span><span style="color: #000000; ">0</span><span style="color: #000000; ">, to:</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.parent.accItemBodyHeight}}, </span><span style="color: #000000; ">0.5</span><span style="color: #000000; ">);

      </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Selektiertes Element als aktives Element setzen</span><span style="color: #008000; ">
</span><span style="color: #000000; ">      expandNewActiveAccAnim.onStart.subscribe(</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">() {
        </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.parent.activeItem </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;
      }, </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);

      </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Animation starten</span><span style="color: #008000; ">
</span><span style="color: #000000; ">      shrinkLastAccAnim.animate();
      expandNewActiveAccAnim.animate();
    }, </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i], </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);
  }

  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Letzte Pr&#252;fung, falls mehrere Elemente eine H&#246;he angegeben haben. Es wird </span><span style="color: #008000; ">
</span><span style="color: #000000; ">  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> nur das aktive Element offen gelassen. Alle anderen Akkordion Elemente </span><span style="color: #008000; ">
</span><span style="color: #000000; ">  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> erhalten die H&#246;he 0 Pixel.</span><span style="color: #008000; ">
</span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">var</span><span style="color: #000000; "> i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems.length; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">){
    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.activeItem </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i]){
      </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.accItems[i].body.style.height </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">px</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;
    }
  }
};</span></pre>
<p><br/></p>
<div id="Ressourcen" style="font-weight:bold">Ressourcen</div>
<p>Das hier beschriebene Beispiel kann noch einmal separat auf einer eigenen HTML Seite angesehen werden: <a href="http://www.webthreads.de/article-data/tutorials/060619_YahooAccordionEffect/beispiel/">Link</a><br />
Zudem kann das gesamte Beispiel komplett zum entpacken heruntergeladen werden: <a href="http://www.webthreads.de/article-data/tutorials/060619_YahooAccordionEffect/AkkordionBeispiel.zip">AkkordionBeispiel.zip</a><br />
Oder auch nur der Akkordion JavaScript: <a href="http://www.webthreads.de/article-data/tutorials/060619_YahooAccordionEffect/beispiel/js/accordion.js">accordion.js</a></p>
<p>Viel Spass beim Ausprobieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2006/06/akkordeon-effekt-mit-der-yahoo-user-interface-library/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>JavaScript Einf&#252;hrung</title>
		<link>http://webthreads.de/2006/06/javascript-einfuehrung/</link>
		<comments>http://webthreads.de/2006/06/javascript-einfuehrung/#comments</comments>
		<pubDate>Mon, 12 Jun 2006 21:19:25 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/2006/06/javascript-einfuehrung/</guid>
		<description><![CDATA[Durch Ajax hat JavaScript eine ganz neue Bedeutung erhalten und jeder der sich mit Ajax besch&#228;ftigen m&#246;chte kommt um JavaScript nicht herum. Aus diesem Grund sollte man zumindestens die Grundlagen von JavaScript kennen und anwenden k&#246;nnen. Eine sch&#246;ne Einf&#252;hrung in JavaScript und alle dazugeh&#246;rigen Komponenten kann bei Simon Willison gefunden werden. Er hat auf der [...]]]></description>
			<content:encoded><![CDATA[<p>Durch Ajax hat JavaScript eine ganz neue Bedeutung erhalten und jeder der sich mit Ajax besch&#228;ftigen m&#246;chte kommt um JavaScript nicht herum. Aus diesem Grund sollte man zumindestens die Grundlagen von JavaScript kennen und anwenden k&#246;nnen.</p>
<p>Eine sch&#246;ne Einf&#252;hrung in JavaScript und alle dazugeh&#246;rigen Komponenten kann bei <a href="http://simon.incutio.com/archive/2006/03/07/etech">Simon Willison</a> gefunden werden. Er hat auf der <a href="http://conferences.oreillynet.com/et2006/">ETech</a> Konferenz einen dreist&#252;ndigen Vortrag &#252;ber JavaScript gegeben und anschlie&#223;end seine Folien ver&#246;ffentlich hat.</p>
<div style="text-align: center"><a title="ReIntroduction JavaScript" href="http://www.flickr.com/photos/simon/sets/72057594077197868/with/109336083/"><img alt="JavaScript Slides" id="image171" src="http://www.webthreads.de/article-data/uploads/2006/06/ReIntroductionJavaScriptSlides.jpg" /></a></div>
<p>Die Slides sind in drei verschiedenen Varianten verf&#252;gbar. Zum einen als einzelne <a href="http://simon.incutio.com/slides/2006/etech/javascript/js-tutorial.001.html">HTML Seiten</a> die auch mit einer <a href="http://www.flickr.com/photos/simon/sets/72057594077197868/with/109336083/">h&#246;heren Aufl&#246;sung</a> bei flickr vorliegen. In der dritten Variante liegen alle Slides auf <a href="http://simon.incutio.com/slides/2006/etech/javascript/js-reintroduction-notes.html">eine Seite</a> zusammengestellt vor und haben ein wenig mehr beschreibenden Text &#8211; somit gut zum drucken geeignet und lesen.</p>
<p>Die Slides sind sehr lesenswert und als JavaScript Einf&#252;hrung gut geeignet &#8211; vielen Dank an J&#246;rg Zintel f&#252;r diese Information. =)</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2006/06/javascript-einfuehrung/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WM 2006 hat begonnen &#8211; WM Info Mashup</title>
		<link>http://webthreads.de/2006/06/wm-2006-hat-begonnen-wm-info-mashup/</link>
		<comments>http://webthreads.de/2006/06/wm-2006-hat-begonnen-wm-info-mashup/#comments</comments>
		<pubDate>Sat, 10 Jun 2006 09:33:41 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Beispiel]]></category>
		<category><![CDATA[Mashup]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/2006/06/wm-2006-hat-begonnen-wm-info-mashup/</guid>
		<description><![CDATA[Nun ist es soweit: die WM 2006 hat begonnen. Deutschland hat souver&#228;n einen 4:2 Sieg errungen und niemand kann die deutsche Mannschaft nun mehr aufhalten. DEUTSCHLAND WIRD WELTMEISTER &#8211; jedenfalls fast, wie man auch an dem offiziellen webthreads WM Tipp sehen kann. Aber was wird f&#252;r den gemeinen Web User f&#252;r die WM noch ben&#246;tigt? [...]]]></description>
			<content:encoded><![CDATA[<p>Nun ist es soweit: die WM 2006 hat begonnen. Deutschland hat <strike>souver&#228;n</strike> einen 4:2 Sieg errungen und niemand kann die deutsche Mannschaft nun mehr aufhalten. DEUTSCHLAND WIRD WELTMEISTER &#8211; jedenfalls fast, wie man auch an dem offiziellen <a href="http://fo.reca.st/wm.php?u=webthreads">webthreads WM Tipp</a> sehen kann.<br />
Aber was wird f&#252;r den gemeinen Web User f&#252;r die WM noch ben&#246;tigt? Man sollte &#252;ber die Stadien und teilnehmenden L&#228;nder bescheid wissen. Wer sich bis heute noch nicht wirklich informiert hat ist bei dem webthreads <a href="http://www.webthreads.de/wm2006/">WM 2006 Info Mashup</a> genau richtig. Dort sind einige Informationen zu den WM Stadion St&#228;dten sowie zu allen L&#228;ndern hinterlegt. Zudem k&#246;nnen die offiziellen WM Turnier und Team News gelesen werden. Also einfach mal <a href="http://www.webthreads.de/wm2006/">reinschauen</a>.</p>
<div style="text-align: center"><a title="webthreads WM 2006 Mashup" href="http://www.webthreads.de/wm2006/"><img alt="webthreads WM 2006 Mashup" id="image170" src="http://www.webthreads.de/article-data/uploads/2006/06/webhtreadsWmMashup.jpg" /></a></div>
<p>Aber <a href="http://www.webthreads.de">webthreads.de</a> w&#228;re kein Blog rund um die Entwicklung von Web Anwendungen wenn die einzelnen Komponenten nicht in Tutorials erl&#228;utert werden w&#252;rden. So kommen in den n&#228;chsten Wochen einige Tutorials rund um das webthreads <a href="http://www.webthreads.de/wm2006/">WM 2006 Info Mashup</a>. Darunter folgende Themen:</p>
<ul>
<li><a href="http://www.webthreads.de/2006/06/akkordion-effekt-mit-der-yahoo-user-interface-library/">Erstellen einen Akkordion Effekts mit der YUI Library</a></li>
<li>Erstellen eines Animations Effekts (Auf- und Zuklappen) mit der YUI Library</li>
<li>Implementierung eines RSS Readers mit Hilfe von DWR und Java</li>
<li>Erstellen und Einbinden einer Google Map mit Daten aus einem XML File</li>
</ul>
<p>Nachdem nun die News, die &#252;brigends von der offiziellen <a href="http://www.fifaworldcup.com">FIFA WM Homepage</a> geliefert werden, vorhanden sind, darf man fragen was dem richtigen Fussballfan nun noch fehlt? &#8211; Und tats&#228;chlich fehlt noch ein Live Ticker, der die Spielst&#228;nde direkt in den Browser bringt. Zum Gl&#252;ck gibt es Firefox und dessen Plugin API. So besteht mit der Firefox Erweiterung &#8220;<a href="http://hackr.de/2006/06/02/footiefox">FootieFox</a>&#8221; die M&#246;glichkeit einen WM Liveticker in seinen Firefox eingebettet zu bekommen. <a href="http://hackr.de/2006/06/02/footiefox">FootieFox</a> ist somit f&#252;r jeden WM Begeisterten Pflicht =). (FootieFox via <a href="http://hackr.de/2006/06/02/footiefox">live.hackr</a>)</p>
<p>Somit kann die WM 2006 nun richtig durchstarten.</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2006/06/wm-2006-hat-begonnen-wm-info-mashup/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Google Web Toolkit (GWT) Einf&#252;hrung</title>
		<link>http://webthreads.de/2006/06/google-web-toolkit-gwt-einfuehrung/</link>
		<comments>http://webthreads.de/2006/06/google-web-toolkit-gwt-einfuehrung/#comments</comments>
		<pubDate>Fri, 02 Jun 2006 05:05:40 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/2006/06/google-web-toolkit-gwt-einfuehrung/</guid>
		<description><![CDATA[Erst k&#252;rzlich wurde das Google Web Toolkit (GWT) ver&#246;ffentlicht mit dem es m&#246;glich ist Web Anwendungen komplett in Java zu schreiben. Das GWT generiert dann aus dem gem Java Code JavaScript Code. Einer der Vorteile von dieser Art der Entwicklung liegt an dem mitgeliefertem Browser mit dem es m&#246;glich ist die geschriebene Anwendung mit allen [...]]]></description>
			<content:encoded><![CDATA[<p>Erst k&#252;rzlich wurde das Google Web Toolkit (GWT) <a href="http://www.webthreads.de/2006/05/google-web-toolkit-entwickle-ajax-anwendungen-in-java/">ver&#246;ffentlicht</a> mit dem es m&#246;glich ist Web Anwendungen komplett in Java zu schreiben. Das GWT generiert dann aus dem gem Java Code JavaScript Code. Einer der Vorteile von dieser Art der Entwicklung liegt an dem mitgeliefertem Browser mit dem es m&#246;glich ist die geschriebene Anwendung mit allen vorhandenen Java Debugging M&#246;glichkeiten Schritt f&#252;r Schritt zu debuggen.</p>
<div style="text-align: center"><a title="GWT Debugging in Eclipse" href="http://www.onjava.com/pub/a/onjava/2006/05/31/working-with-google-web-toolkit.html"><img id="image152" alt="GWT Debugging in Eclipse" src="http://www.webthreads.de/article-data/uploads/2006/06/onJava_WorkingWithGWT_DebuggerEclipse.png" /><br />
</a></div>
<p>Obwohl auf der offiziellen <a href="http://code.google.com/webtoolkit/">GWT Homepage</a> eine &#8220;<a href="http://code.google.com/webtoolkit/gettingstarted.html">Getting Started</a>&#8221; Seite sowie <a href="http://code.google.com/webtoolkit/documentation/examples/">Beispiele</a> mit Source Code vorhanden sind ist das GWT erst einmal gew&#246;hnungsbed&#252;rftig. So ist es nur zu begr&#252;&#223;en, dass auf der <a href="http://www.onjava.com">ONJava Homepage</a> eine ausf&#252;hrliche <a href="http://www.onjava.com/pub/a/onjava/2006/05/31/working-with-google-web-toolkit.html">Einf&#252;hrung</a> in das GWT gestern ver&#246;ffentlicht wurde. In der Einf&#252;hrung wird eine Tabelle (Tabellen Klasse) implementiert, welche bei der selektierten Zeile die CSS Klasse &#228;ndert und die Daten f&#252;r die Tabelle dynamisch mit Ajax geladen werden. Es wird auch kurz das History Objekt angesprochen mit dem es m&#246;glich ist mit dem Back Button des Browsers umzugehen.</p>
<div style="text-align: center"><a title="Implementiertes Beispiel - Tabelle" href="http://www.onjava.com/pub/a/onjava/2006/05/31/working-with-google-web-toolkit.html"><img alt="GWT Table Example" id="image149" src="http://www.webthreads.de/article-data/uploads/2006/06/onJava_WorkingWithGWT_TableExample.jpg" /></a></div>
<p>Im gesamten ist das eine sehr sch&#246;ne Einf&#252;hrung in das GWT und zeigt in einzelnen Schritten auf wie das grunds&#228;tzliche Vorgehen bei einer Entwicklung ist. Der Source Code f&#252;r das Beispiel kann in den Resourcen runtergeladen werden (<a href="http://www.onjava.com/onjava/2006/05/31/examples/sample.zip">Direktlink</a>). Um das Beispiel lokal bei sich zum laufen zu bringen kann zum einen <a href="http://maven.apache.org/">Maven</a> verwendet werden, wie das auch der Autor in seinem Tutorial beschreibt. Ich habe aktuell kein Maven installiert und darum doch gleich mal die Eclipse Unterst&#252;tzung des GWT ausprobiert.</p>
<p>Um das Beispiel in Eclipse zum laufen zu bringen einfach folgende Schritte ausf&#252;hren:</p>
<p>1. Verzeichnis f&#252;r das Eclipse Projekt erstellen.</p>
<p>2. <a href="http://code.google.com/webtoolkit/gettingstarted.html#Install">GWT installieren</a> und <span class="code">applicationCreator.cmd</span> sowie <span class="code">projectCreator.cmd</span> im Pfad verf&#252;gbar machen, so dass von &#252;berall zugegriffen werden kann (oder es muss der komplette Pfad zum GWT beim Aufruf der Befehle angegeben werden).</p>
<p>3. Kommandozeile in dem erstellten Verzeichnis &#246;ffnen und mit GWT ein Eclipse Projekt f&#252;r das Tabellen Beispiel erstellen:<br />
<code>
#projectCreator -eclipse Table
</code></p>
<p>4. In der gleichen Kommandozeile das GWT Anwendungsger&#252;st erstellen:<br />
<code>
#applicationCreator -eclipse Table com.totsp.gwt.client.Table
</code></p>
<p>5. Source Code <a href="http://www.onjava.com/onjava/2006/05/31/examples/sample.zip">runterladen</a> und entpacken.</p>
<p>6. Aus dem entpackten Verzeichnis den Source Code (Unterhalb des Verzeichnisses <span class="code">sample/src/java/</span>) in das Eclipse Projekt Source Verzeichnis (<span class="code">src</span>) kopieren. Dabei die vorhandenen Dateien &#252;berschreiben.</p>
<p>7. Eclipse starten und das Projekt importieren. Bei dem Import Fenster bis zu dem erstellten Ordner f&#252;r das Eclipse Projekt navigieren und &#8220;OK&#8221; dr&#252;cken. Das Eclipse Projekt wird als solches erkannt und kann importiert werden.</p>
<div style="text-align: center"><img id="image154" alt="GWT Table Eclipse Projekt" src="http://www.webthreads.de/article-data/uploads/2006/06/onJava_WorkingWithGWT_Eclipse.jpg" /></div>
<p>8. Sobald das Projekt importiert ist kann es wie eine normale Java Anwendung von Eclipse heraus gestartet werden (Men&#252;punkt &#8220;Run&#8221;->&#8221;Run&#8230;&#8221;->&#8221;Java Applikation &#8211; Table&#8221;). Genauso verh&#228;lt es sich f&#252;r das Debuggen &#8211; einfach aus Eclipse heraus im Debug Modus starten und beliebig Breakpoints setzen.</p>
<p>Das Beispiel ist eine einfache M&#246;glichkeit GWT einaml aus Eclipse heraus zu starten oder auch zu debuggen ohne sich viel Gedanken &#252;ber das Erstellen einer GWT Anwendung zu machen.<br />
Jedenfalls ist das Tutorial f&#252;r eine Einf&#252;hrung in das GWT sehr zu empfehlen!</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2006/06/google-web-toolkit-gwt-einfuehrung/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>HTML, JavaScript, DOM und Ajax bei IBM developerWorks</title>
		<link>http://webthreads.de/2006/03/html-javascript-dom-und-ajax-bei-ibm-developerworks/</link>
		<comments>http://webthreads.de/2006/03/html-javascript-dom-und-ajax-bei-ibm-developerworks/#comments</comments>
		<pubDate>Mon, 20 Mar 2006 11:19:09 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/index.php/2006/03/20/html-javascript-dom-und-ajax-bei-ibm-developerworks/</guid>
		<description><![CDATA[Bei den Seiten von IBM developerWorks gibt es eine Reihe von Tutorials die sich rund um Ajax besch&#228;ftigen. Insbesondere sind vier Tutorials der Reihe &#8220;Mastering Ajax&#8221; als Einf&#252;hrung in die Entwicklung von Ajax interessant. So wird von Grund auf erl&#228;utert in welchem Zusammenhang HTML, JavaScript und Ajax stehen und wie man es verwenden kann. Das [...]]]></description>
			<content:encoded><![CDATA[<p>Bei den Seiten von IBM <a href="http://www.ibm.com/developerworks/">developerWorks</a> gibt es eine Reihe von Tutorials die sich rund um Ajax besch&#228;ftigen. Insbesondere sind vier Tutorials der Reihe &#8220;<a href="http://www.ibm.com/developerworks/search/searchResults.jsp?searchType=1&amp;searchSite=dW&amp;searchScope=dW&amp;query=mastering+ajax">Mastering Ajax</a>&#8221; als Einf&#252;hrung in die Entwicklung von Ajax interessant. So wird von Grund auf erl&#228;utert in welchem Zusammenhang HTML, JavaScript und Ajax stehen und wie man es verwenden kann. Das letzte Tutorial besch&#228;ftigt sich mit dem DOM (Document Object Model) mit dem Elemente einer Seite dynamisch manipuliert, entfernt oder hinzugef&#252;gt werden k&#246;nnen.<br />
Es lohnt sich da mal einen Blick drauf zu werfen da dort Grundlagen erl&#228;utert werden:</p>
<ul>
<li>Mastering Ajax, Part1: <a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro1/">Introduction to Ajax</a></li>
<li>Mastering Ajax, Part2: <a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro2/">Make asynchronous requests with JavaScript and Ajax</a></li>
<li>Mastering Ajax, Part3: <a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro3/">Advanced requests and responses in Ajaxy</a></li>
<li>Mastering Ajax, Part4: <a href="http://www.ibm.com/developerworks/web/library/wa-ajaxintro4/">Exploiting DOM for Web response</a></li>
</ul>
<p>Ein weiterer interessanter Artikel developerWorks &#252;ber Ajax aber mit serverseitigem Java ist &#8220;<a href="http://www.ibm.com/developerworks/library/j-ajax1/">Ajax for Java developers: Build dynamic Java applications</a>&#8220;.</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2006/03/html-javascript-dom-und-ajax-bei-ibm-developerworks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Die Drag and Drop Komponente der Yahoo! User Interface Library</title>
		<link>http://webthreads.de/2006/03/einfuehrung-in-die-drag-and-drop-komponente-der-yahoo-user-interface-library/</link>
		<comments>http://webthreads.de/2006/03/einfuehrung-in-die-drag-and-drop-komponente-der-yahoo-user-interface-library/#comments</comments>
		<pubDate>Wed, 01 Mar 2006 09:36:58 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Yahoo! UI Library]]></category>

		<guid isPermaLink="false">http://www.webthreads.de/index.php/2006/03/01/einfuehrung-in-die-drag-and-drop-komponente-der-yahoo-user-interface-library/</guid>
		<description><![CDATA[Eine kleine Einf&#252;hrung in die Drag and Drop Komponente der Yahoo! User Interface (UI) Library. In diesem kleinen Tutorial soll gezeigt werden wie man einem HTML Block-Element mit Hilfe der Yahoo! User Interface Library sehr einfach eine Drag und Drop F&#228;higkeit geben kann. Als zweites Beispiel soll ein Fenster mit Kopf und Content Bereich erstellt [...]]]></description>
			<content:encoded><![CDATA[<p>Eine kleine Einf&#252;hrung in die <a href="http://developer.yahoo.net/yui/dragdrop/index.html">Drag and Drop Komponente</a> der <a href="http://developer.yahoo.net/yui/index.html">Yahoo! User Interface (UI) Library</a>.</p>
<p>In diesem kleinen Tutorial soll gezeigt werden wie man einem HTML Block-Element mit Hilfe der Yahoo! User Interface Library sehr einfach eine Drag und Drop F&#228;higkeit geben kann. Als zweites Beispiel soll ein Fenster mit Kopf und Content Bereich erstellt werden, dass sich nur durch den Fensterkopf bewegen l&#228;sst. Die drei implementierten Beispiele k&#246;nnen auch direkt von der <a href="http://www.webthreads.de/tutorials/060228_YahooUIDragDrop_Introduction/">&#220;bersichtsseite</a> aus aufgerufen werden.<br/><br />
Gliederrung:</p>
<p >
<ul class="subPostMenu">
<li><a href="#GenerellesVorgehen">Genrelles Vorgehen Yahoo! UI Library</a></li>
<li><a href="#YahooDragundDrop">Yahoo! Drag und Drop Komponente</a>
<ol class="subSubPostMenu">
<li><a href="#DragundDropKlasseDD">Drag und Drop mit der Klasse <span class="code">DD</span></a> (<a href="http://www.webthreads.de/tutorials/060228_YahooUIDragDrop_Introduction/yahoo_dd_ex1.html">Beispiel 1</a>)</li>
<li><a href="#DragundDropKlasseDDProxy">Drag und Drop mit der Klasse <span class="code">DDProxy</span></a> (<a href="http://www.webthreads.de/tutorials/060228_YahooUIDragDrop_Introduction/yahoo_dd_ex2.html">Beispiel 2</a>)</li>
<li><a href="#DragundDropWindow">Eigene Drag und Drop Klasse schreiben &#8211; Drag und Drop Fenster</a> (<a href="http://www.webthreads.de/tutorials/060228_YahooUIDragDrop_Introduction/yahoo_dd_ex3.html">Beispiel 3</a>)</li>
</ol>
</li>
<li><a href="#Fazit">Fazit</a>
</ul>
</p>
<p><br/><br />
<strong id="GenerellesVorgehen">Generelles Vorgehen mit der Yahoo! User Interface Library</strong></p>
<p>
Yahoo! liefert in seinem Download neben den Javascript Dateien viele Beispiele aus denen hervorgeht wie die UI Library zu nutzen ist. Daher wird an dieser Stelle nicht auf jedes Detail eingegangen sondern nur das notwendigste erl&#228;utert. Zudem liefert Yahoo! zu der UI LIbrary eine <a href="http://jsdoc.sourceforge.net/">JSDoc</a> Dokumentation mit, in der alle Methoden noch einmal dokumentiert sind.</p>
<p>Generell muss immer die <span class="code">YAHOO.js</span> an erster Stelle inkludiert werden um den globalen Namespace f&#252;r die YAHOO! UI Library bekannt zu machen. Ist diese nicht nicht an erster Stelle oder &#252;berhaupt nicht inkludiert werden die Klassen von Yahoo! nicht gefunden. An dieser Stelle sei kurz erw&#228;hnt, dass die Yahoo! UI Library Namespaces unterst&#252;tzt und man somit Namen f&#252;r Klassen oder Funktionen unter verschiedenen Namespaces mehrfach verwenden kann.</p>
<p>Als weitere Grundelemente m&#252;ssen die Yahoo! Javascript Dateien f&#252;r das Event Handling und f&#252;r die Dom Manupulationen inkludiert werden. Es wird in diesem Artikel nur kurz auf das Event Handling aber nicht weiter auf die Funktionalit&#228;t und M&#246;glichkeiten f&#252;r die DOM Manipulation eingegangen.</p>
<pre><code>&lt;script type="text/javascript" src="js/yahoo/YAHOO.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="js/yahoo/event.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="js/yahoo/dom.js"&gt;&lt;/script&gt;
</code></pre>
<p><br/><br />
<strong id="YahooDragundDrop">Yahoo! Drag and Drop Komponente</strong></p>
<p>
Um die Drag und Drop Komponente zu nutzen muss die Javascript Datei <span class="code">dragdrop.js</span> inkludiert werden:</p>
<pre><code>&lt;script type="text/javascript" src="js/yahoo/dragdrop.js"&gt;</code></pre>
<p>Diese Javascript Datei definiert die verschiedenen Drag und Drop Klassen. Unter anderem die Oberklasse <a href="http://developer.yahoo.net/yui/dragdrop/docs/YAHOO.util.DragDrop.html"><span class="code">DragDrop</span></a> und die konkreten Implementierungen <a href="http://developer.yahoo.net/yui/dragdrop/docs/YAHOO.util.DD.html"><span class="code">DD</span></a> sowie deren Unterklasse <a href="http://developer.yahoo.net/yui/dragdrop/docs/YAHOO.util.DDProxy.html"><span class="code">DDProxy</span></a>, welche hier genauer angesehen werden.
</p>
<p style="text-decoration: underline" id="DragundDropKlasseDD">Einfaches Drag und Drop mit der Klasse DD</p>
<p>Die Klasse <span class="code">DD</span> stellt die grunds&#228;tzliche Drag und Drop Funktionalit&#228;t zur Verf&#252;gung. Wenn man eine Instanz der Klasse erstellt &#252;bergibt man die Id eines HTML Block-Elements. Dieses verlinkte HTML Block-Element folgt dem Mauszeiger w&#228;hrend einer Drag-Aktion. Als Beispiel wurde ein <span class="code">&lt;div&gt;</span> Element erstellt welches 100&#215;100 Pixel gro&#223; ist. Dieses HTML Element wird mit einer Id versehen, welches einer Instanz der Klasse <span class="code">DD</span> bei dem Erstellen &#252;bergeben wird:</p>
<pre><code>&lt;div id="dragDropDiv" class="dragDiv"&gt;
  My drag and drop div.
&lt;/div&gt;
</code></pre>
<p>Bei einigen Versuchen hat sich gezeigt, dass als Stylesheet zwingend <span class="code">position</span> gesetzt werden muss. Dabei ist es vorerst egal ob mit dem Wert <span class="code">relative</span> oder <span class="code">absolute</span>. Wenn dies nicht gesetzt ist wird sich das Block-Element bei einer Drag-Aktion nicht bewegen. Daher ist im folgenden auch noch das Listing der Stylesheet Klasse:</p>
<pre><code>&lt;style type="text/css"&gt;
  .dragDiv {
    position: relative;
    width: 100px;
    height: 100px;
    background-color: #63FBDC;
    cursor: move;
  }
&lt;/style&gt;</code></pre>
<p>Der dazugeh&#246;rige Javascript Code um ein Drag und Drop (<span class="code">DD</span>) Objekt zu erstellen ist der folgende:</p>
<pre><code>&lt;script type="text/javascript" language="Javascript"&gt;
  var dragElement = new YAHOO.util.DD("dragDropDiv");
&lt;/script&gt;
</code></pre>
<p>Generell w&#228;re das schon ausreichend um das HTML div Element mit der Id <span class="code">dragDropDiv</span> die Drag und Drop Funktionalit&#228;t zu geben. Aber wichtig zu beachten ist, dass das HTML Block-Element erst nach dem gesamten Laden der Seite im DOM zur Verf&#252;gung steht. So wird allein mit diesem Javascript Code leider noch nichts funktionieren. Es gibt f&#252;r dieses Problem zwei L&#246;sungen. Die eine ist, den Javascript Code an das untere Ende, nachdem das Div Element definiert wurde, zu verlagern und auszuf&#252;hren. Das w&#252;rde funktionieren ist aber meiner Meinung nach nicht die eleganteste L&#246;sung. Eine sch&#246;nere L&#246;sung ist, das Erstellen des Drag und Drop Objektes in eine <span class="code">init</span> Methode auszulagern und diese Methode nach dem Laden der HTML Seite mit der <span class="code">&lt;body onload=&#8221;"&gt;</span> Parameter aufzurufen.<br />
An dieser Stelle bietet es sich an, ein weiteres Feature der Yahoo! UI Library, n&#228;mlich das Event Handling, zu nutzen. Mit UI Library ist es m&#246;glich zu definieren welche Methode bei welchen Event aufgerufen werden soll.<br />
In diesem Beispiel wird die <span class="code">init()</span> Methode bei dem Event <span class="code">load</span> aufgerufen:</p>
<pre><code>&lt;script type="text/javascript" language="Javascript"&gt;
  // global variables
  var dragElement;

  /**
   * Initialize all needed objects here.
   */
  function init() {
    dragElement = new YAHOO.util.DD("dragDropDiv");
  }

  /**
   * Add an listener for onload() method of this window.YAHOO
   * When this method will be called our method init will be invoked.
   */
  YAHOO.util.Event.addListener(window, 'load', init);
&lt;/script&gt;</code></pre>
<p>Mit dem Erstellen dieses Javascript Codes ist auch schon das erste Ergebnis zu sehen: <a href="http://www.webthreads.de/tutorials/060228_YahooUIDragDrop_Introduction/yahoo_dd_ex1.html">Beispiel 1</a>.</p>
<p>Wenn man nun den ersten Abschnitt auf das wesentliche zusammenk&#252;rzt, so ist zu erkennen, dass man mit Hilfe der Yahoo! UI Library in 5 Zeilen eine Drag und Drop Funktionalit&#228;t seiner HTML Seite hinzuf&#252;gen kann.</p>
<p style="text-decoration: underline" id="DragundDropKlasseDDProxy">Die Klasse DDProxy</p>
<p>Worin liegt nun der Unterschied zwischen der Klasse <span class="code">DD</span> und <span class="code">DDProxy</span>? Tats&#228;chlich gibt es bis auf die Darstellung des Block-Elements w&#228;hrend der Drag-Aktion<br />
keinen Unterschied. Die zwei verbreitesten Darstellungsm&#246;glichkeiten der Drag-Atkion sind durch die Klassen <span class="code">DD</span> und <span class="code">DDProxy</span> gegeben. W&#228;hrend die Klasse <span class="code">DD</span> ein ganzes Objekt mit der Bewegung des Cursers mitnimmt und dies auch so visuell dargestellt wird, ist bei der Klasse <span class="code">DDProxy</span> nur ein Rahmen des Elements zu sehen, w&#228;hrend das original Element an seinem Ausgangspunkt stehen bleibt solange die Drag-Aktion durchgef&#252;hrt wird.<br />
Als implementiertes Beispiel kann die Erweiterung des ersten Beispiels eingesehen werden: <a href="http://www.webthreads.de/tutorials/060228_YahooUIDragDrop_Introduction/yahoo_dd_ex2.html">Beispiel 2</a>.</p>
<p style="text-decoration: underline" id="DragundDropWindow">Eigene Drag und Drop Klassen erstellen</p>
<p>Oft reicht eine vorgegebene Funktionalit&#228;t nicht aus oder diese soll nur ein wenig erweitert werden. In dem folgendem Beispiel soll ein Fenster mit Kopf und Content-Bereich erstellt werden. Das Fenster soll dabei nur &#252;ber den Kopfbereich die Drag und Drop Funktionalit&#228;t zug&#228;nglich machen. Des weiteren soll w&#228;hrend der Drag-Aktion eine andere Styleclass verwendet werden.<br />
Um das Verhalten oder Eigenschaften einer bestehenden Drag und Drop Klasse zu beeinflussen kann sie &#252;berschrieben werden. Tats&#228;chlich ist es in Javascript m&#246;glich Objektorientiert zu arbeiten.<br />
In diesem Beispiel wird eine neue Klasse <span class="code">ddParent</span> erstellt, die von der Klasse <span class="code">DD</span> erbt. Diese Klasse soll in dem Konstruktur die Id des Kopf-divs &#252;bergeben bekommen und dabei den parent-div als Drag und Drop Element an die Oberklasse weitergeben. Dabei soll aber nicht die gesamte parent-div Fl&#228;che als m&#246;gliche Drag-Aktion Initiator genutzt werden sondern lediglich die Kopfzeile. In dem folgenden Javascript Ausschnit ist die Vererbung sowie das Setzen der eben beschriebenen Konfiguration zu sehen:</p>
<pre><code>function ddParent(id, sGroup, onDragStyleClass, onStopStyleClass) {

  if (id) {
    // get parent id (window block element) and store it
    this.parentId = document.getElementById(id).parentNode.id;
		
    // invoke init method from superclass with parent id to set parent as
    // drag and drop element
    this.init(this.parentId);
		
    // Set a child element of set element in init method which should be
    // used to initiate the drag operation. In this case the given id
    // vi constructor (window head element) should be initiat the drag operation.
    this.setHandleElId(id);
		
    // css style to use when items are not being hovered over.
    this.onDragClass = onDragStyleClass;

    // css style to use when hovered over
    this.onStopClass = onStopStyleClass;
    }
}

// extend from class DD
ddParent.prototype = new YAHOO.util.DD();
</code></pre>
<p>Besonders interessant an dem obigen Javascript Code ist der Aufruf der Methode <span class="code">this.setHandleElId(id);</span>. Mit diesem Aufruf kann das Element gesetzt werden, dass benutzt werden soll um eine Drag-Aktion zu starten (Drag Handler). Konkret bedeutet das, dass erst auf den Event reagiert wird wenn der definierte Drag Hanlder selektiert wird. Mit diesem Aufruf ist in dem Beispiel gew&#228;hrleistet, dass nur der Kopf f&#252;r die Drag und Drop Aktion genutzt werden kann.</p>
<p>Anschlie&#223;end sollen noch die &#252;bergebnen css Style Klassen bei dem Starten und dem Stoppen der Drag-Aktion gewechselt werden. Dazu werden die Methoden <a href="http://developer.yahoo.net/yui/dragdrop/docs/YAHOO.util.DragDrop.html#startDrag"><span class="code">startDrag</span></a> und <a href="http://developer.yahoo.net/yui/dragdrop/docs/YAHOO.util.DragDrop.html#endDrag"><span class="code">endDrag</span></a> &#252;berschrieben. Die Methode <span class="code">startDrag</span> wird aufgerufen sobald eine Drag-Aktion startet und die Methode <span class="code">endDrag</span> wenn die Drag-Aktion aufgeh&#252;rt hat. In diesem Beispiel soll die CSS Style Klasse f&#252;r das gesamte <span class="code">div</span> gewechselt werden, daher kann die Methode <span class="code">this.getEl()</span> aufgerufen werden. Wenn zum Beispiel nur das <span class="code">div</span> f&#252;r den Kopf des Fensters gewechselt werden soll, dann m&#252;sste das HTML-Element &#252;ber die id des Kopf Elements (<span class="code">YAHOO.util.DDM.getElement(this.id)</span>) geholt werden.</p>
<pre><code>/**
   * Method will be called after drag and drop object is clicked.
   * Set given onDragClass as style class.
   */
  ddParent.prototype.startDrag = function(x, y) {
    var el = this.getEl();
    el.className = this.onDragClass;
  }

  /**
   * Method will be called when done dragging.
   * Set given onStopClass style class.
   */
  ddParent.prototype.endDrag = function(e) {
    var el = this.getEl();
    el.className = this.onStopClass;
  };
</code></pre>
<p>Die CSS Klassen werden auf der HTML Seite direkt definiert und werden beim instanziieren der <span class="code">ddParent</span> Klasse im Konstruktur &#252;bergeben. Die f&#252;r das <span class="code">div</span>-Fenster definierten CSS Klassen sind die folgenden:</p>
<pre><code>&lt;style type="text/css"&gt;
  .winDiv {
    position: relative;
    width: 400px;
    height: 350px;
    background-color: #63FBDC;
  }
  .onDragWindow {
    position: relative;
    width: 400px;
    height: 350px;
    background-color: #2693F2;
  }
  .winDivHeader {
    height: 25px;
    padding: 4px 0px 0px 5px; /* oben rechts unten links */
    background-color: #888888;
    font-size: 12px;
    font-weight: bold;
    cursor: move;
  }
  .windDivContent {
    font-size:10px;
    padding-left:5px;
  }
&lt;/style&gt;
</code></pre>
<p>Das Erstellen des Drag und Drop Objektes gestaltet sich wie schon bei dem zwei ersten Beispielen bis auf die erweiterten &#252;bergabeparameter f&#252;r den Konstruktor:</p>
<pre><code>&lt;script type="text/javascript" language="Javascript"&gt;
  // global variables
  var dragElement;
		
  function init() {
    // Constructor parameter are: 
    // 'id', 'group', 'css style when dragging', 'css style when not dragged'
    dragElement = new ddParent("windowHeader", "", "onDragWindow", "winDiv");
  }

  YAHOO.util.Event.addListener(window, 'load', init);	
&lt;/script&gt;
</code></pre>
<p>Das Beispiel dazu kann hier angesehen werden: <a href="http://www.webthreads.de/tutorials/060228_YahooUIDragDrop_Introduction/yahoo_dd_ex3.html">Beispiel 3</a>.</p>
<p><br/><br />
<strong id="Fazit">Fazit</strong></p>
<p>Diese drei Beispiele zeigen wie einfach Drag und Drop in eine HTML Seite mit Hilfe der Yahoo! User Interface Library einzubinden ist. Zudem wurde gezeigt wie eine Klasse f&#252;r eigene Zwecke abgeleitet und erweitert werden kann. In den von Yahoo mitgelieferten Beispielen kann man noch weitaus komplexere Beispiele finden. Auch im Zusammenspiel mit Animationen oder anderen Komponenten kann noch einiges erreicht werden. Da ist also noch viel Spielraum f&#252;r Beispiele =).</p>
<p>Die drei implementierten Beispiele k&#246;nnen auch direkt von der <a href="http://www.webthreads.de/tutorials/060228_YahooUIDragDrop_Introduction/">&#220;bersichtsseite</a> aus aufgerufen werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://webthreads.de/2006/03/einfuehrung-in-die-drag-and-drop-komponente-der-yahoo-user-interface-library/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

