<?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>Thu, 29 Jul 2010 22:09:53 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Pac-Man auf Google weiterhin online mit Zweispielermodus</title>
		<link>http://kau-boys.de/allgemein/pac-man-auf-google-weiterhin-online-mit-zweispielermodus?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=pac-man-auf-google-weiterhin-online-mit-zweispielermodus</link>
		<comments>http://kau-boys.de/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&#252;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&#228;che klicken muss: Quelle: [...]]]></description>
			<content:encoded><![CDATA[<p>Google hatte bereits angek&#252;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&#228;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&#246;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&#228;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&#252;rlich das Logo nicht &#228;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&#228;lt.</p>
<p>Wer das Spiel auch jetzt noch einmal spielen m&#246;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&#252;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/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/allgemein/eilmeldung-pac-man-bei-google?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=eilmeldung-pac-man-bei-google</link>
		<comments>http://kau-boys.de/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&#252;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&#252;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&#252;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&#228;re aber keinen Blogartikel wert, denn es kommt ja bestimmt einmal sp&#228;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&#252;rde hier nat&#252;rlich als erstes auf Flash tippen. Aber nein, Google w&#228;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&#223;e JavaScript-Datei verwendet, die sogar die Ausgabe des kultigen Sounds erm&#246;glicht. Alles in allem eine wirklich gelungene Aktion von Google und ein Beweis daf&#252;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/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/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables</link>
		<comments>http://kau-boys.de/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&#228;ftigt haben, wenden wir uns heute seinem Bruder der Droppables Klasse zu. Mit ihr k&#246;nnen wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufk&#246;rbe auf Online-Shops. Ich m&#246;chte daher einen einfachen Einkaufswagen demonstieren. Der Quellcode f&#252;r dieses Beispiel Zuerst einmal wieder [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem wir uns in <a href="http://kau-boys.de/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&#228;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&#246;nnen wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufk&#246;rbe auf Online-Shops. Ich m&#246;chte daher einen einfachen Einkaufswagen demonstieren.</p>
<h2>Der Quellcode f&#252;r dieses Beispiel</h2>
<p>Zuerst einmal wieder der Quellcode f&#252;r dieses Beispiel. Ich werde wie auch schon im ersten Teil des Tutorials die wichtigen Zeilen etwas genauer erkl&#228;ren. Die Zeilen 1-34 enthalten das grundlegende Ger&#252;st der HTML-Seite sowie die Stylesheets, auf die ich nicht n&#228;her eingehen m&#246;chte:</p>
<p><span id="more-830"></span></p>
<pre class="brush: xml;">
&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&#252;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&#252;hrt (in unserem Fall einfache farbige DIVs) sowie der &#8220;Warenkorb&#8221;, der eine leere unsortierte Liste enth&#228;lt. In diese f&#252;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&#252;ngliche Position zur&#252;ckkehren. Nun aber zum neuen Teil der Droppables-Klasse:</p>
<pre class="brush: jscript; gutter: false;">
Droppables.add('shopping_cart', {
	onDrop: addItem,
	hoverclass: 'hover'
});
</pre>
<p>Wichtig ist hier, dass wir keine Instanz der Klasse durch das Schl&#252;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&#252;gen. Es ist also m&#246;glich mehrere Bereiche einer Website f&#252;r die Reaktion auf Draggables zu verwenden. Es w&#228;re z.B. m&#246;glich einen &#8220;Papierkorb&#8221; einzurichten, mit dem man einenen bereits hinzugef&#252;gten Artikel wieder aus der Liste entfernen kann bzw. dessen Anzahl verringern.</p>
<p>Der add() Funktion k&#246;nnen auch mehrere Optionen &#252;bergeben werden, welche das sind k&#246;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&#252;ber steht. Zus&#228;tzliche gebe ich eine Callback-Funktion f&#252;r das <code>onDrop</code> Event an. Wie ihr der Funktion <code>addItem()</code> entnehmen k&#246;nnte, bekommt die <code>onDrop()</code> Funktion eine Referenz auf das aufgenommene Elemente sowie auf die &#8220;Drop-Zone&#8221; und das Event selbst &#252;bergeben. In der Funktion selbst f&#252;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&#246;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&#252;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&#246;nnt ist es sehr einfach ein Element f&#252;r die Interaktion mit Draggables zu verwenden. Was ihr dabei mit den Elementen macht ist eurer Fantasie &#252;berlassen. Die M&#246;glichkeiten sind schier unbegrenzt. Ich m&#246;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&#228;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&#246;glich ist und wie leicht sich die Sortierreihenfolge auslesen l&#228;sst, das erwartet euch in Teil 3 des Tutorials. F&#252;r welche Einsatzzwecke habt ihr bisher Draggables und Droppables genutzt? &#220;ber einen Kommentar dazu w&#252;rde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/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/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable</link>
		<comments>http://kau-boys.de/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&#246;chte ich mein angek&#252;ndigtes Tutorial &#252;ber Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel &#214;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&#246;chte ich mein angek&#252;ndigtes Tutorial &#252;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/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen">&#214;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&#252;r dieses Tutorial die Drag-and-Drop Funktionalit&#228;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&#246;nnen ben&#246;tigt ihr also zuerst einmal die beiden Frameworks.</p>
<p><span id="more-785"></span></p>
<h2>Der Quellcode f&#252;r dieses Beispiel</h2>
<p>Beginnen wir also mit dem Beispiel. Zuerst einmal ben&#246;tigen wir etwas HTML in dem wir ein Element platzieren, welches wir dann aufnehmen m&#246;chten. F&#252;r das Element nehme ich exemplarisch ein DIV, aber ihr k&#246;nnt auch z.B. ein Bild verwenden:</p>
<pre class="brush: xml;">
&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 Teil 1&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;
			#draggable {
				width: 100px;
				height: 100px;
				padding: 30px;
				background-color: #39c;
				border: 1px solid #000;
				cursor: move;
			}
		&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;h1&gt;Drag-and-Drop&lt;/h1&gt;
		&lt;div id=&quot;draggable&quot;&gt;&lt;/div&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			new Draggable('draggable');
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Wichtig f&#252;r das Aktivieren der Draggable Funktion auf ein Element ist eine ID f&#252;r das Element. Das DIV hat hier die ID &#8220;draggable&#8221;. Im Kopf werden die beiden JavaScript Dateien f&#252;r Prototype und Scriptaculous eingebunden. Wichtig ist hierbei, dass zuerst Prototype eingebunden wird. Zus&#228;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;">
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 &#252;bergeben, welches aufnehmbar sein soll.</p>
<h2>Ein Beispiel gef&#228;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&#252;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 &#252;bergeben werden k&#246;nnen. Wir k&#246;nnen z.B. die Bewegung eines Elements auf die horizontale beschr&#228;nken und zus&#228;tzlich das Element beim &#8220;Loslassen&#8221; des Elements wieder auf seine urspr&#252;ngliche Position zur&#252;cksetzen. Der JavaScript Befehl dazu sieht wie folgt aus:</p>
<pre class="brush: jscript; gutter: false;">
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&#252;hren kann. Wichtig ist nat&#252;rlich immer, dass ihr f&#252;r die verschiedenen Elemente unterschiedliche IDs verwendet und niemals eine ID in zwei Instanzen verwendet. Das DIV verh&#228;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&#246;glichen Optionen zu erkl&#228;ren m&#246;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&#246;chte ich auch schon den ersten Teil des Tutorials abschlie&#223;en. Ihr solltet einfach einmal die verschiedenen Optionen ausprobieren um zu sehen, wie sich das DIV dabei verh&#228;lt. Im zweiten Teil besch&#228;ftigen wir uns mit &#8220;dem Bruder&#8221; von Draggable. Dabei handelt es sich um die Droppables Klasse, die es erm&#246;glicht ein aufgenommenes Element &#8220;einzufangen&#8221; und auf das Element zu reagieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#214;ffentlich-rechtlich und vorbildhaft &#8211; So muss eine Web 2.0 zu Olympia aussehen</title>
		<link>http://kau-boys.de/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen</link>
		<comments>http://kau-boys.de/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&#252;rlich ist die Pr&#228;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&#228;len der beiden &#214;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&#252;rlich ist die Pr&#228;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&#228;len der beiden &#214;ffentlich-rechtlichen zu sehen. Das erwartet man auch, denn daf&#252;r zahlen wir ja auch brav unsere Geb&#252;hren.</p>
<p>Was man nicht unbedingt erwartet und was mich sehr &#252;berrascht hat ist der sehr gute Web 2.0 auftritt. Es ist immer sehr gut zu sehen, auf welchen Kan&#228;len gerade etwas live zu sehen ist und was gerade f&#252;r neue Entscheidungen gefallen sind. Au&#223;ergew&#246;hnlich ist allerdings, wie dynamisch sich die Seite an die eigenen Interessen anpassen l&#228;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&#246;nnt k&#246;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&#246;glichkeit die Seite anzupassen besteht darin die verschiedenen Elemente per Drag-and-Drop zu verschieben. Dies geht genauso fl&#252;ssig und unproblematisch wie man es auch von <a href="http://www.google.de/ig">iGoogle</a> oder &#228;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&#223;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 &#220;berblick zu geben, was alles mit recht einfachen Mitteln m&#246;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&#246;chte diesen Artikel zum Einstieg f&#252;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&#223;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&#246;chte ich nicht unerw&#228;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&#246;st finde ich hier aber der Liveticker. Dieser bekommt zwar die gleichen Eintr&#228;ge wie der bei der ARD, aber er aktualisiert sich von selbst und stellt auch sehr sch&#246;n die aktuellen Zwischenergebnisse dar. Er l&#228;uft bei mir zurzeit fast st&#228;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&#252;rde mich aber auch &#252;ber eure Kommentare zu den Websites freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zeilen-Duplizierer mit AutoComplete Felder nutzen</title>
		<link>http://kau-boys.de/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=zeilen-duplizierer-mit-autocomplete-felder-nutzen</link>
		<comments>http://kau-boys.de/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&#228;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/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&#228;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&#252;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&#246;sen hatte ich die erweiterte Funktion mit den beiden Callback-Funktionen erstellt. Damit ist es m&#246;glich die Referenz zum vorherigen Feld zu l&#246;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&#252;gt:</p>
<pre class="brush: jscript;">
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&#246;nnen ben&#246;tigt jedes Feld eine eindeutige ID. Nehmen wir also an, wir haben folgendes erstes Feld f&#252;r unser Formular (hier ein Beispiel aus dem Artikel: <a href="http://kau-boys.de/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous">Google Maps Suggest – Adress-Autovervollst&#228;ndigung mit Scriptaculous</a>):</p>
<pre class="brush: xml;">
&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&#252;rlich die eckigen Klammern am Ende des Name Attributs, damit auch alle kopierten Werte mit&#252;bertragen werden. Damit wir einer Kopie dieses Feldes eine neue Instanz hinzuf&#252;gen k&#246;nnen, m&#252;ssen wir beim Kopieren auch die ID ver&#228;ndern. Dazu schreiben wir uns eine kleine Callback-Funktion, die genau das erledigt:</p>
<pre class="brush: jscript;">
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&#252;gen wir in der 3. Zeile zus&#228;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&#252;r das Feld deaktiviert. Zu guter Letzt erzeugen wir eine neue Instanz des Ajax.Autocompleter. Wir k&#246;nnen dabei als zweiten Parameter dasselbe DIV Element f&#252;r die Vorschl&#228;ge verwenden, da es ja nicht m&#246;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&#252;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&#246;hnlichen Link:</p>
<pre class="brush: xml; gutter: false;">
&lt;span class=&quot;add&quot; onclick=&quot;addRow('#addressform dl', {reset : true, afterInsert: activateAutocomplete})&quot;&gt;Adresse hinzuf&#252;gen&lt;/span&gt;
</pre>
<p>Es wird durch den Selektor <code>"#addressform dl"</code> die gesamte Definition inklusive des Label kopiert. Ihr k&#246;nnt aber auch eine andere HTML Struktur wie z.B. eine unsortierte Liste verwenden.</p>
<p>Das war auch schon alles. Das Beispiel k&#246;nnt ihr euch hier ansehen und auch den Quellcode dazu runterladen:</p>
<p><a href="http://kau-boys.de/beispiele/google_maps_suggest/duplicate.html">Beispiel</a><br />
<a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest_duplicate.zip">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&#252;rde ich mich wie immer &#252;ber einen Kommentar sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Blog oder Website fit machen f&#252;r den IE6</title>
		<link>http://kau-boys.de/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=blog-oder-website-fit-machen-fuer-den-ie6</link>
		<comments>http://kau-boys.de/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&#252;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&#223;en ansehnlich pr&#228;sentiert bekommen. Das gr&#246;&#223;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&#252;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&#223;en ansehnlich pr&#228;sentiert bekommen.</p>
<p>Das gr&#246;&#223;te Problem ist oft, dass die sch&#246;nen Themes nicht auf den IE6 angepasst wurden und daher zu sehr unsch&#246;nen Darstellungen f&#252;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&#246;nnt sind die transparenten PNG Bilder im IE6 nicht transparent, da dieser nur transparente GIF Bilder unterst&#252;tzt. Viel schlimmer war aber, dass die Sidebar mit den Widgets komplett nach unten gerutscht war. Um das zu beheben h&#228;tte ich sehr viele Dinge im CSS Layout und vermutlich auch im HTML-Quellcode &#228;ndern m&#252;ssen. Daher habe ich &#252;berlegt, was man stattdessen tun k&#246;nnte.</p>
<h2>Die L&#246;sung: Google Chrome Frame</h2>
<p>Schon vor l&#228;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&#252;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&#252;gen:</p>
<pre class="brush: xml; gutter: false;">
&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&#252;r, dass das Plugin aktiviert wird und der Benutzer den Inhalt richtig dargestellt bekommt, vorausgesetzt nat&#252;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;">
&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&#228;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&#246;her keine Aufforderung bekommen. Au&#223;erdem m&#252;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&#252;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&#246;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&#246;nnt, sieht der Blog nun wieder richtig aus. Als kleinen Bonus des Plugins k&#246;nnt ihr auch den Inspektor nutzen, wie man ihn von Chrome oder Safari gew&#246;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&#252;rde interessieren, was ihr vom Google Chrome Frame haltet oder was f&#252;r euch dagegen spricht. Hat ihn vielleicht jemand auch im Einsatz und schon echte Probleme oder Nachteile damit feststellen k&#246;nnen? &#220;ber Kommentare w&#252;rde ich mich wie immer sehr freuen &#8230; &#252;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/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Google Maps Suggest &#8211; Adress-Autovervollst&#228;ndigung mit Scriptaculous</title>
		<link>http://kau-boys.de/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous</link>
		<comments>http://kau-boys.de/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&#228;ndigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zus&#228;tzlich kann sie dazu dienen, dass in einem Formular m&#246;glichst g&#252;ltige Werte gespeichert werden. Selbstverst&#228;ndlich m&#252;ssen alle Daten serverseitig erneut &#252;berpr&#252;ft werden. Ich m&#246;chte heute zeigen, wie einfach es mit Scriptaculous m&#246;glich ist, eine Autovervollst&#228;ndigung mit [...]]]></description>
			<content:encoded><![CDATA[<p>Viele nutzen Autovervollst&#228;ndigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zus&#228;tzlich kann sie dazu dienen, dass in einem Formular m&#246;glichst g&#252;ltige Werte gespeichert werden. Selbstverst&#228;ndlich m&#252;ssen alle Daten serverseitig erneut &#252;berpr&#252;ft werden.</p>
<p>Ich m&#246;chte heute zeigen, wie einfach es mit Scriptaculous m&#246;glich ist, eine Autovervollst&#228;ndigung mit Google-Maps-Adressen umzusetzen. Da man per AJAX nicht auf fremde Website einen AJAX-Request durchf&#252;hren kann, m&#252;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;">
$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; &#252;bergeben. Der Parameter &#8220;output&#8221; gibt hierbei das von Google Maps zur&#252;ckgelieferte Format an. Ich habe hier JSON verwendet und wandle die Daten anschlie&#223;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&#252;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&#252;ckgegeben. Mit Hilfe dieses einen Parameters k&#246;nnt ihr also sehr schnell die Funktion auf andere Spracheversionen eurer Seite anpassen.</p>
<p>Damit ihr &#252;berhaupt eine Anfrage an Google Maps stellen d&#252;rft, ben&#246;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&#228;ngen m&#252;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&#252;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&#252;ssen wir erst einmal ein Formular mit einem Textfeld erzeugen. Au&#223;erdem ben&#246;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;">
&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&#228;sst sich mit einer einzigen Zeile JavaScript erledigen. Selbstverst&#228;ndlich m&#252;ssen dazu noch im Kopfbereich die &#8220;prototype.js&#8221; sowie anschlie&#223;end die &#8220;scriptaculous.js&#8221; eingebunden werden. Die Funktion <a href="http://wiki.github.com/madrobby/scriptaculous/ajax-autocompleter">Ajax.Autocompleter()</a> geh&#246;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&#223;e ist kein Witz, sondern die Adresse von Google Deutschland. Eine weitere sch&#246;ne Eigenschaft von Google Maps ist die automatische Rechtschreibkorrektur, die bei fehlehaften Eingaben durchgef&#252;hrt wird. Selbst eine Eingabe wie &#8220;plazt der luftbl&#246;cke&#8221; f&#252;hrt trotzdem zu dem gew&#252;nschten Platz vor dem ehemaligen Berliner Flughafen. Um die Sache testen zu k&#246;nnen, habe ich hier ein kleines Beipsiel erstellt, dass ihr euch auch gerne im Quellcode runterladen k&#246;nnt. Ich habe zus&#228;tzlich noch eine Funktion verwendet, die den Suchbegriff hervorhebt:</p>
<p><a href="http://kau-boys.de/beispiele/google_maps_suggest/maps.html">Beispiel</a><br />
<a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest.zip">Download</a></p>
<p>Wir ihr also sehen k&#246;nnt, ist es mit der Ajax.Autocompleter() Funktion und einem servreseitigen Skript sehr einfach m&#246;glich, auch Daten von anderen Seiten auszuliefern. Das dazu ben&#246;tigte PHP Skript kann durch kleine Ver&#228;nderungen an die entsprechende extrene Datenquelle und das zur&#252;ckgelieferte Format angepasst werden. Die Funktion l&#228;sst sich aber nat&#252;rlich auch genauso gut mit jQuery oder einem anderen Framework umsetzen. Dazu muss dann aber eventuell das zur&#252;ckgelieferte Format des PHP Skript auch noch angepasst werden.</p>
<p>Ich hoffe das Beispiel hat euch gezeigt, wie vielf&#228;ltig sich eine Autovervollst&#228;ndigung einsetzen l&#228;sst. Habt ihr auch schon einmal mit externen Daten gearbeitet? Oder habt ihr vielleicht eine Idee, konntet sie aber bisher nicht umsetzen? &#220;ber ein Kommentar dazu w&#252;rde ich mich sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Die Grenzen der Frame-Weiterleitung sprengen</title>
		<link>http://kau-boys.de/webentwicklung/die-grenzen-der-frame-weiterleitung-sprengen?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=die-grenzen-der-frame-weiterleitung-sprengen</link>
		<comments>http://kau-boys.de/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&#252;nstige Domains ohne Webhosting Komponenten an. Bei einigen Hoster wie z.B. Strato handelt es sich aber leider nur um Domains mit der M&#246;glichkeit der Frame-Weiterleitung. Das ist aber teilweise vor der Bestellung nicht zu sehen. Manch einer wird sich eventuell dar&#252;ber freuen, da er irgendwo ein kostenloses Hosting mit einer sehr langen [...]]]></description>
			<content:encoded><![CDATA[<p>Viele Hoster bieten g&#252;nstige Domains ohne Webhosting Komponenten an. Bei einigen Hoster wie z.B. Strato handelt es sich aber leider nur um Domains mit der M&#246;glichkeit der Frame-Weiterleitung. Das ist aber teilweise vor der Bestellung nicht zu sehen.</p>
<p>Manch einer wird sich eventuell dar&#252;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&#228;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&#252;r den Besucher, wie er es erwartet. Er kann alle Links anklicken und der Hauptframe &#246;ffnet daraufhin die richtige Seite. Auch das Navigieren mit den &#8220;Vor&#8221; und &#8220;Zur&#252;ck&#8221; Buttons funktioniert tadellos. Aber sobald der Benutzer eine Seite gefunden hat, die er seinen Favoriten hinzuf&#252;gen m&#246;chte f&#228;ngt der &#196;rger an. Nicht nur, dass der Name des Lesezeichens oft nur die Domain enth&#228;lt, viel schlimmer ist, dass das Lesezeichen auch auf die selbige zeigt. Wenn der Besucher also sp&#228;ter das Lesezeichen aufruft kommt er nicht auf die gew&#252;nschte Seite, sondern auf die Startseite und muss von dort aus erst wieder m&#252;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&#228;llen, das eure Internet-Seiten, die tausende von Seiten haben k&#246;nnen, bei Suchmaschinen genau EINE Seite als Eintrag enthalten. Und das ist die Startseite oder genauer gesagt das Frameset der Domain. Eine M&#246;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&#228;nden auch nicht finden k&#246;nnen. Dabei k&#246;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&#246;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&#252;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&#228;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;">
&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 &#228;ndert die URL des Top-Frame auf einen neuen Wert. Wenn der Besucher also eure Domain aufruft, die lediglich eine Frame-Weiterleitung unters&#252;tzt, sorgt der Code daf&#252;r, dass das oberste Frameset auf eine andere URL umgeleitet wird. Hierbei m&#252;sste ihr natr&#252;lich &#8220;example.com&#8221; durch eure eigene Domain ersetzen (das &#8220;http://&#8221; dabei nicht vergessen). F&#252;r alle Besucher, die keine JavaScript Unterst&#252;tzung aktiviert haben solltet ihr zus&#228;tzlich einen NOSCRIPT Tag einf&#252;gen der einen Link enth&#228;lt:</p>
<pre class="brush: xml; gutter: false;">
&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&#246;nntet ihr auch noch den Request an die Domain anh&#228;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 &#228;hnlich in einer anderen Skriptsprache):</p>
<pre class="brush: php; gutter: false;">
&lt;script type=&quot;text/javascript&quot;&gt;
	top.location.href = &quot;http://example.com&quot;.$_SERVER['REQUEST_URI'];
&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&#246;nere Seite pr&#228;sentieren, als eine die nur den Link auf wei&#223;em Untergrund enth&#228;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&#246;nnt ihr euch das ganze in einem kleinen Beispiel auch ansehen.</del> <a href="http://kau-boys.de/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&#228;ndert. Dazu solltet ihr einfach JavaScript vor&#252;bergehen deaktivieren, damit ihr auch die Seite und den Quelltext betrachten k&#246;nnt. Wenn ihr dann JavaScript wieder aktiviert und die Seite aktualisiert, solltet ihr auf meinen Blog umgeleitet werden.</p>
<p><a href="http://kau-boys.ramarka.de">Beispiel</a></p>
<p>Mit diesem Trick k&#246;nnt ihr also die Frame-Weiterleitung umgehen, aber ihr pr&#228;sentiert dann dem Besucher die entsprechend andere URL, als sie aufgerufen haben. Dies sollte aber einer sch&#246;nen URL aber daf&#252;r der eingeschr&#228;nkten Suchmaschinenfreundlichkeit und der Verhinderung von Lesezeichen bevorzugt werden. Ihr k&#246;nnt weiterhin die sch&#246;ne URL in Mails verbreiten und den Besucher trotzdem umleiten. Wenn ihr die Domain vollst&#228;ndig nutzen m&#246;chtet bleibt euch leider nichts anderes M&#246;glich, als diese in das Webhosting-Paket zu &#252;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/webentwicklung/die-grenzen-der-frame-weiterleitung-sprengen/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Die magische select() Funktion!</title>
		<link>http://kau-boys.de/webentwicklung/die-magische-select-funktion?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=die-magische-select-funktion</link>
		<comments>http://kau-boys.de/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&#228;hlten DOM-Elements finden musste. Da ich hierf&#252;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/2009/08/27/einfacher-zeilen-duplizierer-mit-prototype/">Zeilen-Duplizierer</a> stand ich vor dem Problem, dass ich Elemente eines bestimmten Tags innerhalb eines ausgew&#228;hlten DOM-Elements finden musste. Da ich hierf&#252;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&#252;r die drei Formularfelder sah dann wie folgt aus:</p>
<p><span id="more-218"></span></p>
<pre class="brush: jscript;">
$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&#223;en. Damit konnte ich in einem ersten Versuch die gleiche Selektion mit folgenden Zeilen nachbilden:</p>
<pre class="brush: jscript;">
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&#228;ndlich. Die Funktion erlaubt das Selektrieren mit mehreren CSS-Selektoren. Dazu werden die CSS-Selektoren einfach als Parameter der Funktion &#252;bergeben:</p>
<pre class="brush: jscript;">
newRow.select('select', 'textarea', 'input')).each(function(elm){
	elm.clear().checked = '';
});
</pre>
<p>Diese Vereinfachung ist zwar nicht ganz sinnvoll, da hier auch f&#252;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&#246;nnt bietet die select() Funktion eine sehr einfache Selektion innerhalb eines bereits selektierten Elements. Zus&#228;tzlich zu der bereits beschriebenen Funktionalit&#228;t erweitert die select() Funktion die Elemente zus&#228;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;">
// gew&#246;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&#246;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&#228;sst sich beim Verarbeiten von selektierten Elementen einiges an Mehraufwand einsparen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/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/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=einfacher-zeilen-duplizierer-mit-prototype</link>
		<comments>http://kau-boys.de/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&#246;glich sein sollten. Meist wird dies durch mehrere Text-Felder gel&#246;st, die in einer Tabelle angeordnet sind. Um nun aber dem Benutzer die M&#246;glichkeit zu geben eine weitere Zeile einzuf&#252;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&#246;glich sein sollten. Meist wird dies durch mehrere Text-Felder gel&#246;st, die in einer Tabelle angeordnet sind. Um nun aber dem Benutzer die M&#246;glichkeit zu geben eine weitere Zeile einzuf&#252;gen musste oft das Formular &#8220;abgeschickt&#8221; werden, wobei aber der Speicher-Algorithmus umgangen wurde. Anschlie&#223;end wurde das gesamte Formular neu geladen mit einer neuen Zeile f&#252;r den entsprechenden Bereich.</p>
<p>Zum Gl&#252;ck sind wir heute wesentlich weiter. Zwar war eine L&#246;sung per JavaScript auch in der Vergangenheit schon m&#246;glich, aber durch die Verwendung modernen Frameworks wie Prototype l&#228;sst sich das gesamte Problem auf eine Zeile Code reduzieren:</p>
<p><span id="more-196"></span></p>
<pre class="brush: jscript; gutter: false;">
$$('#table tr').last().insert({'after' : this.cloneNode(true)});
</pre>
<p>Zugegeben, hier werden einige Funktionen in Reihe aufgerufen, aber diese Zeile Code l&#228;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 &#252;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&#228;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 &#252;bergeben und steht &#252;ber &#8220;this&#8221; zur Verf&#252;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&#252;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&#252;ssten die Felder zur&#252;ckgesetzt werden. Das ganze in eine Funktion gepackt und mit zweit Callback-Funktionen erweitert sieht dann wie folgt aus:</p>
<pre class="brush: jscript;">
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&#252;gen der neuen Zeile alle Felder zur&#252;ckgesetzt. Dazu werden die Formular-Elemente mit der <a href="http://www.prototypejs.org/api/element/select">select()</a> Funktion ausgew&#228;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&#252;ckgesetzt. Bei Radio-Buttons und Checkboxen werden zus&#228;tzlich die &#8220;checked&#8221; Attribute zur&#252;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;">
&lt;span onclick=&quot;addRow('table', {reset: true, beforeInsert: doSomeMagic})&quot;&gt;Zeile hinzuf&#252;gen&lt;/span&gt;
</pre>
<p>Bei diesem Beispiel-Button wurde der reset Parameter auf &#8220;true&#8221; gesetzt und zus&#228;tzlich der Name einer Callback-Funktion angegeben, die vor dem einf&#252;gen aufgerufen wird. Die Callback-Funktion &#8220;beforeInsert&#8221; bietet sich an, um z.B. LABEL Tags in der einzuf&#252;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&#252;gen vorgenommen werden sollte. Beide Callbacks erhalten eine Referenz auf die einzuf&#252;gende Zeile.</p>
<p>Als kleines Beispiel habe ich das Formular aus meinem <a href="http://kau-boys.de/2009/08/20/formular-vorschau-mit-jquery-thickbox/">vorherigen Post</a> etwas umgebaut und die Funktion zum Hinzuf&#252;gen einer E-Mail-Adresse eingesetzt. Hier das Beispiel und der Quellcode dazu:</p>
<p><a href="http://kau-boys.de/beispiele/formpreview/form_addrow.php">Beispiel</a><br />
<a href="http://kau-boys.de/beispiele/formpreview/formpreview_addrow.zip">Download</a></p>
<p>Hierbei kommt ein sehr viel komplexerer CSS-Selektor zum Einsatz:</p>
<pre class="brush: xml; gutter: false;">
&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&#246;nnt ihr die Funktion f&#252;r beliebige Elemente verwenden, bei denen es Sinn macht, sie zeilenweise zu duplizieren.</p>
<p>Falls ein jQuery-Profi unter euch ist, w&#252;rde mich eine L&#246;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&#252;rde mich diese aber auch interessieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Formular-Vorschau mit jQuery Thickbox</title>
		<link>http://kau-boys.de/webentwicklung/formular-vorschau-mit-jquery-thickbox?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=formular-vorschau-mit-jquery-thickbox</link>
		<comments>http://kau-boys.de/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&#252;r eines meiner Projekte habe ich eine kleine einfache Formular-Vorschau implementiert. Da ich mit dem Ergebnis und der Einfachheit sehr zufrieden bin, m&#246;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&#246;glichkeit dar, die Vorschau umzusetzen. Im Grunde ist [...]]]></description>
			<content:encoded><![CDATA[<p>F&#252;r eines meiner Projekte habe ich eine kleine einfache Formular-Vorschau implementiert. Da ich mit dem Ergebnis und der Einfachheit sehr zufrieden bin, m&#246;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&#246;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&#252;r ein sehr viel komplexeres Formular ein und verwende f&#252;r die Vorschau-Funktion auch das Skript, &#252;ber das die Daten sp&#228;ter dem Benutzer ausgegeben werden. Die Vorgehensweise ist aber von der Art und dem Umfang des Formulars unabh&#228;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&#252;rlich k&#246;nnte man es noch um die Felder f&#252;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 &#252;ber die Javascript-Funktion aufgerufen werden kann. Anschlie&#223;end muss ein Button f&#252;r die Vorschau eingef&#252;gt werden. Dieser sollte am besten ausgeblendet werden, wenn der Nutzer kein JavaScript aktiviert hat.</p>
<pre class="brush: xml; gutter: false;">
&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&#228;lt die <a href="http://jquery.com/demo/thickbox/#container-4">Parameter f&#252;r die Thickbox</a>. Zus&#228;tzlich muss die CSS-Klasse thickbox zugewiesen werden, um bei einem Klick auf den Button die Thickbox zu aktivieren. Das ID Attribut wird f&#252;r den Aufruf der JavaScript Funktion durch die click() Funktion von jQuery ben&#246;tigt. Hier ist nat&#252;rlich auch ein inline Attribut wie onmousedown m&#246;glich, aber das w&#228;re nicht sehr jQuery-Style.</p>
<p>Anschlie&#223;end aktivieren wir den Eventhandler f&#252;r den Button zum Aufruf der Vorschau-Funktion:</p>
<pre class="brush: jscript; gutter: false;">
$('#previewbutton').click(function(){
	formPreview('mailsend', 'mailpreview.php', 'mailpreviewiframe');
});
</pre>
<p>Der erste Parameter der Funktion steht f&#252;r die ID des Formular, der zweite f&#252;r die Seite, die zur Anzeige der Vorschau verwendet wird. Der dritte f&#252;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;">
&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&#252;r die Thickbox-Parameter verwendet.</p>
<p>Was geschiet nun bei einem Klick auf den Vorschau-Button? Zuerst wird die Thickbox-Funktion ausgef&#252;hrt und das DIV in die Thickbox verschoben. Mit einer kleinen Verz&#246;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&#223;erdem vor dem Absenden das Action Attribut ausgetauscht und direkt nach dem Absenden wieder auf seinen Ursprungszustand zur&#252;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&#228;teren Ausgabeseite geschiet, entspricht die Darstellung sehr genau dem sp&#228;teren Ergebnis. Dazu sollten dann eventuell Daten aus der Datenbank nachgeladen werden oder Werte entsprechend des Speicheralgorithmus ver&#228;ndert werden. Bei komplexen Formularen kann es auch sinnvoll sein, die Daten &#252;ber die regul&#228;re Speicherfunktion in eine tempor&#228;re Tabelle zu speichern, um sie direkt wieder auszulesen. In meinem Projekt lade ich beispielsweise Daten f&#252;r die ausgew&#228;hlten SELECT Felder nach und wende die Datenbank-Escape-Funktionen an. Danach f&#252;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 &#246;ffnen.</p>
<pre class="brush: xml; gutter: false;">
&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&#246;chte, kann ihn auch gerne hier downloaden. </p>
<p><a href="http://kau-boys.de/beispiele/formpreview/form.php">Beispiel</a><br />
<a href="http://kau-boys.de/beispiele/formpreview/formpreview.zip">Download</a></p>
<p>Noch ein Wort zum Formular-Design. Da ich nicht gerade die Geduld und die Begabung f&#252;r sch&#246;ne Formular habe, wurde f&#252;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&#246;ne Formulare f&#252;r das Beispiel erzeugen.</p>
<p><strong>Noch ein kleiner Bonustipp:</strong> F&#252;r Funktionen, die zwingend JavaScript erfodern, sollten diese ausgeblendet werden, wenn der Nutzer kein JavaScript aktiviert hat. Dazu einfach eine CSS-Klasse f&#252;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 &#252;berschrieben werden. Somit erspart man dem Nutzer ohne JavaScript die unn&#246;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/webentwicklung/formular-vorschau-mit-jquery-thickbox/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Kau-Boy&#8217;s AutoCompleter Plugin</title>
		<link>http://kau-boys.de/wordpress/kau-boys-autocompleter-plugin?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=kau-boys-autocompleter-plugin</link>
		<comments>http://kau-boys.de/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[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&#228;ge zu finden, die den Suchbegriff im Titel oder Inhaltstext enthalten. Der eingegebene Text kann in den Titel der Beitr&#228;ge und/oder im Inhalt gesucht werden. Es kann zus&#228;tzlich die Formatierung der Ergebnisse &#252;ber eine eigene CSS Datei an den Blog angepasst werden. [...]]]></description>
			<content:encoded><![CDATA[<p>Dieses Plugin verwendet den Ajax.Autocompleter von script.aculo.us bzw. die jQuery Autocomplete Funktoin um Beitr&#228;ge zu finden, die den Suchbegriff im Titel oder Inhaltstext enthalten.</p>
<p>Der eingegebene Text kann in den Titel der Beitr&#228;ge und/oder im Inhalt gesucht werden. Es kann zus&#228;tzlich die Formatierung der Ergebnisse &#252;ber eine eigene CSS Datei an den Blog angepasst werden. Es kann jeweils der Titel oder zus&#228;tzlich ein Teil des Inhalts angegeben werden, wobei hier auch die L&#228;nge des auszugebenden Inhaltes eingestellt werden kann.</p>
<p><span id="more-24"></span></p>
<h2>Installation:</h2>
<h3>Installation &#252;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&#228;hle das Plugin aus</li>
<li>W&#228;hle die Aktion <code>Jetzt installieren</code></li>
<li>Klicke auf <code>Jetzt installieren</code></li>
<li>Aktiviere das Plugin &#252;ber den <code>Plugins</code> Men&#252;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.2.2.zip">kau-boys-autocompleter.2.2.zip</a></li>
<li>Gehe zur Admin-Seite <code>Plugins -&gt; Installieren</code></li>
<li>W&#228;hle den Link <code>Hochladen</code> unter <code>Plugins Installieren</code> &#220;berschrift</li>
<li>W&#228;hle die zip-Datei aus und klicke <code>Jetzt installieren</code></li>
<li>Aktiviere das Plugin &#252;ber den <code>Plugins</code> Men&#252;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.2.2.zip">kau-boys-autocompleter.2.2.zip</a></li>
<li>Entpacke es und lade es in dein <code>/wp-content/plugins/</code> Verzeichnis hoch</li>
<li>Aktiviere das Plugin &#252;ber den <code>Plugins</code> Men&#252;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&#228;ltlich)</h3>
<p><img title="Screenshot der Einstellungsseite (auch in englisch erh&#228;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>2.2</strong> Deaktivieren der Suche f&#252;r Suchfelder im Adminbereich und Erm&#246;glichen der Verwendung zusammen mit dem relevanssi Plugin</li>
<li><strong>2.1</strong> Hinzuf&#252;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&#252;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&#252;gen der Einstellung f&#252;r die L&#228;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&#246;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&#252;gen der M&#246;glichkeit das Suchfeldes anhand des name Atrrbiuts auszuw&#228;hlen</li>
<li><strong>1.5.2</strong> Hinzuf&#252;gen der richtigen Kodierung zu <code>html_entity_decode()</code> um das Zerteilen von XML Enit&#228;ten zu verhindern</li>
<li><strong>1.5.1</strong> Fehler im AJAX repsonse behoben, der die Einstellung f&#252;r die Ergebnisfelder nicht geladen hat</li>
<li><strong>1.5</strong> Hinzuf&#252;gen Auswahlm&#246;glichkeiten f&#252;r die Such- und Ergebnisfelder</li>
<li><strong>1.4.1</strong> Aktualisierung der &#220;bersetzungsdatei</li>
<li><strong>1.4</strong> Kombinieren der Styles f&#252;r jQuery und script.aculo.us, Hinzuf&#252;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&#228;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&#246;glichkeit jQuery ODER script.aculo.us zu verwenden, &#220;bersetzen der Einstellungsseite ins Deutsche</li>
<li><strong>0.4</strong> Hinzuf&#252;gen der Einstellung f&#252;r die Anzahl der Suchergebnisse und der eigenen CSS Date</li>
<li><strong>0.3</strong> Hinzuf&#252;gen der Einstellung f&#252;r die Suchfeld ID</li>
<li><strong>0.2</strong> Erste stabile Version</li>
</ul>
<p>Wenn dir dieses Plugin gef&#228;llt oder dir etwas fehlt, w&#252;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/wordpress/kau-boys-autocompleter-plugin/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
	</channel>
</rss>
