<?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>Kau-Boys blog &#187; JavaScript</title>
	<atom:link href="http://kau-boys.de/tag/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://kau-boys.de</link>
	<description>Webdevelopment and more</description>
	<lastBuildDate>Fri, 16 Mar 2012 19:15:48 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Pac-Man auf Google weiterhin online mit Zweispielermodus</title>
		<link>http://kau-boys.de/929/allgemein/pac-man-auf-google-weiterhin-online-mit-zweispielermodus?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pac-man-auf-google-weiterhin-online-mit-zweispielermodus</link>
		<comments>http://kau-boys.de/929/allgemein/pac-man-auf-google-weiterhin-online-mit-zweispielermodus#comments</comments>
		<pubDate>Mon, 24 May 2010 13:30:21 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=929</guid>
		<description><![CDATA[Google hatte bereits angekündigt, dass das Pac-Man Logo nicht wie sonst nur 24 Stunden, sondern 48 Stunden online sein wird, da es zu cool ist um nach einem Tag schon wieder zu verschwinden. Es ist auch weiterhin im Zweispieler-Modus spielbar, wobei man zum Starten des Zweispielmodus einfach auf die &#8220;Insert Coin&#8221; Schaltfläche klicken muss: Quelle: [...]]]></description>
			<content:encoded><![CDATA[<p>Google hatte bereits angekündigt, dass das Pac-Man Logo nicht wie sonst nur 24 Stunden, sondern 48 Stunden online sein wird, da es zu cool ist um nach einem Tag schon wieder zu verschwinden. Es ist auch weiterhin im Zweispieler-Modus spielbar, wobei man zum Starten des Zweispielmodus einfach auf die &#8220;Insert Coin&#8221; Schaltfläche klicken muss:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2010/05/pacman-2-player.png" alt="Pac-Man Zweispieler Modus" title="Pac-Man Zweispieler Modus" style="width: 554px; height: 186px;" class="aligncenter size-full wp-image-930" /><br />
<a href="http://www.google.com/pacman/">Quelle: Google</a></p>
<p><span id="more-929"></span></p>
<p>Ihr könnt ja mal versuchen &#8220;stereo&#8221; zu spielen. Sofern man den Pac-Man und die Pac-Woman (oder wie man den zweiten Spieler nennt) immer auf der Seite lässt, mit dessen Hand man ihn steuern ist das garnicht man so schwer. Nachdem ich heute mal mehr als die ersten beiden Levels gespielt habe (wobei sich natürlich das Logo nicht ändert), habe ich auch eine Zwischensequenz gesehen:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2010/05/pacman-bridge.png" alt="Pac-Man Zwischensequenz" title="Pac-Man Zwischensequenz" width="553" height="186" class="aligncenter size-full wp-image-931" /><br />
<a href="http://www.google.com/pacman/">Quelle: Google</a></p>
<p>Die Bilder zur Zwischensequenz sind mir auch schon im <a href="http://de.wikipedia.org/wiki/Sprite_%28Computergrafik%29">Sprite</a> zum Spiel aufgefallen, welches <a href="http://www.google.com/logos/pacman10-hp-sprite-2.png">alle Bildelemente</a> enthält.</p>
<p>Wer das Spiel auch jetzt noch einmal spielen möchte, kann es unter folgendem Link noch immer erreichen: <a href="http://www.google.com/pacman/">http://www.google.com/pacman/</a>.</p>
<p>Wie lange das Spiel dort noch zur Verfügung stehen wird kann ich euch aber leider nicht sagen. Also am besten gleich mal ausprobieren, wer das Spiel die letzen beiden Tage auf Google verpasst hat.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/929/allgemein/pac-man-auf-google-weiterhin-online-mit-zweispielermodus/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eilmeldung: Pac-Man bei Google</title>
		<link>http://kau-boys.de/921/allgemein/eilmeldung-pac-man-bei-google?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=eilmeldung-pac-man-bei-google</link>
		<comments>http://kau-boys.de/921/allgemein/eilmeldung-pac-man-bei-google#comments</comments>
		<pubDate>Fri, 21 May 2010 17:25:44 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=921</guid>
		<description><![CDATA[Eigentlich hatte ich für heute schon einen tollen Artikel fertig. Aber gerade habe ich erfahren, dass es heute bei Google ein geniales Logo gibt. Heute ist der 30. Geburtstag von Pac-Man (gut eigentlich ist er morgen am 22. Mai, aber da Pac-Man in Japan erfunden wurde, ist er bei uns schon jetzt). Google hat sich [...]]]></description>
			<content:encoded><![CDATA[<p>Eigentlich hatte ich für heute schon einen tollen Artikel fertig. Aber gerade habe ich erfahren, dass es heute bei Google ein geniales Logo gibt. Heute ist der 30. Geburtstag von Pac-Man (gut eigentlich ist er morgen am 22. Mai, aber da Pac-Man in Japan erfunden wurde, ist er bei uns schon jetzt). Google hat sich das mal wieder zum Anlass genommen ein Logo dafür zu erstellen:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2010/05/pacman.png" alt="Google Logo zum 30 Geburtstag von Pac-Man" title="Google Logo zum 30 Geburtstag von Pac-Man" style="width: 554px; height: 186px;" class="aligncenter size-full wp-image-923" /><br />
<a href="http://www.google.de">Quelle: Google</a><br />
<span id="more-921"></span></p>
<p>Das alles wäre aber keinen Blogartikel wert, denn es kommt ja bestimmt einmal spätestens alle 14 Tage vor, dass Google solch ein Logo auf seiner Startseite hat. Das geniale am heutigen Logo ist aber, dass das Logo nicht nur ein Bild ist, sondern SPIELBAR ist. Gesteuert wird es mit den Cursor-Tasten:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2010/05/pacman-game.png" alt="Spielbares Pac-Man auf der Google Homepage" title="Spielbares Pac-Man auf der Google Homepage" style="width: 554px; height: 186px;" class="aligncenter size-full wp-image-924" /><br />
<a href="http://www.google.de">Quelle: Google</a></p>
<p>Der absolute Hammer ist aber, wie das ganze umgesetzt ist. Man würde hier natürlich als erstes auf Flash tippen. Aber nein, Google wäre ja nicht einer der Pioniere des modernen Internets, wenn sie sich nicht etwas Besseres einfallen lassen. Das gesamte Spiel besteht aus HTML-Quellcode. So ist jeder Punkt, der aufgefressen werden kann ein DIV mit einer Hintergrundfarbe. Jedes dieser DIVs ist absolut positioniert. Wenn er aufgefressen wurde, wird er per CSS und &#8220;display: none;&#8221; ausgeblendet. </p>
<p>Zur Spielsteuerung wird eine ca. 60kb große JavaScript-Datei verwendet, die sogar die Ausgabe des kultigen Sounds ermöglicht. Alles in allem eine wirklich gelungene Aktion von Google und ein Beweis dafür, die viel man in heutigen Zeiten ohne den Einsatz von Flash in einem Browser tun kann.</p>
<p>Was haltet ihr von der Aktion? Wie viele Levels habt ihr geschafft? Passiert etwas Tolles ab einem bestimmten Level? Kommentare sind wie immer gern gesehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/921/allgemein/eilmeldung-pac-man-bei-google/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tutorial: Drag-and-Drop mit Scriptaculous – Teil 2: Droppables</title>
		<link>http://kau-boys.de/830/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables</link>
		<comments>http://kau-boys.de/830/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables#comments</comments>
		<pubDate>Mon, 15 Mar 2010 15:29:16 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=830</guid>
		<description><![CDATA[Nachdem wir uns in Teil 1 des Tutorials mit der Draggable Klasse beschäftigt haben, wenden wir uns heute seinem Bruder der Droppables Klasse zu. Mit ihr können wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufkörbe auf Online-Shops. Ich möchte daher einen einfachen Einkaufswagen demonstieren. Der Quellcode für dieses Beispiel Zuerst einmal wieder [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem wir uns in <a href="http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable">Teil 1 des Tutorials</a> mit der <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">Draggable Klasse</a> beschäftigt haben, wenden wir uns heute seinem Bruder der <a href="http://wiki.github.com/madrobby/scriptaculous/droppables">Droppables Klasse</a> zu. Mit ihr können wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufkörbe auf Online-Shops. Ich möchte daher einen einfachen Einkaufswagen demonstieren.</p>
<h2>Der Quellcode für dieses Beispiel</h2>
<p>Zuerst einmal wieder der Quellcode für dieses Beispiel. Ich werde wie auch schon im ersten Teil des Tutorials die wichtigen Zeilen etwas genauer erklären. Die Zeilen 1-34 enthalten das grundlegende Gerüst der HTML-Seite sowie die Stylesheets, auf die ich nicht näher eingehen möchte:</p>
<p><span id="more-830"></span></p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; dir=&quot;ltr&quot; lang=&quot;de-DE&quot;&gt;
&lt;head&gt;
	&lt;head&gt;
		&lt;title&gt;Drag-and-Drop Part 2&lt;/title&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;prototype.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;scriptaculous.js&quot;&gt;&lt;/script&gt;
		&lt;style type=&quot;text/css&quot;&gt;
			.item {
				padding: 40px;
				border: 1px solid #000;
				cursor: move;
				display: inline-block;
				margin-right: 20px;
			}
			.blue {
				background-color: #39c;
			}
			.green {
				background-color: #292;
			}
			div#shopping_cart {
				width: 180px;
				height: 180px;
				background: #fff;
				border: 5px solid #ccc;
			}
			div#shopping_cart.hover {
				border: 5px dashed #aaa;
			}
		&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;h1&gt;Drag-and-Drop&lt;/h1&gt;
		&lt;div id=&quot;blue_box&quot; title=&quot;Blaue Box&quot; class=&quot;item blue&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;green_box&quot; title=&quot;Grüne Box&quot; class=&quot;item green&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;shopping_cart&quot;&gt;
			&lt;ul id=&quot;items_in_cart&quot;&gt;&lt;/ul&gt;
		&lt;/div&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			new Draggable('blue_box', {
				revert: true
			});
			new Draggable('green_box', {
				revert: true
			});
			Droppables.add('shopping_cart', {
				onDrop: addItem,
				hoverclass: 'hover'
			});
			function addItem(dragged, dropped, event){
				var itemCount = $('items_in_cart').select('li[id=&quot;item' +
									dragged.id + '&quot;] span').first();
				if(itemCount == undefined){
					$('items_in_cart').insert({
						bottom: '&lt;li id=&quot;item' + dragged.id +
								'&quot;&gt;&lt;span&gt;1&lt;/span&gt;x ' + dragged.title + '&lt;/li&gt;'
					});
				} else {
					itemCount.update(parseInt(itemCount.innerHTML) + 1);
				}
			}
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>In den Zeilen 35-39 sind zwei einfache &#8220;Artikel&#8221; aufgeführt (in unserem Fall einfache farbige DIVs) sowie der &#8220;Warenkorb&#8221;, der eine leere unsortierte Liste enthält. In diese fügen wir dann per Drag-and-Drop die Waren ein. Sehen wir uns nun aber den interessanten Teil des Quellcodes an, das JavaScript. Die Zeilen 41-46 sollten aus dem ersten Teil des Tutorials bekannt sein. Wir erzeugen hier zwei Draggables wobei wir die Option <code>reset</code> auf <code>true</code> setzen, damit die Artikel beim &#8220;loslassen&#8221; wieder auf ihre ursrpüngliche Position zurückkehren. Nun aber zum neuen Teil der Droppables-Klasse:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
Droppables.add('shopping_cart', {
	onDrop: addItem,
	hoverclass: 'hover'
});
</pre>
<p>Wichtig ist hier, dass wir keine Instanz der Klasse durch das Schlüsselwort <code>new</code> erzeugen. Es existiert vielmehr schon eine Instanz, der wir mit der <code>add()</code> Funktion eine neue &#8220;Drop-Zone&#8221; hinzufügen. Es ist also möglich mehrere Bereiche einer Website für die Reaktion auf Draggables zu verwenden. Es wäre z.B. möglich einen &#8220;Papierkorb&#8221; einzurichten, mit dem man einenen bereits hinzugefügten Artikel wieder aus der Liste entfernen kann bzw. dessen Anzahl verringern.</p>
<p>Der add() Funktion können auch mehrere Optionen übergeben werden, welche das sind könnt ihr in der <a href="http://wiki.github.com/madrobby/scriptaculous/droppables">API zu Droppables</a> nachlesen. Ich verwende hier die <code>hoverClass</code> Option, die der &#8220;Drop-Zone&#8221; eine Klasse zu weist, wenn der Benutzer mit einem Draggable darüber steht. Zusätzliche gebe ich eine Callback-Funktion für das <code>onDrop</code> Event an. Wie ihr der Funktion <code>addItem()</code> entnehmen könnte, bekommt die <code>onDrop()</code> Funktion eine Referenz auf das aufgenommene Elemente sowie auf die &#8220;Drop-Zone&#8221; und das Event selbst übergeben. In der Funktion selbst fügen wir den Artikel an die Liste an und setzen die Anzahl auf 1, sofern er noch nicht enthalten ist. Wenn er enthalten ist erhöhen wir dir Anzahl um 1.</p>
<h2>Das Beispiel</h2>
<p>Das oben beschriebene Beispiel sieht dann wie folgt aus (es darf aber gerne unter Verwendung von Bildern anstelle von DIVs und mehr CSS noch ansprechender gestaltet werden):</p>
<div id="blue_box" title="Blaue Box" style="padding: 40px; border: 1px solid #000; cursor: move; display: inline-block; margin-right: 20px; background-color: #39c;"></div>
<div id="green_box" title="Grüne Box" style="padding: 40px; border: 1px solid #000; cursor: move; display: inline-block; margin-right: 20px; background-color: #292;"></div>
<div id="shopping_cart" style="width: 180px; height: 180px; background: #fff; border: 5px solid #ccc;">
<ul id="items_in_cart">
<li style="display: none;">Warenkorb</li>
</ul>
</div>
<p><script type="text/javascript" src="http://kau-boys.de/wp-content/uploads/2010/03/part2.js"></script></p>
<p>Wie ihr also sehen könnt ist es sehr einfach ein Element für die Interaktion mit Draggables zu verwenden. Was ihr dabei mit den Elementen macht ist eurer Fantasie überlassen. Die Möglichkeiten sind schier unbegrenzt. Ich möchte euch also dazu animieren einfach einmal mit der Funktion zu experimentieren.</p>
<p>Das war es dann auch schon wieder mit diesem Teil des Tutorials. Im nächsten Teil sehen wir uns einen sehr speziellen Fall von Drag-and-Drop an und zwar mit dem Sortieren von Elementen. Wie einfach so etwas möglich ist und wie leicht sich die Sortierreihenfolge auslesen lässt, das erwartet euch in Teil 3 des Tutorials. Für welche Einsatzzwecke habt ihr bisher Draggables und Droppables genutzt? Über einen Kommentar dazu würde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/830/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tutorial: Drag-and-Drop mit Scriptaculous &#8211; Teil 1: Draggable</title>
		<link>http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable</link>
		<comments>http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable#comments</comments>
		<pubDate>Tue, 02 Mar 2010 16:38:32 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=785</guid>
		<description><![CDATA[Heute möchte ich mein angekündigtes Tutorial über Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel Öffentlich-rechtlich und vorbildhaft – So muss eine Web 2.0 zu Olympia aussehen vorgestellt habe. Da eine solche Seite mit vielen verschiedenen Techniken zusammengesetzt ist, werden wir immer kleine Teile auf [...]]]></description>
			<content:encoded><![CDATA[<p>Heute möchte ich mein angekündigtes Tutorial über Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel <a href="http://kau-boys.de/757/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen">Öffentlich-rechtlich und vorbildhaft – So muss eine Web 2.0 zu Olympia aussehen</a> vorgestellt habe. Da eine solche Seite mit vielen verschiedenen Techniken zusammengesetzt ist, werden wir immer kleine Teile auf dem Schritt zur fertigen Seite nachvollziehen.</p>
<p>Im ersten Teil geht es um die Grundlage einer Seite mit Drag-and-Drop. Wir verwenden für dieses Tutorial die Drag-and-Drop Funktionalität von <a href="http://script.aculo.us">Scriptaculous</a>, welches eine Erweiterung des <a href="http://www.prototypejs.org">Prototype Frameworks</a> ist. Um die hier gezeigten Funktionen selbst nachprogrammieren zu können benötigt ihr also zuerst einmal die beiden Frameworks.</p>
<p><span id="more-785"></span></p>
<h2>Der Quellcode für dieses Beispiel</h2>
<p>Beginnen wir also mit dem Beispiel. Zuerst einmal benötigen wir etwas HTML in dem wir ein Element platzieren, welches wir dann aufnehmen möchten. Für das Element nehme ich exemplarisch ein DIV, aber ihr könnt auch z.B. ein Bild verwenden:</p>
<pre class="brush: xml; title: ; notranslate">
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; dir=&amp;quot;ltr&amp;quot; lang=&amp;quot;de-DE&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;title&amp;gt;Drag-and-Drop Teil 1&amp;lt;/title&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;prototype.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;scriptaculous.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
		&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
			#draggable {
				width: 100px;
				height: 100px;
				padding: 30px;
				background-color: #39c;
				border: 1px solid #000;
				cursor: move;
			}
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;h1&amp;gt;Drag-and-Drop&amp;lt;/h1&amp;gt;
		&amp;lt;div id=&amp;quot;draggable&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
			new Draggable('draggable');
		&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
</pre>
<p>Wichtig für das Aktivieren der Draggable Funktion auf ein Element ist eine ID für das Element. Das DIV hat hier die ID &#8220;draggable&#8221;. Im Kopf werden die beiden JavaScript Dateien für Prototype und Scriptaculous eingebunden. Wichtig ist hierbei, dass zuerst Prototype eingebunden wird. Zusätzlich ist noch etwas CSS angegeben um dem DIV einen Rahmen und eine Hintergrundfarbe zu verpassen. Alles was nun notwendig ist, um das DIV aufnehmbar zu machen ist eine einzige Zeile JavaScript:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
new Draggable('draggable');
</pre>
<p>Es wird hier eine neue Instanz des <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">Draggable Objekts</a> erzeugt. Dem Konstruktor wird hierbei die ID des Elements übergeben, welches aufnehmbar sein soll.</p>
<h2>Ein Beispiel gefällig</h2>
<p>Da dieser Blog auch Prototype einsetzt, sollten wir es nicht bei einem Quellcode Auszug belassen, sondern einfach mal hier ein solches DIV einfügen. Also, hier kommt es:</p>
<div id="draggable" style="width: 100px; height: 100px; padding: 30px; background-color: #39c; border: 1px solid #000; cursor: move;"></div>
<p><script type="text/javascript">new Draggable('draggable')</script></p>
<p>Dieses DIV kann nun beliebig im Sichtbaren Bereich verschoben werden. Die Klasse bietet aber auch viele Optionen, die in einem Hash an die Funktion als zweiten Parameter übergeben werden können. Wir können z.B. die Bewegung eines Elements auf die horizontale beschränken und zusätzlich das Element beim &#8220;Loslassen&#8221; des Elements wieder auf seine ursprüngliche Position zurücksetzen. Der JavaScript Befehl dazu sieht wie folgt aus:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
new Draggable('draggable2', {constraint: 'horizontal', revert: true});
</pre>
<p>Ich habe hier die ID um eine Zwei erweitert, damit ich auch dieses Beispiel hier vorführen kann. Wichtig ist natürlich immer, dass ihr für die verschiedenen Elemente unterschiedliche IDs verwendet und niemals eine ID in zwei Instanzen verwendet. Das DIV verhält sich dann wie folgt:</p>
<div id="draggable2" style="width: 100px; height: 100px; padding: 30px; background-color: #292; border: 1px solid #000; cursor: move;"></div>
<p><script type="text/javascript">new Draggable('draggable2', {constraint: 'horizontal', revert: true})</script></p>
<p>Da es hier in diesem Tutorial nicht darum geht alle möglichen Optionen zu erklären möchte ich euch gerne auf die <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">API Referenz der Draggable Klasse</a> verweisen. Dort findet ihr eine Liste aller Optionen und einige weitere Beispiele.</p>
<p>Damit möchte ich auch schon den ersten Teil des Tutorials abschließen. Ihr solltet einfach einmal die verschiedenen Optionen ausprobieren um zu sehen, wie sich das DIV dabei verhält. Im zweiten Teil beschäftigen wir uns mit &#8220;dem Bruder&#8221; von Draggable. Dabei handelt es sich um die Droppables Klasse, die es ermöglicht ein aufgenommenes Element &#8220;einzufangen&#8221; und auf das Element zu reagieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Öffentlich-rechtlich und vorbildhaft &#8211; So muss eine Web 2.0 zu Olympia aussehen</title>
		<link>http://kau-boys.de/757/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen</link>
		<comments>http://kau-boys.de/757/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen#comments</comments>
		<pubDate>Tue, 23 Feb 2010 23:46:48 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=757</guid>
		<description><![CDATA[An dieser Stelle muss ich mal ein Lob loswerden. Zurzeit laufen ja die Olympischen Winterspiele in Vancouver und Whistler. Und natürlich ist die Präsenz im Web auch extrem hoch. Im Fernsehen sind die Spiele vor allem in ARD und im ZDF im Free-TV und bei den digitalen Kanälen der beiden Öffentlich-rechtlichen zu sehen. Das erwartet [...]]]></description>
			<content:encoded><![CDATA[<p>An dieser Stelle muss ich mal ein Lob loswerden. Zurzeit laufen ja die Olympischen Winterspiele in Vancouver und Whistler. Und natürlich ist die Präsenz im Web auch extrem hoch. Im Fernsehen sind die Spiele vor allem in ARD und im ZDF im Free-TV und bei den digitalen Kanälen der beiden Öffentlich-rechtlichen zu sehen. Das erwartet man auch, denn dafür zahlen wir ja auch brav unsere Gebühren.</p>
<p>Was man nicht unbedingt erwartet und was mich sehr überrascht hat ist der sehr gute Web 2.0 auftritt. Es ist immer sehr gut zu sehen, auf welchen Kanälen gerade etwas live zu sehen ist und was gerade für neue Entscheidungen gefallen sind. Außergewöhnlich ist allerdings, wie dynamisch sich die Seite an die eigenen Interessen anpassen lässt:</p>
<p><span id="more-757"></span></p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de_.png" title="Startseite von olympia.ard.de" class="thickbox"><img src="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de-small.png" title="Startseite von olympia.ard.de" alt="Startseite von olympia.ard.de" /></a><br />
<a href="http://olympia.ard.de/">Quelle: olympia.ard.de</a></p>
<p>Wie ihr auf dem ersten Screenshot sehen könnt können die verschiedenen Bereiche ausgelendet werden. Die Einstellungen werden hierbei in einem Cookie gespeichert, sodass die Einstellungen bei einem erneuten Besuch erhalten bleiben.</p>
<p>Eine andere Möglichkeit die Seite anzupassen besteht darin die verschiedenen Elemente per Drag-and-Drop zu verschieben. Dies geht genauso flüssig und unproblematisch wie man es auch von <a href="http://www.google.de/ig">iGoogle</a> oder ähnlichen Seiten gewohnt ist. Auch hier werden die Anordnungen in demselben Cookie gespeichert:</p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de-dd.png" title="Drag-and-Drop auf olympia.ard.de" class="thickbox"><img src="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de-dd-small.png" title="Drag-and-Drop auf olympia.ard.de" alt="Drag-and-Drop auf olympia.ard.de" /></a><br />
<a href="http://olympia.ard.de/">Quelle: olympia.ard.de</a></p>
<p>Ebenfalls sehr nett gemacht ist die Mediabox, die sehr an die Steuerung von diversen MP3-Playern mit Albumansicht erinnert. Einige Inhalte seinen außerdem erst dann geladen zu werden, sobald der Benutzer an die entsprechende Stelle scrollt.</p>
<p>Einige von euch werden sich jetzt fragen wieso ich einen solchen Artikel geschrieben habe. Einerseits um wirklich mal ein Lob an einen sehr guten Internet Auftritt loszuwerden. Andererseits aber auch um einen kleinen Überblick zu geben, was alles mit recht einfachen Mitteln möglich ist. Dem Quellcode konnte ich entnehmen, dass die ARD auf das <a href="http://mootools.net/">JavaScript-Framework MooTools</a> setzt.</p>
<p>Ich möchte diesen Artikel zum Einstieg für eine kleine Reihe rund um Drag-and-Drop Funktionen und andere oft gesehene Techniken zu nehmen. Im ersten Teil dieser Reihe werde ich auf die Grundlagen von Drag-and-Drop eingehen und diese am Beispiel des <a href="http://script.aculo.us/">Scriptaculous Frameworks</a> zeigen. Anschließend werden ich dann zeigen, wie man per Drag-and-Drop Elemente sortieren kann. In einem weiteren Teil geht es dann vermutlich um die Kombination der Sortierung mit AJAX.</p>
<p>Wer jetzt Lust bekommen hat sich das Ganze mal live anzusehen kann das auf der <a href="http://olympia.ard.de/">Olympia Website der ARD</a> tun. Und das ZDF? Ja, das möchte ich nicht unerwähnt lassen. Auch hier gibt es viele Informationen rund um die WM und auch Livestreams. Aber die Seite ich nicht so dynamisch wie die der ARD. Besser gelöst finde ich hier aber der Liveticker. Dieser bekommt zwar die gleichen Einträge wie der bei der ARD, aber er aktualisiert sich von selbst und stellt auch sehr schön die aktuellen Zwischenergebnisse dar. Er läuft bei mir zurzeit fast ständig im Hintergrund. Also auch hier solltet ihr auch mal die <a href="http://olympia.zdf.de/">Olympia Website des ZDF</a> ansehen.</p>
<p>Ich hoffe ihr freut euch auf die kleine Tutorialreihe. Ich würde mich aber auch über eure Kommentare zu den Websites freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/757/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Zeilen-Duplizierer mit AutoComplete Felder nutzen</title>
		<link>http://kau-boys.de/697/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zeilen-duplizierer-mit-autocomplete-felder-nutzen</link>
		<comments>http://kau-boys.de/697/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen#comments</comments>
		<pubDate>Wed, 17 Feb 2010 13:18:55 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=697</guid>
		<description><![CDATA[Ich bekam heute in einem Kommentar die Frage gestellt, ob mein Zeilen-Duplizierer aus dem Beitrag: Einfacher Zeilen-Duplizierer mit Prototype auch auf Feldern funktioniert, die die Scriptaculous Ajax.AutoCompleter Funktion verwenden. Ich nutze den Duplizierer selbst in einem Formular, das solche Felder enthält. Meine erste Fassung entsprach dabei dem Einzeiler aus dem vorherigen Beitrag. Das Problem dabei [...]]]></description>
			<content:encoded><![CDATA[<p>Ich bekam heute in einem Kommentar die Frage gestellt, ob mein Zeilen-Duplizierer aus dem Beitrag: <a href="http://kau-boys.de/196/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype">Einfacher Zeilen-Duplizierer mit Prototype</a> auch auf Feldern funktioniert, die die <a href="http://wiki.github.com/madrobby/scriptaculous/ajax-autocompleter">Scriptaculous Ajax.AutoCompleter</a> Funktion verwenden.</p>
<p>Ich nutze den Duplizierer selbst in einem Formular, das solche Felder enthält. Meine erste Fassung entsprach dabei dem Einzeiler aus dem vorherigen Beitrag. Das Problem dabei ist allerdings, dass die AutoCompleter Funktion beim Erzeugen mit dem Felder verknüpft wird, auf das sie angewendet werden soll. Wenn man nun dieses Feld kopiert wird nicht eine neue Instanz des Ajax.AutoCompleter erzeugt, sondern die Referenz auf das alte Feld mit kopiert. Ein Eintrag im neu erzeugten Feld aktiviert also die AutoCompleter Funktion des vorherigen Feldes.</p>
<p><span id="more-697"></span></p>
<p>Um dieses Problem zu lösen hatte ich die erweiterte Funktion mit den beiden Callback-Funktionen erstellt. Damit ist es möglich die Referenz zum vorherigen Feld zu lösen und eine neue Instanz des Ajax.AutoCompleter nach dem Erzeugen der Kopie zu erstellen. Hier aber zuerst noch einmal die Funktion selbst. Ich habe mittlerweile auch eine Option zum Fokussieren des ersten Feldes in der Kopie hinzugefügt:</p>
<pre class="brush: jscript; title: ; notranslate">
function addRow(selector, options){
	var lastRow = $$(selector).last();
	var newRow = lastRow.cloneNode(true);
	if (options.reset) {
		newRow.select('select', 'textarea', 'input').each(function(elm){
			elm.clear().checked = '';
		});
	}
	if(options.beforeInsert) options.beforeInsert(newRow);
	lastRow.insert({'after': newRow});
	if(options.afterInsert) options.afterInsert(newRow);

	if (options.focusFirst) {
		newRow.select('input', 'select', 'textarea').first().focus();
	}
}
</pre>
<p>Um die Ajax.Autocompleter Funktion nutzen zu können benötigt jedes Feld eine eindeutige ID. Nehmen wir also an, wir haben folgendes erstes Feld für unser Formular (hier ein Beispiel aus dem Artikel: <a href="http://kau-boys.de/364/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous">Google Maps Suggest – Adress-Autovervollständigung mit Scriptaculous</a>):</p>
<pre class="brush: xml; title: ; notranslate">
&lt;form id=&quot;addressform&quot; action=&quot;address_save.php&quot; class=&quot;niceform&quot;&gt;
	&lt;fieldset&gt;
		&lt;legend&gt;Choose an address&lt;/legend&gt;
		&lt;dl&gt;
			&lt;dt&gt;&lt;label for=&quot;address&quot;&gt;Address:&lt;/label&gt;&lt;/dt&gt;
			&lt;dd&gt;&lt;input type=&quot;text&quot; id=&quot;address&quot; name=&quot;address[]&quot; style=&quot;width: 300px;&quot; /&gt;&lt;/dd&gt;
		&lt;/dl&gt;
	&lt;/fieldset&gt;
	&lt;fieldset&gt;
		&lt;input type=&quot;submit&quot; value=&quot;Send!&quot; /&gt;
	&lt;/fieldset&gt;
&lt;/form&gt;
&lt;div id=&quot;adresse_choices&quot; class=&quot;autocomplete&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	new Ajax.Autocompleter('address', 'adresse_choices', 'get_addresses.php');
&lt;/script&gt;
</pre>
<p>Wichtig sind hierbei natürlich die eckigen Klammern am Ende des Name Attributs, damit auch alle kopierten Werte mitübertragen werden. Damit wir einer Kopie dieses Feldes eine neue Instanz hinzufügen können, müssen wir beim Kopieren auch die ID verändern. Dazu schreiben wir uns eine kleine Callback-Funktion, die genau das erledigt:</p>
<pre class="brush: jscript; title: ; notranslate">
function activateAutocomplete(newRow){
	var addressInput = $A(newRow.select('input')).first();
	addressInput.id += 1;
	addressInput.stopObserving();
	new Ajax.Autocompleter(addressInput.id, 'adresse_choices', 'get_addresses.php');
}
</pre>
<p>In der 2. Zeile selektieren wir das erste Element innerhalb der neuen Zeile (wir nehmen hier also an, dass es sich dabei um das AutoCompleter Feld handelt). Diesem fügen wir in der 3. Zeile zusätzlich zur ID eine 1 hinzu. Es entstehen also Felder nach dem Muster <code>"address1", "address11"</code> usw. Das reicht aus um die Felder genau zu referenzieren.<br />
In der 4. Zeile kommt die schon angesprochene Funktion zum Einsatz, die das Autocomplete für das Feld deaktiviert. Zu guter Letzt erzeugen wir eine neue Instanz des Ajax.Autocompleter. Wir können dabei als zweiten Parameter dasselbe DIV Element für die Vorschläge verwenden, da es ja nicht möglich ist, gleichzeitig in zwei Felder etwas einzutippen. Das DIV wird automatisch durch Scriptaculous unter das Feld positioniert, in dem es verwendet wird.</p>
<p>Damit das ganze nun auch dupliziert werden kann, fügen wir noch einen entsprechenden Link ein. Dieser muss dann die Callback-Funktion als zweiten Parameter in der Funktion erhalten. Ich verwende hier ein SPAN Element mit einem onclick Event. Es geht aber auch mit einem gewöhnlichen Link:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;span class=&quot;add&quot; onclick=&quot;addRow('#addressform dl', {reset : true, afterInsert: activateAutocomplete})&quot;&gt;Adresse hinzufügen&lt;/span&gt;
</pre>
<p>Es wird durch den Selektor <code>"#addressform dl"</code> die gesamte Definition inklusive des Label kopiert. Ihr könnt aber auch eine andere HTML Struktur wie z.B. eine unsortierte Liste verwenden.</p>
<p>Das war auch schon alles. Das Beispiel könnt ihr euch hier ansehen und auch den Quellcode dazu runterladen:</p>
<p class="aligncenter">
<a href="http://kau-boys.de/beispiele/google_maps_suggest/duplicate.html" class="awesome large breakerbay">Beispiel</a> <a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest_duplicate.zip" class="awesome large breakerbay" style="margin-left:20px;">Download</a>
</p>
<p>Ich hoffe, dass euch die erweiterte Anwendung gefallen hat und vielleicht auf neue Ideen gebracht hat. Wenn ihr eine andere Anwendung kennt, bei der Ihr nicht weiterkommt würde ich mich wie immer über einen Kommentar sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/697/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Blog oder Website fit machen für den IE6</title>
		<link>http://kau-boys.de/662/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=blog-oder-website-fit-machen-fuer-den-ie6</link>
		<comments>http://kau-boys.de/662/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6#comments</comments>
		<pubDate>Sat, 30 Jan 2010 16:22:32 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=662</guid>
		<description><![CDATA[Wie auf vielen News-Seiten zu lesen ist stellt Google ab Mitte des Jahres offiziell den Support für den Internet Explorer in der Version 6.0 ein. Unter den Besuchern meines Blog befindet sich zwar nur ein verschwindend geringer Prozentsatz an IE6 Nutzern, aber auch diese sollten meine Website einigermaßen ansehnlich präsentiert bekommen. Das größte Problem ist [...]]]></description>
			<content:encoded><![CDATA[<p>Wie auf vielen News-Seiten zu lesen ist stellt Google ab Mitte des Jahres offiziell den Support für den Internet Explorer in der Version 6.0 ein. Unter den Besuchern meines Blog befindet sich zwar nur ein verschwindend geringer Prozentsatz an IE6 Nutzern, aber auch diese sollten meine Website einigermaßen ansehnlich präsentiert bekommen.</p>
<p>Das größte Problem ist oft, dass die schönen Themes nicht auf den IE6 angepasst wurden und daher zu sehr unschönen Darstellungen führen. Ich habe in einer virtuellen Maschine noch eine Installation vom Internet Explorer 6 laufen und damit mal selbst meinen Blog getestet. Das Ergebnis sah leider wie folgt aus:</p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/01/vorher.png" class="thickbox" title="Blog vor der Installation des Plugins"><img src="http://kau-boys.de/wp-content/uploads/2010/01/vorher_small.png" alt="Blog vor der Installation des Plugins" title="Blog vor der Installation des Plugins" /></a></p>
<p><span id="more-662"></span></p>
<p>Wie ihr hier sehen könnt sind die transparenten PNG Bilder im IE6 nicht transparent, da dieser nur transparente GIF Bilder unterstützt. Viel schlimmer war aber, dass die Sidebar mit den Widgets komplett nach unten gerutscht war. Um das zu beheben hätte ich sehr viele Dinge im CSS Layout und vermutlich auch im HTML-Quellcode ändern müssen. Daher habe ich überlegt, was man stattdessen tun könnte.</p>
<h2>Die Lösung: Google Chrome Frame</h2>
<p>Schon vor längerer Zeit hatte ich etwas vom <a href="http://code.google.com/intl/de-DE/chrome/chromeframe/">Google Chrome Frame</a> gelesen, der die Webkit Rendering Engine und die JavaScript Engine des Chrome Browsers in den Internet Explorer bringt. Dazu muss der Benutzer lediglich ein Plugin für den Internet Explorer installieren und der Website-Betreiber muss dem Plugin mitteilen, dass der Inhalt automatisch damit gerendert werden soll.</p>
<h2>Den Browser zum Rendern mit dem Chrome Frame veranlassen</h2>
<p>Alles was der Website-Betreiber tun muss, ist folgenden Meta-Tag in seinen Quellcode einzufügen:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;chrome=1&quot; /&gt;
</pre>
<p>Das <code>X-UA-Compatible</code> Meta-Tag sorgt dafür, dass das Plugin aktiviert wird und der Benutzer den Inhalt richtig dargestellt bekommt, vorausgesetzt natürlich er hat es auch installiert. Um einen Benutzer des Internet Explorers dazu zu bewegen das Plugin zu installieren, hat Google ein kleines JavaScript-Snippet bereitgestellt, mit dem der Benutzer einen Link zur Download-Seite des Plugins bekommt:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js&quot;&gt;&lt;/script&gt;
&lt;div id=&quot;placeholder&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	CFInstall.check({
		node: &quot;placeholder&quot;,
		destination: &quot;http://www.waikiki.com&quot;
	});
&lt;/script&gt;
</pre>
<p>Damit die Aufforderung zum Download auch nur Benutzern des IE6 angezeigt wird, habe ich zusätzlich ein <a href="http://de.selfhtml.org/css/layouts/browserweichen.htm#alternative">Conditional Comment</a> benutzt, um das Snippet nur auf IE6 Benutzer anzuwenden, damit Benutzer des Internet Explorer 7 und höher keine Aufforderung bekommen. Außerdem müssen damit auch alle Nutzer eines andern Browsers nicht die JavaScript-Datei vom Google Server laden.</p>
<h2>Der Blog nach der Installation des Plugins</h2>
<p>Für diejenigen von euch, die etwas skeptisch sind, ob der ganze Aufwand lohnt, habe ich hier nun das &#8220;nachher&#8221; Bild, damit ihr sehen könnt, dass es wirklich funktioniert:</p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/01/nachher.png" class="thickbox" title="Blog nach der Installation des Plugins"><img src="http://kau-boys.de/wp-content/uploads/2010/01/nachher_small.png" alt="Blog nach der Installation des Plugins" title="Blog nach der Installation des Plugins" /></a></p>
<p>Wie ihr sehen könnt, sieht der Blog nun wieder richtig aus. Als kleinen Bonus des Plugins könnt ihr auch den Inspektor nutzen, wie man ihn von Chrome oder Safari gewöhnt ist. Aber die Besucher eures Blog werden das wohl eher nicht nutzen.</p>
<p>Ich hoffe, dass euch dieser Tipp helfen konnte. Mich würde interessieren, was ihr vom Google Chrome Frame haltet oder was für euch dagegen spricht. Hat ihn vielleicht jemand auch im Einsatz und schon echte Probleme oder Nachteile damit feststellen können? Über Kommentare würde ich mich wie immer sehr freuen &#8230; über ein baldiges Aussterben des IE6 aber noch viel mehr <img src='http://kau-boys.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/662/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Google Maps Suggest &#8211; Adress-Autovervollständigung mit Scriptaculous</title>
		<link>http://kau-boys.de/364/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous</link>
		<comments>http://kau-boys.de/364/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous#comments</comments>
		<pubDate>Tue, 06 Oct 2009 22:22:36 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=364</guid>
		<description><![CDATA[Viele nutzen Autovervollständigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zusätzlich kann sie dazu dienen, dass in einem Formular möglichst gültige Werte gespeichert werden. Selbstverständlich müssen alle Daten serverseitig erneut überprüft werden. Ich möchte heute zeigen, wie einfach es mit Scriptaculous möglich ist, eine Autovervollständigung mit [...]]]></description>
			<content:encoded><![CDATA[<p>Viele nutzen Autovervollständigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zusätzlich kann sie dazu dienen, dass in einem Formular möglichst gültige Werte gespeichert werden. Selbstverständlich müssen alle Daten serverseitig erneut überprüft werden.</p>
<p>Ich möchte heute zeigen, wie einfach es mit Scriptaculous möglich ist, eine Autovervollständigung mit Google-Maps-Adressen umzusetzen. Da man per AJAX nicht auf fremde Website einen AJAX-Request durchführen kann, müssen wir ein Skript als Schnittstelle zwischen Google Maps und unserer Website verwenden. Fangen wir also dieses Mal mit der serverseitigen Script an:</p>
<p><span id="more-364"></span></p>
<pre class="brush: php; title: ; notranslate">
$json = json_decode(file_get_contents('http://maps.google.com/maps/geo?output=json&amp;oe=utf8&amp;sensor=false&amp;hl=de&amp;key=DEIN_GOOGLE_MAPS_API_KEY&amp;q='.urlencode($_REQUEST['address'])));

echo '&lt;ul&gt;';
if(!empty($json-&gt;Placemark)){
	foreach($json-&gt;Placemark as $value){
		echo '&lt;li&gt;'.$value-&gt;address.'&lt;/li&gt;';
	}
}
echo '&lt;/ul&gt;';
</pre>
<p>Zuerst stellen wir eine Suchanfrage an Google Maps, wobei wir den zu suchenden Text einfach im Parameter &#8220;q&#8221; übergeben. Der Parameter &#8220;output&#8221; gibt hierbei das von Google Maps zurückgelieferte Format an. Ich habe hier JSON verwendet und wandle die Daten anschließend mit der <a href="http://de.php.net/manual/de/function.json-decode.php">json_decode()</a> Funktion in ein Objekt um. Es kann aber genauso gut XML in Kombination mit einer XML Funktion sie <a href="http://de.php.net/manual/de/function.simplexml-load-string.php">simplexml_load_string()</a> verwendet werden. Da JSON da kompaktere Format ist habe ich mich in diesem Beispiel dafür entschieden.</p>
<p>Ein weiterer interessanter Parameter ist &#8220;hl&#8221;, der die Sprache der Adressen angibt. Viele werden den Parameter auch von der Google Suche kenne. Hier werden die Adressen also in deutsch zurückgegeben. Mit Hilfe dieses einen Parameters könnt ihr also sehr schnell die Funktion auf andere Spracheversionen eurer Seite anpassen.</p>
<p>Damit ihr überhaupt eine Anfrage an Google Maps stellen dürft, benötigt ihr einen <a href="http://code.google.com/intl/de-DE/apis/maps/signup.html">kostenlosen Google Maps API Key</a>, den ihr an den &#8220;key&#8221; Parameter anhängen müsst (Danke an paddy, der mich auf das Fehlen des Keys hingewiesen hat).</p>
<p>Nachdem die Daten von Google Maps empfangen wurden und im Objekt vorhanden sind, geben wir sie an die JavaScript Funktion zurück. Dazu erzeugen wir einfach eine unsortierte Liste mit einem Eintrag pro gefundener Adresse.</p>
<p>Und jetzt kommen wir zum sehr umfangreichen clientseitigen Script. Dazu müssen wir erst einmal ein Formular mit einem Textfeld erzeugen. Außerdem benötigen wir ein DIV, in dem die Ergebnisse ausgegeben werden. Zu guter Letzt kommt dann noch das JavaScript, das den ganzen AJAX-Request und das Behandeln der Empfangenen Daten erledingen muss. Was aber sehr kompliziert klingt, ist recht kurz umgesetzt:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;input type=&quot;text&quot; id=&quot;address&quot; name=&quot;address&quot; /&gt;
&lt;div id=&quot;adresse_choices&quot; class=&quot;autocomplete&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	new Ajax.Autocompleter('address', 'adresse_choices', 'get_addresses.php');
&lt;/script&gt;
</pre>
<p>Die ganze Sache lässt sich mit einer einzigen Zeile JavaScript erledigen. Selbstverständlich müssen dazu noch im Kopfbereich die &#8220;prototype.js&#8221; sowie anschließend die &#8220;scriptaculous.js&#8221; eingebunden werden. Die Funktion <a href="http://wiki.github.com/madrobby/scriptaculous/ajax-autocompleter">Ajax.Autocompleter()</a> gehört hierbei zum Funktionsumfang von Scriptaculous. Das fertige Resultat sieht dann wie folgt aus:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2009/10/google_maps_suggest.png" alt="Google Maps Suggest" title="Google Maps Suggest Beispiel Formular" /></p>
<p>Die hier verwendete ABC-Straße ist kein Witz, sondern die Adresse von Google Deutschland. Eine weitere schöne Eigenschaft von Google Maps ist die automatische Rechtschreibkorrektur, die bei fehlehaften Eingaben durchgeführt wird. Selbst eine Eingabe wie &#8220;plazt der luftblöcke&#8221; führt trotzdem zu dem gewünschten Platz vor dem ehemaligen Berliner Flughafen. Um die Sache testen zu können, habe ich hier ein kleines Beipsiel erstellt, dass ihr euch auch gerne im Quellcode runterladen könnt. Ich habe zusätzlich noch eine Funktion verwendet, die den Suchbegriff hervorhebt:</p>
<p class="aligncenter">
<a href="http://kau-boys.de/beispiele/google_maps_suggest/maps.html" class="awesome large breakerbay">Beispiel</a> <a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest.zip" class="awesome large breakerbay" style="margin-left:20px;">Download</a>
</p>
<p>Wir ihr also sehen könnt, ist es mit der Ajax.Autocompleter() Funktion und einem servreseitigen Skript sehr einfach möglich, auch Daten von anderen Seiten auszuliefern. Das dazu benötigte PHP Skript kann durch kleine Veränderungen an die entsprechende extrene Datenquelle und das zurückgelieferte Format angepasst werden. Die Funktion lässt sich aber natürlich auch genauso gut mit jQuery oder einem anderen Framework umsetzen. Dazu muss dann aber eventuell das zurückgelieferte Format des PHP Skript auch noch angepasst werden.</p>
<p>Ich hoffe das Beispiel hat euch gezeigt, wie vielfältig sich eine Autovervollständigung einsetzen lässt. Habt ihr auch schon einmal mit externen Daten gearbeitet? Oder habt ihr vielleicht eine Idee, konntet sie aber bisher nicht umsetzen? Über ein Kommentar dazu würde ich mich sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/364/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous/feed</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Die Grenzen der Frame-Weiterleitung sprengen</title>
		<link>http://kau-boys.de/315/webentwicklung/die-grenzen-der-frame-weiterleitung-sprengen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=die-grenzen-der-frame-weiterleitung-sprengen</link>
		<comments>http://kau-boys.de/315/webentwicklung/die-grenzen-der-frame-weiterleitung-sprengen#comments</comments>
		<pubDate>Tue, 29 Sep 2009 18:09:29 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=315</guid>
		<description><![CDATA[Viele Hoster bieten günstige Domains ohne Webhosting Komponenten an. Bei einigen Hoster wie z.B. Strato handelt es sich aber leider nur um Domains mit der Möglichkeit der Frame-Weiterleitung. Das ist aber teilweise vor der Bestellung nicht zu sehen. Manch einer wird sich eventuell darüber freuen, da er irgendwo ein kostenloses Hosting mit einer sehr langen [...]]]></description>
			<content:encoded><![CDATA[<p>Viele Hoster bieten günstige Domains ohne Webhosting Komponenten an. Bei einigen Hoster wie z.B. Strato handelt es sich aber leider nur um Domains mit der Möglichkeit der Frame-Weiterleitung. Das ist aber teilweise vor der Bestellung nicht zu sehen.</p>
<p>Manch einer wird sich eventuell darüber freuen, da er irgendwo ein kostenloses Hosting mit einer sehr langen URL hat und durch die Frameweiterleitung den Besuchern immer eine kurze Domain präsentieren kann. Doch die Sache hat auch ihre Haken.</p>
<p><span id="more-315"></span></p>
<h2>Das Lesezeichen-Problem</h2>
<p>Das navigieren innerhalb der Seite gestaltet sich für den Besucher, wie er es erwartet. Er kann alle Links anklicken und der Hauptframe öffnet daraufhin die richtige Seite. Auch das Navigieren mit den &#8220;Vor&#8221; und &#8220;Zurück&#8221; Buttons funktioniert tadellos. Aber sobald der Benutzer eine Seite gefunden hat, die er seinen Favoriten hinzufügen möchte fängt der Ärger an. Nicht nur, dass der Name des Lesezeichens oft nur die Domain enthält, viel schlimmer ist, dass das Lesezeichen auch auf die selbige zeigt. Wenn der Besucher also später das Lesezeichen aufruft kommt er nicht auf die gewünschte Seite, sondern auf die Startseite und muss von dort aus erst wieder mühsam auf die richtige Seite navigieren.</p>
<h2>Das Suchmaschinen-Problem</h2>
<p>Die meisten Suchmaschinen (Google eingeschlossen) haben Probleme mit framebasierten Seiten. Sie sehen oft nur das Frameset-Konstrukt und nicht die Inhalte der einzelnen Frames. Das bedeutet in den meisten Fällen, das eure Internet-Seiten, die tausende von Seiten haben können, bei Suchmaschinen genau EINE Seite als Eintrag enthalten. Und das ist die Startseite oder genauer gesagt das Frameset der Domain. Eine Möglichkeit den Suchmaschinen doch die anderen Seiten mitzuteilen ist das Erstellen einer <a href="http://www.sitemaps.org/">Sitemap</a>. Diese solltet ihr dann aber manuell den Suchmaschinen mitteilen, da sie die Datei unter umständen auch nicht finden können. Dabei könnt ihr entweder die Domain um die Seitennamen erweitern, oder aber die URL eures Webspace verwenden und um die Seitennamen erweitern.</p>
<h2>Die Lösung</h2>
<p>Beide Probleme zeigen also, dass Frame-Weiterleitungen ein Relikt aus alten Zeiten sind und nicht mehr verwendet werden sollten. Aber was kann man tun, wenn der Hoster keine HTTP-Weiterleitung bietet, oder dafür einen Aufpreis verlangt? Ganz einfach, man bedient sich eines recht simplen Tricks. Dazu legt man zuerst einen Ordner mit beliebigen Namen auf dem Server an. Dann stellt man die Domain so ein, dass sie als Ziel den Ordner enthält. In diesem Ordner erzeugt man dann eine index.php (oder eine Index-Datei einer andern Scriptsprache) mit folgendem Inhalt:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
	top.location.href = &quot;http://example.com&quot;;
&lt;/script&gt;
</pre>
<p>Dieser einfache JavaScript Snippet ändert die URL des Top-Frame auf einen neuen Wert. Wenn der Besucher also eure Domain aufruft, die lediglich eine Frame-Weiterleitung untersützt, sorgt der Code dafür, dass das oberste Frameset auf eine andere URL umgeleitet wird. Hierbei müsste ihr natrülich &#8220;example.com&#8221; durch eure eigene Domain ersetzen (das &#8220;http://&#8221; dabei nicht vergessen). Für alle Besucher, die keine JavaScript Unterstützung aktiviert haben solltet ihr zusätzlich einen NOSCRIPT Tag einfügen der einen Link enthält:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;noscript&gt;
	Sollten Sie nicht weitergeleitet werden, klicken Sie auf den folgenden Link:
	&lt;a href=&quot;http://example.com&quot; target=&quot;top&quot;&gt;http://example.com&lt;/a&gt;
&lt;/noscript&gt;
</pre>
<p>Der Link bekommt dabei das Attribut &#8220;traget&#8221; mit dem Wert &#8220;top&#8221;. Somit wird auch hier der Link im obersren Frameset aufgerufen. Um Benutzern, die ein Lesezeichen auf eure umzuleitende Domain haben, könntet ihr auch noch den Request an die Domain anhängen. Somit wird der Besucher dann auf die richtige Zielseite auf der anderen Domain umgeleitet. Zusammengesetzt sieht das ganze Beispiel dann wie folgt aus (oder ähnlich in einer anderen Skriptsprache):</p>
<pre class="brush: php; gutter: false; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
	top.location.href = &quot;http://example.com&quot;&lt;?php echo $_SERVER['REQUEST_URI']; &gt;
&lt;/script&gt;
&lt;noscript&gt;
	Sollten Sie nicht weitergeleitet werden, klicken Sie auf den folgenden Link:
	&lt;?php echo '&lt;a href=&quot;http://example.com'.$_SERVER['REQUEST_URI'].'&quot; target=&quot;top&quot;&gt;http://example.com'.$_SERVER['REQUEST_URI'].'&lt;/a&gt;'; ?&gt;
&lt;/noscript&gt;
</pre>
<p>Diesen Codeblock platziert Ihr einfach im BODY Tag der Index-Seite. Dabei solltet ihr aber Besuchern ohne JavaScript eine schönere Seite präsentieren, als eine die nur den Link auf weißem Untergrund enthält.</p>
<p><del datetime="2009-12-06T14:33:09+00:00">Da ich selbst noch eine Domain besitze, die ich leider zur Zeit noch nicht auf ein aktuelles Hostingpaket umziehen kann, könnt ihr euch das ganze in einem kleinen Beispiel auch ansehen.</del><ins datetime="2009-12-06T14:33:09+00:00"> <a href="http://kau-boys.de/505/allgemein/der-blog-hat-eine-neue-domain">Die Domain ist mittlerweile endlich umgezogen</a> und daher habe ich nun das Beispiel auf die alte Subdomain abgeändert. Dazu solltet ihr einfach JavaScript vorübergehen deaktivieren, damit ihr auch die Seite und den Quelltext betrachten könnt. Wenn ihr dann JavaScript wieder aktiviert und die Seite aktualisiert, solltet ihr auf meinen Blog umgeleitet werden.</ins></p>
<p><a href="http://kau-boys.ramarka.de">Beispiel</a></p>
<p>Mit diesem Trick könnt ihr also die Frame-Weiterleitung umgehen, aber ihr präsentiert dann dem Besucher die entsprechend andere URL, als sie aufgerufen haben. Dies sollte aber einer schönen URL aber dafür der eingeschränkten Suchmaschinenfreundlichkeit und der Verhinderung von Lesezeichen bevorzugt werden. Ihr könnt weiterhin die schöne URL in Mails verbreiten und den Besucher trotzdem umleiten. Wenn ihr die Domain vollständig nutzen möchtet bleibt euch leider nichts anderes Möglich, als diese in das Webhosting-Paket zu übertragen oder zu einem reinen Domain-Anbieter zu wechseln, der auch eine HTTP-Weiterleitung anbietet, auch wenn das eventuell einen Aufpreis bedeutet.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/315/webentwicklung/die-grenzen-der-frame-weiterleitung-sprengen/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Die magische select() Funktion!</title>
		<link>http://kau-boys.de/218/webentwicklung/die-magische-select-funktion?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=die-magische-select-funktion</link>
		<comments>http://kau-boys.de/218/webentwicklung/die-magische-select-funktion#comments</comments>
		<pubDate>Mon, 31 Aug 2009 17:17:16 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=218</guid>
		<description><![CDATA[Bei meinem vorherigen Post zum Zeilen-Duplizierer stand ich vor dem Problem, dass ich Elemente eines bestimmten Tags innerhalb eines ausgewählten DOM-Elements finden musste. Da ich hierfür in den Utility Methods nicht gefunden habe, musste ich die Funktion getElementsByTagName() verwenden. Alleine hiermit konnte ich aber noch immer nicht auf die Elemente zugreifen. Dazu musste ich den [...]]]></description>
			<content:encoded><![CDATA[<p>Bei meinem vorherigen Post zum <a href="http://kau-boys.de/196/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype">Zeilen-Duplizierer</a> stand ich vor dem Problem, dass ich Elemente eines bestimmten Tags innerhalb eines ausgewählten DOM-Elements finden musste. Da ich hierfür in den <a href="http://www.prototypejs.org/api/utility">Utility Methods</a> nicht gefunden habe, musste ich die Funktion <a href="http://de.selfhtml.org/javascript/objekte/document.htm#get_elements_by_tag_name">getElementsByTagName()</a> verwenden. Alleine hiermit konnte ich aber noch immer nicht auf die Elemente zugreifen. Dazu musste ich den Aufruf noch mit der <a href="http://www.prototypejs.org/api/utility/dollar-a">$A()</a> Funktion verwenden. Der gesamte Aufruf für die drei Formularfelder sah dann wie folgt aus:</p>
<p><span id="more-218"></span></p>
<pre class="brush: jscript; title: ; notranslate">
$A(newRow.getElementsByTagName('select')).invoke('clear');
$A(newRow.getElementsByTagName('textarea')).invoke('clear');
$A(newRow.getElementsByTagName('input')).each(function(elm){
	elm.clear().checked = '';
});
</pre>
<p>Heute bin ich durch Zufall dann auf die seit Prototype 1.6 neue Funktion <a href="http://www.prototypejs.org/api/element/select">select()</a> gestoßen. Damit konnte ich in einem ersten Versuch die gleiche Selektion mit folgenden Zeilen nachbilden:</p>
<pre class="brush: jscript; title: ; notranslate">
newRow.select('select').invoke('clear');
newRow.select('textarea').invoke('clear');
newRow.select('input')).each(function(elm){
	elm.clear().checked = '';
});
</pre>
<p>Aber selbst diese Vereinfachung ist noch zu umständlich. Die Funktion erlaubt das Selektrieren mit mehreren CSS-Selektoren. Dazu werden die CSS-Selektoren einfach als Parameter der Funktion übergeben:</p>
<pre class="brush: jscript; title: ; notranslate">
newRow.select('select', 'textarea', 'input')).each(function(elm){
	elm.clear().checked = '';
});
</pre>
<p>Diese Vereinfachung ist zwar nicht ganz sinnvoll, da hier auch für Textfelder das &#8220;checked&#8221; Attribute geleert wird, aber es schadet auch an dieser Stelle nicht weiter.</p>
<p>Wie ihr also sehen könnt bietet die select() Funktion eine sehr einfache Selektion innerhalb eines bereits selektierten Elements. Zusätzlich zu der bereits beschriebenen Funktionalität erweitert die select() Funktion die Elemente zusätzlich noch mit der <a href="http://www.prototypejs.org/api/element/extend">extend()</a> Funktion um weitere Methoden. Sie einfacht also folgenden Aufruf auf lediglich einen Funktionsaufruf:</p>
<pre class="brush: jscript; title: ; notranslate">
// gewöhnlicher Aufruf mit der getElementsByTagName() Funktion
$A(newRow.getElementsByTagName('input')).map(Element.extend);
// gleicher Aufruf mit Hilfe der select() Funktion
newRow.select('input');
</pre>
<p>Die select() Funktion ermöglicht also im Prinzip das Anwenden der <a href="http://www.prototypejs.org/api/utility/dollar-dollar">$$()</a> Funktion erweitert um das Zusammenfassen der Elemente in einem Array. Dadurch lässt sich beim Verarbeiten von selektierten Elementen einiges an Mehraufwand einsparen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/218/webentwicklung/die-magische-select-funktion/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Einfacher Zeilen-Duplizierer mit Prototype</title>
		<link>http://kau-boys.de/196/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=einfacher-zeilen-duplizierer-mit-prototype</link>
		<comments>http://kau-boys.de/196/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype#comments</comments>
		<pubDate>Thu, 27 Aug 2009 15:54:47 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=196</guid>
		<description><![CDATA[Viele standen schon einmal vor dem Problem, dass in einem Formular zu einem Bereich mehrere Eingaben möglich sein sollten. Meist wird dies durch mehrere Text-Felder gelöst, die in einer Tabelle angeordnet sind. Um nun aber dem Benutzer die Möglichkeit zu geben eine weitere Zeile einzufügen musste oft das Formular &#8220;abgeschickt&#8221; werden, wobei aber der Speicher-Algorithmus [...]]]></description>
			<content:encoded><![CDATA[<p>Viele standen schon einmal vor dem Problem, dass in einem Formular zu einem Bereich mehrere Eingaben möglich sein sollten. Meist wird dies durch mehrere Text-Felder gelöst, die in einer Tabelle angeordnet sind. Um nun aber dem Benutzer die Möglichkeit zu geben eine weitere Zeile einzufügen musste oft das Formular &#8220;abgeschickt&#8221; werden, wobei aber der Speicher-Algorithmus umgangen wurde. Anschließend wurde das gesamte Formular neu geladen mit einer neuen Zeile für den entsprechenden Bereich.</p>
<p>Zum Glück sind wir heute wesentlich weiter. Zwar war eine Lösung per JavaScript auch in der Vergangenheit schon möglich, aber durch die Verwendung modernen Frameworks wie Prototype lässt sich das gesamte Problem auf eine Zeile Code reduzieren:</p>
<p><span id="more-196"></span></p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
$$('#table tr').last().insert({'after' : this.cloneNode(true)});
</pre>
<p>Zugegeben, hier werden einige Funktionen in Reihe aufgerufen, aber diese Zeile Code lässt sich ohne weiteres per inline Eventhandler verwenden.</p>
<p>Doch der Reihe nach, was wird mit dieser Zeile eigentlich gemacht? Fangen wir einfach vorne bei der <a href="http://www.prototypejs.org/api/utility/dollar-dollar">$$()</a> Funktion an. Hier übergeben wir einen CSS-Selektor um alle TR Tags innerhalb der Tabelle mit der ID &#8220;table&#8221; zu selektrieren und bekommen durch anwenden der <a href="http://www.prototypejs.org/api/array/last">last()</a> Funktion die letzte davon ausgewählt. Auf diese Zeile wenden wir nun die <a href="http://www.prototypejs.org/api/element/insert">insert()</a> Funktion an. Dabei wird die Zeile selbst übergeben und steht über &#8220;this&#8221; zur Verfügung. Dies machen wir uns zu Nutze und duplizieren die letzte Zeile durch die Funktion <a href="http://de.selfhtml.org/javascript/objekte/node.htm#clone_node">cloneNode()</a>. Diese kopierte Zeile wird nun nach der vorherigen eingefügt, was durch die Angabe von &#8220;after&#8221; angegeben wird.</p>
<p>Da die letzte Zeile kopiert wird, werden auch alle Werte, die sich in Formluarfeldern dieser Zeile befinden mitkopiert. Um dies zu verhindern müssten die Felder zurückgesetzt werden. Das ganze in eine Funktion gepackt und mit zweit Callback-Funktionen erweitert sieht dann wie folgt aus:</p>
<pre class="brush: jscript; title: ; notranslate">
function addRow(selector, options){
	var lastRow = $$(selector).last();
	var newRow = lastRow.cloneNode(true);
	if (options.reset) {
		newRow.select('select', 'textarea', 'input').each(function(elm){
			elm.clear().checked = '';
		});
	}
	if(options.beforeInsert) options.beforeInsert(newRow);
	lastRow.insert({'after': newRow});
	if(options.afterInsert) options.afterInsert(newRow);
}
</pre>
<p>Wenn im Options Hash der reset Parameter auf true gesetzt wird, werden vor dem Einfügen der neuen Zeile alle Felder zurückgesetzt. Dazu werden die Formular-Elemente mit der <a href="http://www.prototypejs.org/api/element/select">select()</a> Funktion ausgewählt und mit Hilfe der <a href="http://www.prototypejs.org/api/enumerable/each">each()</a> Funktion wird jede Zeile durch die <a href="http://www.prototypejs.org/api/form/element/clear">clear()</a> Funktion zurückgesetzt. Bei Radio-Buttons und Checkboxen werden zusätzlich die &#8220;checked&#8221; Attribute zurückgesetzt.</p>
<p>Die Funktion kann nun jedem Beliebigen Element zugerdnet werden. Hier bietet sich ein Link, ein SPAN oder ein Bild an:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;span onclick=&quot;addRow('table', {reset: true, beforeInsert: doSomeMagic})&quot;&gt;Zeile hinzufügen&lt;/span&gt;
</pre>
<p>Bei diesem Beispiel-Button wurde der reset Parameter auf &#8220;true&#8221; gesetzt und zusätzlich der Name einer Callback-Funktion angegeben, die vor dem einfügen aufgerufen wird. Die Callback-Funktion &#8220;beforeInsert&#8221; bietet sich an, um z.B. LABEL Tags in der einzufügenden Zeile zu ersetzen. Die Callback-Funktion &#8220;afterInsert&#8221; kann verwendet werden, um z.B. Eventhander oder andere Funktionen einem Element der neuen Reihe zuzuordnen, was besser nach dem einfügen vorgenommen werden sollte. Beide Callbacks erhalten eine Referenz auf die einzufügende Zeile.</p>
<p>Als kleines Beispiel habe ich das Formular aus meinem <a href="http://kau-boys.de/137/webentwicklung/formular-vorschau-mit-jquery-thickbox">vorherigen Post</a> etwas umgebaut und die Funktion zum Hinzufügen einer E-Mail-Adresse eingesetzt. Hier das Beispiel und der Quellcode dazu:</p>
<p class="aligncenter">
<a href="http://kau-boys.de/beispiele/formpreview/form_addrow.php" class="awesome large breakerbay">Beispiel</a> <a href="http://kau-boys.de/beispiele/formpreview/formpreview_addrow.zip" class="awesome large breakerbay" style="margin-left:20px;">Download</a>
</p>
<p>Hierbei kommt ein sehr viel komplexerer CSS-Selektor zum Einsatz:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;span onclick=&quot;addRow('form dl:first-of-type dd ul li', {reset: true})&quot;&gt;Add address&lt;/span&gt;
</pre>
<p>Wie Ihr also seht, könnt ihr die Funktion für beliebige Elemente verwenden, bei denen es Sinn macht, sie zeilenweise zu duplizieren.</p>
<p>Falls ein jQuery-Profi unter euch ist, würde mich eine Lösung in jQuery sehr interessieren. Ich habe leider noch nicht genug Erfahrung darin, um die Funktion ebenfalls in jQuery zu schreiben. Wenn ihr Anmerkungen zur Prototype-Version habt würde mich diese aber auch interessieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/196/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Formular-Vorschau mit jQuery Thickbox</title>
		<link>http://kau-boys.de/137/webentwicklung/formular-vorschau-mit-jquery-thickbox?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=formular-vorschau-mit-jquery-thickbox</link>
		<comments>http://kau-boys.de/137/webentwicklung/formular-vorschau-mit-jquery-thickbox#comments</comments>
		<pubDate>Thu, 20 Aug 2009 14:46:37 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=137</guid>
		<description><![CDATA[Für eines meiner Projekte habe ich eine kleine einfache Formular-Vorschau implementiert. Da ich mit dem Ergebnis und der Einfachheit sehr zufrieden bin, möchte ich das Ergebnis hier kurz vorstellen. Die Vorschau-Funktion nutzt das jQuery Framework und dessen Plugin Thickbox. Der Einsatz von Thickbox stellt aber nur eine Möglichkeit dar, die Vorschau umzusetzen. Im Grunde ist [...]]]></description>
			<content:encoded><![CDATA[<p>Für eines meiner Projekte habe ich eine kleine einfache Formular-Vorschau implementiert. Da ich mit dem Ergebnis und der Einfachheit sehr zufrieden bin, möchte ich das Ergebnis hier kurz vorstellen.</p>
<p>Die Vorschau-Funktion nutzt das jQuery Framework und dessen Plugin Thickbox. Der Einsatz von Thickbox stellt aber nur eine Möglichkeit dar, die Vorschau umzusetzen. Im Grunde ist der Aufbau recht simpel. Die JavaScript Funktion setzt das Target und das Action Attribut des Formulars und sendet die Daten an das unter Target angegebene Ziel. Das kann ein neuer Tab sein, oder aber ein iFrame, der wie in dem Beispiel beschrieben in der Thickbox angezeigt wird.</p>
<p><span id="more-137"></span></p>
<p>Zur Demonstration habe ich kleines E-Mail-Formular erstellt. Vor dem Absenden kann der Benutzer die zu versendende Mail ansehen. Ich setze die Funktion in einem Loginbereich für ein sehr viel komplexeres Formular ein und verwende für die Vorschau-Funktion auch das Skript, über das die Daten später dem Benutzer ausgegeben werden. Die Vorgehensweise ist aber von der Art und dem Umfang des Formulars unabhängig.</p>
<p><img class="aligncenter" title="screenshot of mail form" src="http://kau-boys.de/wp-content/uploads/2009/08/form.png" alt="screenshot of mail form" /><br />
So sieht das kleine Mailformular aus. Natürlich könnte man es noch um die Felder für den Absender und dessen E-Mail-Adresse erweitern, aber es dient wie gesagt nur als Demonstration.</p>
<p>Die einzige Anforderung an das Formular selbst ist eine ID, damit es über die Javascript-Funktion aufgerufen werden kann. Anschließend muss ein Button für die Vorschau eingefügt werden. Dieser sollte am besten ausgeblendet werden, wenn der Nutzer kein JavaScript aktiviert hat.</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;input type=&quot;button&quot; value=&quot;Preview&quot; id=&quot;previewbutton&quot; class=&quot;thickbox&quot; alt=&quot;#TB_inline?width=400&amp;height=250&amp;inlineId=mailpreview&amp;modal=true&quot; /&gt;
</pre>
<p>Das Attribut alt enthält die <a href="http://jquery.com/demo/thickbox/#container-4">Parameter für die Thickbox</a>. Zusätzlich muss die CSS-Klasse thickbox zugewiesen werden, um bei einem Klick auf den Button die Thickbox zu aktivieren. Das ID Attribut wird für den Aufruf der JavaScript Funktion durch die click() Funktion von jQuery benötigt. Hier ist natürlich auch ein inline Attribut wie onmousedown möglich, aber das wäre nicht sehr jQuery-Style.</p>
<p>Anschließend aktivieren wir den Eventhandler für den Button zum Aufruf der Vorschau-Funktion:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
$('#previewbutton').click(function(){
	formPreview('mailsend', 'mailpreview.php', 'mailpreviewiframe');
});
</pre>
<p>Der erste Parameter der Funktion steht für die ID des Formular, der zweite für die Seite, die zur Anzeige der Vorschau verwendet wird. Der dritte für das Zeil. Das Ziel kann ein neues Fenster sein, oder aber wie in unserem Fall ein iFrame, der wie folgt an einer beliebigen Stelle im Quelltext definiert wird:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;div id=&quot;mailpreview&quot; style=&quot;display: none;&quot;&gt;
	&lt;iframe name=&quot;mailpreviewiframe&quot; style=&quot;border: 0; width: 400px; height: 245px;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</pre>
<p>Der Frame steckt in einem DIV, welches ausgeblendet wird. Die ID des DIVs wird für die Thickbox-Parameter verwendet.</p>
<p>Was geschiet nun bei einem Klick auf den Vorschau-Button? Zuerst wird die Thickbox-Funktion ausgeführt und das DIV in die Thickbox verschoben. Mit einer kleinen Verzögerung wird dann der Inhalt des Formulars an den iFrame gesendet, indem das Traget Attribut des Formulars ausgenutzt wird. Um zum Anzeigen der Vorschau eine andere Seite als beim Speichern zu verwenden wird außerdem vor dem Absenden das Action Attribut ausgetauscht und direkt nach dem Absenden wieder auf seinen Ursprungszustand zurückgesetzt.</p>
<p><img class="aligncenter" title="screenshot of mail preview" src="http://kau-boys.de/wp-content/uploads/2009/08/preview.png" alt="screenshot of mail preview" /></p>
<p>Da die Vorschau unter Verwendung des späteren Ausgabeseite geschiet, entspricht die Darstellung sehr genau dem späteren Ergebnis. Dazu sollten dann eventuell Daten aus der Datenbank nachgeladen werden oder Werte entsprechend des Speicheralgorithmus verändert werden. Bei komplexen Formularen kann es auch sinnvoll sein, die Daten über die reguläre Speicherfunktion in eine temporäre Tabelle zu speichern, um sie direkt wieder auszulesen. In meinem Projekt lade ich beispielsweise Daten für die ausgewählten SELECT Felder nach und wende die Datenbank-Escape-Funktionen an. Danach füge ich alles zu einer Datenstruktur zusammen, die so auch aus der Datenbank ausgelesen wird und gebe sie mit der Ausgabeseite aus.</p>
<p>Ich hoffe dieses kleine Beispiel zeigt euch, mit welch einfachen Mitteln man eine kleine Vorschau-Funktion umsetzen kann, ohne dabei auf Techniken wie AJAX angewiesen zu sein. Wer auf die Thickbox und jQuery verzichten will, muss lediglich einen inline Eventhandler verwenden und als Target beipsielsweise &#8220;_blank&#8221; angeben, um die Vorschau in einem neuen Tab/Fenster zu öffnen.</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;input type=&quot;button&quot; value=&quot;Preview&quot; onclick=&quot;formPreview('mailsend', 'mailpreview.php', '_blank');&quot; /&gt;
</pre>
<p>Das Formular kann gerne hier ausprobiert werden. Und keine Angst, es wird dabei in keinem Fall eine Mail versendet! Wer den Quellcode haben möchte, kann ihn auch gerne hier downloaden. </p>
<p class="aligncenter">
<a href="http://kau-boys.de/beispiele/formpreview/form.php" class="awesome large breakerbay">Beispiel</a> <a href="http://kau-boys.de/beispiele/formpreview/formpreview.zip" class="awesome large breakerbay" style="margin-left:20px;">Download</a>
</p>
<p>Noch ein Wort zum Formular-Design. Da ich nicht gerade die Geduld und die Begabung für schöne Formular habe, wurde für das Beispiel das <a href="http://www.emblematiq.com/lab/niceforms/">Niceform 2.0</a> verwendet. Dieses ist zwar auf JavaScript angewiesen und ersetzt vergebene Klassen, aber ich konnte ohne viel Aufwand schöne Formulare für das Beispiel erzeugen.</p>
<p><strong>Noch ein kleiner Bonustipp:</strong> Für Funktionen, die zwingend JavaScript erfodern, sollten diese ausgeblendet werden, wenn der Nutzer kein JavaScript aktiviert hat. Dazu einfach eine CSS-Klasse für solche Elemente verwenden und diese per &#8220;display: none&#8221; ausblenden. Im Kopfbereich kann dann mit &#8220;document.write()&#8221; oder den Funktionen der JavaScript-Frameworks die &#8220;display&#8221; Eigenschaft der CSS-Klasse wieder überschrieben werden. Somit erspart man dem Nutzer ohne JavaScript die unnötigen Klicks und in diesem Beispiel ein versehentliches Absenden, da viele Browser bei deaktiviertem JavaScript alle Buttons automatisch wie Submit-Buttons interpretiert.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/137/webentwicklung/formular-vorschau-mit-jquery-thickbox/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Kau-Boy&#8217;s AutoCompleter Plugin</title>
		<link>http://kau-boys.de/24/wordpress/kau-boys-autocompleter-plugin?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kau-boys-autocompleter-plugin</link>
		<comments>http://kau-boys.de/24/wordpress/kau-boys-autocompleter-plugin#comments</comments>
		<pubDate>Thu, 02 Jul 2009 16:11:34 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=24</guid>
		<description><![CDATA[Dieses Plugin verwendet den Ajax.Autocompleter von script.aculo.us bzw. die jQuery Autocomplete Funktoin um Beiträge zu finden, die den Suchbegriff im Titel oder Inhaltstext enthalten. Der eingegebene Text kann in den Titel der Beiträge und/oder im Inhalt gesucht werden. Es kann zusätzlich die Formatierung der Ergebnisse über eine eigene CSS Datei an den Blog angepasst werden. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://codex.wordpress.org/AJAX_in_Plugins"></a><a href="http://codex.wordpress.org/AJAX_in_Plugins"></a>Dieses Plugin verwendet den Ajax.Autocompleter von script.aculo.us bzw. die jQuery Autocomplete Funktoin um Beiträge zu finden, die den Suchbegriff im Titel oder Inhaltstext enthalten.</p>
<p>Der eingegebene Text kann in den Titel der Beiträge und/oder im Inhalt gesucht werden. Es kann zusätzlich die Formatierung der Ergebnisse über eine eigene CSS Datei an den Blog angepasst werden. Es kann jeweils der Titel oder zusätzlich ein Teil des Inhalts angegeben werden, wobei hier auch die Länge des auszugebenden Inhaltes eingestellt werden kann.</p>
<p><span id="more-24"></span></p>
<h2>Installation:</h2>
<h3>Installation über die WordPress Adminstrator-Seiten:</h3>
<ol>
<li>Gehe zur Admin-Seite <code>Plugins -&gt; Installieren</code></li>
<li>Suche nach <code>kau-boy</code> und wähle das Plugin aus</li>
<li>Wähle die Aktion <code>Jetzt installieren</code></li>
<li>Klicke auf <code>Jetzt installieren</code></li>
<li>Aktiviere das Plugin über den <code>Plugins</code> Menüpunkt in WordPress</li>
<li>Du musst eventuell die Einstellungen anpassen, gerade wenn dein Suchfeld eine andere ID als <code>s</code> hat</li>
</ol>
<h3>Installation unter Verwendung der WordPress Adminstrator-Seiten:</h3>
<ol>
<li>Lade die zip-Datei des Plugins herunter: <a href="http://downloads.wordpress.org/plugin/kau-boys-autocompleter.zip">kau-boys-autocompleter.zip</a></li>
<li>Gehe zur Admin-Seite <code>Plugins -&gt; Installieren</code></li>
<li>Wähle den Link <code>Hochladen</code> unter <code>Plugins Installieren</code> Überschrift</li>
<li>Wähle die zip-Datei aus und klicke <code>Jetzt installieren</code></li>
<li>Aktiviere das Plugin über den <code>Plugins</code> Menüpunkt in WordPress</li>
<li>Du musst eventuell die Einstellungen anpassen, gerade wenn dein Suchfeld eine andere ID als <code>s</code> hat</li>
</ol>
<h3>Installation unter Verwendung von FTP</h3>
<ol>
<li>Lade die zip-Datei des Plugins herunter: <a href="http://downloads.wordpress.org/plugin/kau-boys-autocompleter.zip">kau-boys-autocompleter.zip</a></li>
<li>Entpacke es und lade es in dein <code>/wp-content/plugins/</code> Verzeichnis hoch</li>
<li>Aktiviere das Plugin über den <code>Plugins</code> Menüpunkt in WordPress</li>
<li>Du musst eventuell die Einstellungen anpassen, gerade wenn dein Suchfeld eine andere ID als <code>s</code> hat</li>
</ol>
<h2>Screenshots:</h2>
<h3>Screenshot des Plugins in einem neuen WordPress blog</h3>
<p><img title="Screenshot des Plugins in einem neuen WordPress blog" src="http://kau-boys.de/wp-content/uploads/2009/08/screenshot-1.png" alt="Screenshot des Plugins" /></p>
<h3>Screenshot der Einstellungsseite (auch in englisch erhältlich)</h3>
<p><img title="Screenshot der Einstellungsseite (auch in englisch erhältlich)" src="http://kau-boys.de/wp-content/uploads/2009/08/screenshot-2-de.png" alt="Screenshot der Einstellungsseite" /></p>
<h2>Versionsgeschichte:</h2>
<ul>
<li><strong>3.1.2</strong> Zurücksetzen der vorherigen Änderungen, da sie das Problem nicht lösen sondern es eher auslösen</li>
<li><strong>3.1.1</strong> Ersetzen von appendTo() mit prependTo() im jquery.autocompleter plugin zum beheben von Überlagerungs-Problemen</li>
<li><strong>3.1</strong> Ausblenden von PHP Warnungen, wenn WP_DEBUG inaktiv ist und Einfügen des Ergebnis-DIV in den Kopf des BODY Tag</li>
<li><strong>3.0.4</strong> Beheben eines Tippfehlers in der jQuery URL</li>
<li><strong>3.0.3</strong> Beheben eines Tippfehlers im jQuery-Selektor</li>
<li><strong>3.0.2</strong> Retag als 3.0.2 aufgrund eines Deploment-Fehlers im Respository</li>
<li><strong>3.0.1</strong> Schneller bugfix für Prototype CSS und JavaScript</li>
<li><strong>3.0</strong> Einsatz von AJAX, so wie es hier beschrieben wird: <a href="http://codex.wordpress.org/AJAX_in_Plugins">http://codex.wordpress.org/AJAX_in_Plugins</a></li>
<li><strong>2.5</strong> Anpassen das Plugin an WordPress Installationen, bei denen die wp-config.php eine Orderebene über dem ROOT Verzeichnis liegt.</li>
<li><strong>2.4</strong> Fehler mit html Entitäten im Filter beheben</li>
<li><strong>2.3</strong> Fehler des JavaScript in IE8 in Verbindung mit Prototype beheben</li>
<li><strong>2.2</strong> Deaktivieren der Suche für Suchfelder im Adminbereich und Ermöglichen der Verwendung zusammen mit dem relevanssi Plugin</li>
<li><strong>2.1</strong> Hinzufügen einer neuen Version von jQuery Autocomplete</li>
<li><strong>2.0.1</strong> Entfernen von &#8220;short open tags&#8221;, die auf blogs die Fehler verursachen die &#8220;short_open_tag&#8221; nicht auf &#8220;On&#8221; gesetzt haben</li>
<li><strong>2.0</strong> Autocompleter mit mehreren Textfelder auf einer Seite nutzbar machen, verbessern der Kürzung des Inhalt von Artikeln</li>
<li><strong>1.9</strong> Beheben von Problemen mit PHP4, funktioniert nun auch mit qTranslate im &#8220;Query-Modus&#8221; (?lang=de)</li>
<li><strong>1.8</strong> Hinzufügen der Einstellung für die Länge des Titels und des Inhalts in den Ergebnissen</li>
<li><strong>1.7</strong> Erstzen von jQuery suggest durch jQuery autocomplete, da das suggest Plugin HTML Auszeichnungen zerstört</li>
<li><strong>1.6.1</strong> Verwendung des id Attributs als Standard anstelle des name Attributs</li>
<li><strong>1.6</strong> Hinzufügen der Möglichkeit das Suchfeldes anhand des name Atrrbiuts auszuwählen</li>
<li><strong>1.5.2</strong> Hinzufügen der richtigen Kodierung zu <code>html_entity_decode()</code> um das Zerteilen von XML Enitäten zu verhindern</li>
<li><strong>1.5.1</strong> Fehler im AJAX repsonse behoben, der die Einstellung für die Ergebnisfelder nicht geladen hat</li>
<li><strong>1.5</strong> Hinzufügen Auswahlmöglichkeiten für die Such- und Ergebnisfelder</li>
<li><strong>1.4.1</strong> Aktualisierung der Übersetzungsdatei</li>
<li><strong>1.4</strong> Kombinieren der Styles für jQuery und script.aculo.us, Hinzufügen  einer Einstellung zur Multibyte-Kodierung</li>
<li><strong>1.3.5</strong> Fehler bei der <code>html_entity_decode()</code> Konvertierung beseitigt</li>
<li><strong>1.3</strong> Enfternen eines Kommentars in autocompleter.js.php, welcher eine PHP header warning  erzeugt hat</li>
<li><strong>1.2</strong> Verwendung von <code>html_entity_decode()</code> um das Zerteilen von Enitäten zu verhindern</li>
<li><strong>1.1</strong> Entfernen von WordPress shortcodes um leere oder falsche Seiten zu verhindern</li>
<li><strong>1.0</strong> Möglichkeit jQuery ODER script.aculo.us zu verwenden, Übersetzen der Einstellungsseite ins Deutsche</li>
<li><strong>0.4</strong> Hinzufügen der Einstellung für die Anzahl der Suchergebnisse und der eigenen CSS Date</li>
<li><strong>0.3</strong> Hinzufügen der Einstellung für die Suchfeld ID</li>
<li><strong>0.2</strong> Erste stabile Version</li>
</ul>
<p>Wenn dir dieses Plugin gefällt oder dir etwas fehlt, würde ich mich freuen es zu erfahren. Hinterlasse einfach ein Kommentar auf dieser Seiter oder auf meiner <a href="http://wordpress.org/tags/kau-boys-autocompleter">WordPress Plugin Seite</a>.</p>
<p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=6104701"><img style="border: 0pt none ;" src="http://kau-boys.de/wp-content/uploads/2009/07/btn_donate_LG_en_US.gif" alt="PayPal - The safer, easier way to pay online!" /></a> <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=6104638"><img style="border: 0pt none ;" src="http://kau-boys.de/wp-content/uploads/2009/07/btn_donate_LG_de_DE.gif" alt="PayPal - The safer, easier way to pay online!" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/24/wordpress/kau-boys-autocompleter-plugin/feed</wfw:commentRss>
		<slash:comments>78</slash:comments>
		</item>
	</channel>
</rss>

