<?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>Alexander Stelter - foo, bar, baz &#187; Javascript</title>
	<atom:link href="http://www.alexander-stelter.de/blog/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alexander-stelter.de/blog</link>
	<description>PHP, Javascript, Doctrine, Internet, Bücher, Real-Life</description>
	<lastBuildDate>Sun, 25 Jul 2010 11:27:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JSON Strings debuggen mit www.jsonlint.com</title>
		<link>http://www.alexander-stelter.de/blog/241-json-strings-debuggen-mit-www-jsonlint-com/</link>
		<comments>http://www.alexander-stelter.de/blog/241-json-strings-debuggen-mit-www-jsonlint-com/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 11:01:06 +0000</pubDate>
		<dc:creator>Alexander</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[jsonlint]]></category>
		<category><![CDATA[solr]]></category>

		<guid isPermaLink="false">http://www.alexander-stelter.de/blog/?p=241</guid>
		<description><![CDATA[Wer ab und an mal was mit JSON machen muss, der ist darauf angewiesen, dass die Tools, die man verwendet, um JSON Output zu generieren, valide arbeiten. Ist dies nicht der Fall, steht man idr. vor einem Rätsel, denn die Daten sind mitunter ja recht komplex und zusätzlich auch ewig lang. Vor diesem Problem stand [...]]]></description>
			<content:encoded><![CDATA[<p>Wer ab und an mal was mit <a href="http://de.wikipedia.org/wiki/JSON" >JSON</a> machen muss, der ist darauf angewiesen, dass die Tools, die man verwendet, um JSON Output zu generieren, valide arbeiten. Ist dies nicht der Fall, steht man idr. vor einem Rätsel, denn die Daten sind mitunter ja recht komplex und zusätzlich auch ewig lang. Vor diesem Problem stand ich heute auch. Der JSON Output, den mir meine <a href="http://lucene.apache.org/solr/" >Solr</a> Schnittstelle liefert, wollte und wollte nicht durch den <a href="http://us.php.net/manual/de/ref.json.php" >PHP JSON Parser</a> decodiert werden. Auf der Suche nach einer Lösung fand ich (wie so oft) in den <a href="http://de.php.net/json_decode" >Kommentaren des PHP Manuals</a> nützliche Hinweise. Es gibt ein Webseite, auf der man seinen JSON Output eingeben kann, und dann erfährt, ob der Code valide ist und wenn nicht, wo der Fehler liegt. Einfach wunderbar! Zu finden hier: <a href="http://www.jsonlint.com/" >www.jsonlint.com</a>. Man solle evtl. dazu sagen, dass es sich hierbei um einen fremden Server handelt, wo man am besten keine vertraulichen Daten hinschicken sollte, auch wenn man diese validieren muss <img src='http://www.alexander-stelter.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=JSON+Strings+debuggen+mit+www.jsonlint.com+http://bit.ly/cdONor" title="Post to Twitter"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://www.alexander-stelter.de/blog/241-json-strings-debuggen-mit-www-jsonlint-com/&amp;title=JSON+Strings+debuggen+mit+www.jsonlint.com" title="Post to Delicious"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://www.alexander-stelter.de/blog/241-json-strings-debuggen-mit-www-jsonlint-com/&amp;title=JSON+Strings+debuggen+mit+www.jsonlint.com" title="Post to Digg"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://www.alexander-stelter.de/blog/241-json-strings-debuggen-mit-www-jsonlint-com/&amp;t=JSON+Strings+debuggen+mit+www.jsonlint.com" title="Post to Facebook"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.alexander-stelter.de/blog/241-json-strings-debuggen-mit-www-jsonlint-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YUI 3 Preview Release veröffentlicht</title>
		<link>http://www.alexander-stelter.de/blog/224-yui-3-preview-release-veroffentlicht/</link>
		<comments>http://www.alexander-stelter.de/blog/224-yui-3-preview-release-veroffentlicht/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 08:43:22 +0000</pubDate>
		<dc:creator>Alexander</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[golem]]></category>
		<category><![CDATA[previewrelease]]></category>
		<category><![CDATA[yui]]></category>
		<category><![CDATA[yui 2]]></category>
		<category><![CDATA[yui 3]]></category>

		<guid isPermaLink="false">http://www.alexander-stelter.de/blog/?p=224</guid>
		<description><![CDATA[Wie heute bei golem zu lesen war haben die Entwickler von YUI eine Previewversion des neuen Releases 3 zur Verfügung gestellt. Besonderes Merkmal dabei ist, dass diese Version schneller und sicherer sein soll, als seine Vorgänger. Die Entwickler geben dem Anwendungsentwickler mehr Möglichkeiten die Eventsteuerung selbst zu übernehmen und wollen das Framework modularer aufbauen. Viele [...]]]></description>
			<content:encoded><![CDATA[<p>Wie heute bei <a href="http://http://www.golem.de/0808/61717.html" >golem zu lesen</a> war haben die Entwickler von YUI eine Previewversion des neuen Releases 3 <a href="http://developer.yahoo.com/yui/3/" >zur Verfügung gestellt</a>. Besonderes Merkmal dabei ist, dass diese Version schneller und sicherer sein soll, als seine Vorgänger. Die Entwickler geben dem Anwendungsentwickler mehr Möglichkeiten die Eventsteuerung selbst zu übernehmen und wollen das Framework modularer aufbauen. Viele weitere Neuerungen finden sich auf der <a href="http://developer.yahoo.com/yui/3/" >YUI Webseite</a>.</p>
<p>Ein Einschnitt dabei ist sicherlich, dass Code, der für YUI 2 entwickelt worden ist, unter YUI 3 wohl nicht mehr funktionieren wird. Es wird wohl einen Kompatibilitätslayer geben, der die wichtigsten Parts weiterhin verfügbar macht.</p>
<p>Das macht für mich einen sehr guten Eindruck. Ich war ja zuvor schon begeistert von YUI und habe auch schon recht viel damit gemacht. Ich bin mal gespannt, was zum Release alles im Paket enthalten sein wird und freue mich die neuen Komponenten bei neuen Projekten auszuprobieren. Solange YUI 2 keine gravierenden Bugs aufweist, würde ich davon absehen bestehende Projekte auf die neue Version 3 zu portieren. Aber warten wir erstmal den Release ab <img src='http://www.alexander-stelter.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=YUI+3+Preview+Release+ver%C3%B6ffentlicht+http://bit.ly/diNpvK" title="Post to Twitter"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://www.alexander-stelter.de/blog/224-yui-3-preview-release-veroffentlicht/&amp;title=YUI+3+Preview+Release+ver%C3%B6ffentlicht" title="Post to Delicious"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://www.alexander-stelter.de/blog/224-yui-3-preview-release-veroffentlicht/&amp;title=YUI+3+Preview+Release+ver%C3%B6ffentlicht" title="Post to Digg"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://www.alexander-stelter.de/blog/224-yui-3-preview-release-veroffentlicht/&amp;t=YUI+3+Preview+Release+ver%C3%B6ffentlicht" title="Post to Facebook"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.alexander-stelter.de/blog/224-yui-3-preview-release-veroffentlicht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YUI statt json.js</title>
		<link>http://www.alexander-stelter.de/blog/199-yui-statt-json-js/</link>
		<comments>http://www.alexander-stelter.de/blog/199-yui-statt-json-js/#comments</comments>
		<pubDate>Thu, 15 May 2008 08:48:00 +0000</pubDate>
		<dc:creator>Alexander</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[active-x]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[yahoo]]></category>
		<category><![CDATA[yui]]></category>

		<guid isPermaLink="false">http://www.alexander-stelter.de/blog/?p=199</guid>
		<description><![CDATA[Wie ich vor einer Weile berichtete, kann man mit JSON eine Menge anstellen. Was mich immer ein wenig geärgert hat, wenn wir JSON und YUI gemeinsam eingesetzt haben, dass es keine integrierte Lösung gab. Man mußte immer die YUI API laden und zusätzlich die json.js. Dies ist nun seit der Version 2.5.0 vorbei, denn YUI [...]]]></description>
			<content:encoded><![CDATA[<p>Wie ich vor einer Weile <a href="http://www.alexander-stelter.de/blog/archives/9-JavaScript-Object-Notation-JSON.html" >berichtete</a>, kann man mit <a href="http://www.json.org/" >JSON</a> eine Menge anstellen. Was mich immer ein wenig geärgert hat, wenn wir JSON und <a href="http://developer.yahoo.com/yui/" >YUI</a> gemeinsam eingesetzt haben, dass es keine integrierte Lösung gab. Man mußte immer die YUI API laden und zusätzlich die json.js. Dies ist nun seit der Version 2.5.0 vorbei, denn YUI integriert die JSON API in deren eigenen Code und stellt einen Wrapper zur Verfügung.</p>
<p>Mit folgenden Code-Schnipseln kann man einen JSON-String in ein Array umwandeln:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">try</span>
<span style="color: #009900;">&#123;</span> 
<span style="color: #003366; font-weight: bold;">var</span> prod <span style="color: #339933;">=</span> YAHOO.<span style="color: #660066;">lang</span>.<span style="color: #660066;">JSON</span>.<span style="color: #660066;">parse</span><span style="color: #009900;">&#40;</span>jsonString<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span>
<span style="color: #000066; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Invalid product data&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Ebenfalls ist es möglich aus einem Array einen JSON String umzuwandeln. Das Beispiel findet sich im <a href="http://developer.yahoo.com/yui/json/" >JSON Manual</a> der YUI Seite. Wer YUI und JSON gemeinsam verwendet, kann sich nun getrost zurücklehnen und alles aus einem Guß verwenden <img src='http://www.alexander-stelter.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=YUI+statt+json.js+http://bit.ly/9u6O0R" title="Post to Twitter"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://www.alexander-stelter.de/blog/199-yui-statt-json-js/&amp;title=YUI+statt+json.js" title="Post to Delicious"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://www.alexander-stelter.de/blog/199-yui-statt-json-js/&amp;title=YUI+statt+json.js" title="Post to Digg"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://www.alexander-stelter.de/blog/199-yui-statt-json-js/&amp;t=YUI+statt+json.js" title="Post to Facebook"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.alexander-stelter.de/blog/199-yui-statt-json-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neue YUI Version 2.5.0</title>
		<link>http://www.alexander-stelter.de/blog/157-neue-yui-version-2-5-0/</link>
		<comments>http://www.alexander-stelter.de/blog/157-neue-yui-version-2-5-0/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 20:11:39 +0000</pubDate>
		<dc:creator>Alexander</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[golem]]></category>
		<category><![CDATA[yui]]></category>

		<guid isPermaLink="false">http://www.alexander-stelter.de/blog/?p=157</guid>
		<description><![CDATA[Wie heute bei Golem zu lesen war, wurde heute die neue Version der YAHOO User Interface Library (YUI) veröffentlicht. Die mitlerweile sehr gewachsene Komponentensammlung unterstützt nun auch endlich einen Multiuploader, mit dem man mehrere Dateien in einem Prozess hochladen kann. Dies geschieht mit einer ähnlichen Technik wie bei SWF Upload.
Wer viel und komplex mit Javascript [...]]]></description>
			<content:encoded><![CDATA[<p>Wie heute bei <a href="http://www.golem.de/0802/57854.html" >Golem</a> zu lesen war, wurde heute die neue Version der YAHOO User Interface Library (<a href="http://developer.yahoo.com/yui/" >YUI</a>) veröffentlicht. Die mitlerweile sehr gewachsene Komponentensammlung unterstützt nun auch endlich einen Multiuploader, mit dem man mehrere Dateien in einem Prozess hochladen kann. Dies geschieht mit einer ähnlichen Technik wie bei <a href="http://swfupload.org/" >SWF Upload</a>.<br />
Wer viel und komplex mit Javascript entwickeln muss findet mit YUI eine gute Sammlung an Komponenten, die das Leben doch schon sehr erleichtern und viel Arbeit abnehmen. Eine komplexe Anwendung als Beispiel der Praxistauglichkeit von YUI kann man <a href="http://developer.yahoo.com/yui/examples/layout/adv_layout_source.html" >hier</a> bewundern. Besonders herrauszuheben sind die Connection-, Dom- und Event-Komponente, mit der sich in wenigen Schritten eigene Ajax-Anwendungen stricken lassen.<br />
Einziges Manko bei YUI ist für mich die doch sehr komplexe Code-Struktur, die ziemlich große Javascript-Files zur Folge hat. Allerdings &#8220;erkauft&#8221; man sich damit eine hohes Maß an Flexibilität bei der Entwicklung von Javascript-Applikationen.</p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=Neue+YUI+Version+2.5.0+http://bit.ly/93esLD" title="Post to Twitter"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://www.alexander-stelter.de/blog/157-neue-yui-version-2-5-0/&amp;title=Neue+YUI+Version+2.5.0" title="Post to Delicious"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://www.alexander-stelter.de/blog/157-neue-yui-version-2-5-0/&amp;title=Neue+YUI+Version+2.5.0" title="Post to Digg"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://www.alexander-stelter.de/blog/157-neue-yui-version-2-5-0/&amp;t=Neue+YUI+Version+2.5.0" title="Post to Facebook"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.alexander-stelter.de/blog/157-neue-yui-version-2-5-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Events ohne embedded Javascript: Behaviours</title>
		<link>http://www.alexander-stelter.de/blog/28-events-ohne-embedded-javascript-behaviours/</link>
		<comments>http://www.alexander-stelter.de/blog/28-events-ohne-embedded-javascript-behaviours/#comments</comments>
		<pubDate>Sun, 03 Jun 2007 10:55:08 +0000</pubDate>
		<dc:creator>Alexander</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[behaviours]]></category>
		<category><![CDATA[bitv]]></category>
		<category><![CDATA[onclick]]></category>

		<guid isPermaLink="false">http://www.alexander-stelter.de/blog/?p=28</guid>
		<description><![CDATA[Im Zeitalter von BITV muss sich der Webmaster Gedanken darüber machen, wie er seinen Code strukturiert, damit auch z.B. Browser für Sehbehinderte den Seiteninhalt korrekt wieder geben können. Hierbei ist ein Schritt eingebettes Javascript aus dem HTML Quellcode zu entfernen,.
Hierzu verwenden wir CSS Klassen und Ids um anhand deren Werte Javascript Funktionen zu verdrahten. Browser, [...]]]></description>
			<content:encoded><![CDATA[<p>Im Zeitalter von <a href="http://www.einfach-fuer-alle.de/artikel/bitv/"  title="BITV">BITV</a> muss sich der Webmaster Gedanken darüber machen, wie er seinen Code strukturiert, damit auch z.B. Browser für Sehbehinderte den Seiteninhalt korrekt wieder geben können. Hierbei ist ein Schritt eingebettes Javascript aus dem HTML Quellcode zu entfernen,.<br />
Hierzu verwenden wir CSS Klassen und Ids um anhand deren Werte Javascript Funktionen zu verdrahten. Browser, die kein Javascript und / oder CSS unterstützen interpretieren diese Anweisungen schlichtweg nicht und können trotzdem den Inhalt der Seite wiedergeben.</p>
<p>Diese kleine Vorführung erhebt keinen Anspruch auf Vollständigkeit. CSS ist in diesem Beispiel eingebettet. Dies sollte in der Regel auch ausgelagert werden <img src='http://www.alexander-stelter.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Hier nur der Einfachheit halber, da es für die Demonstration nur untergeordnete Bedeutung hat. Wichtiger sind die Klassen und IDs der HTML-Elemente.<span id="more-28"></span><br />
Als Basis unserer kleinen Übung verwenden wir folgende HTML-Seite:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt; !DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;
&nbsp;
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Untitled&lt;/title&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;common-01.js&quot;&gt;&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div id=&quot;container&quot;&gt;
			&lt;ul&gt;
				&lt;li class=&quot;DELETE element-01&quot; style=&quot;cursor: pointer;&quot;&gt;01 Element&lt;/li&gt;
				&lt;li class=&quot;DELETE element-02&quot; style=&quot;cursor: pointer;&quot;&gt;02 Element&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>Zunächst macht diese Seite noch garnichts. Das Ziel ist es, möglichst einfach zu konfigurierende Events hinzufügen zu können und diese mit den jeweiligen Elementen zu verdrahten. Hier in unserem Beispiel möchten wir, dass ein Element onclick ausgeblendet wird.<br />
Dazu legen wir jetzt ein Array mit Regeln in der Javascript-Datei an:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> CommonBehaviourRules <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
CommonBehaviourRules<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'li'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
CommonBehaviourRules<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'li'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'DELETE'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">visibility</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'hidden'</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">display</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'none'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Wir erzeugen ein Array, welches in der ersten Dimension den Namen des HTML-Elements enthält und in der zweiten Dimension den Namen der CSS-Klasse. Diese CSS-Klasse hat als Wert eine Funktion, die das Element ausblendet.</p>
<p>Sehen wir uns nun die Funktion an, die später die Arbeit für uns verrichten wird:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> executeOnClickBehaviourRules <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span> RootNode <span style="color: #339933;">,</span> BehaviourRules <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	RootNode <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span> <span style="color: #009900;">&#40;</span> RootNode <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> RootNode <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> BehaviourRules <span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> Element <span style="color: #000066; font-weight: bold;">in</span> BehaviourRules <span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				Elements <span style="color: #339933;">=</span> RootNode.<span style="color: #660066;">getElementsByTagName</span> <span style="color: #009900;">&#40;</span> Element <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> Elements.<span style="color: #660066;">length</span> <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
					<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> Elements.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
					<span style="color: #009900;">&#123;</span>
						className <span style="color: #339933;">=</span> Elements<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">className</span>.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">' '</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
						<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> BehaviourRules<span style="color: #009900;">&#91;</span>Element<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>className<span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
						<span style="color: #009900;">&#123;</span>
							Elements<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">onclick</span> <span style="color: #339933;">=</span> BehaviourRules<span style="color: #009900;">&#91;</span>Element<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>className<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
						<span style="color: #009900;">&#125;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Die Formatierung leidet ein wenig unter der Darstellung. Die Funktion erwartet zwei Parameter. Zum einen den HTML-Node, an dem die Transformierung beginnen soll und zum anderen die Regeln, die angewendet werden sollen. Wir können beliebig viele Funktionen als Regeln definieren. Für unseren Test verarbeiten wir hier nur onclick-Events.<br />
Nach dem Aufruf prüft die Funktion zunächst, ob der RootNode und die jeweiligen BehaviourRules vorhanden sind. Dann werden die Elemente nach und nach durchgegangen und die entsprechenden Funktionen auf die Elemente gelegt.<br />
Jetzt hilft uns diese Funktion noch nicht weiter, weil sie noch nicht aufgerufen wird, dies erledigen wir so:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> construct <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	executeOnClickBehaviourRules <span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'container'</span> <span style="color: #339933;">,</span> CommonBehaviourRules <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> construct<span style="color: #339933;">;</span></pre></div></div>

<p>Wir legen eine neue Funktion &#8220;construct&#8221; an und rufen übergeben diese an window.onload. Diese wird dann analog zum Body-Attribut onload=&#8221;" aufgerufen. In ihr rufen wir dann unsere Funktion auf. Jetzt können wir auch sehen, dass wir beliebig viele Regeln auf unterschiedliche Ebenen beschränken können. Getestet ist dies im <a href="http://de.wikipedia.org/wiki/Internet_Explorer"  title="IE 6">IE 6 und im <a href="www.mozilla.com"  title="Firefox">FFX 2</a>.</p>
<p>Ich hoffe dieser kleine Exkurs hat gezeigt, wie mächtig dieses Werkzeug ist. Frameworks wie <a href="www.prototypejs.org"  title="Prototype">Prototype</a> oder <a href="http://developer.yahoo.com/yui/"  title="Yui">Yui</a> bieten dafür natürlich fertige Lösungen, aber ich bin der Meinung, dass man für Kleinigkeiten nicht unbedingt die großen Bibliotheken einbinden muss, bzw. das es auch gut ist zu wissen, wie diese Techniken funktionieren <img src='http://www.alexander-stelter.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p>Bei Fragen, Anregungen etc. einfach einen Kommentar hinterlassen.</p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=Events+ohne+embedded+Javascript%3A+Behaviours+http://bit.ly/cWbFfb" title="Post to Twitter"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://www.alexander-stelter.de/blog/28-events-ohne-embedded-javascript-behaviours/&amp;title=Events+ohne+embedded+Javascript%3A+Behaviours" title="Post to Delicious"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://www.alexander-stelter.de/blog/28-events-ohne-embedded-javascript-behaviours/&amp;title=Events+ohne+embedded+Javascript%3A+Behaviours" title="Post to Digg"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://www.alexander-stelter.de/blog/28-events-ohne-embedded-javascript-behaviours/&amp;t=Events+ohne+embedded+Javascript%3A+Behaviours" title="Post to Facebook"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.alexander-stelter.de/blog/28-events-ohne-embedded-javascript-behaviours/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript Entwicklung mit Prototype</title>
		<link>http://www.alexander-stelter.de/blog/18-javascript-entwicklung-mit-prototype/</link>
		<comments>http://www.alexander-stelter.de/blog/18-javascript-entwicklung-mit-prototype/#comments</comments>
		<pubDate>Wed, 07 Mar 2007 19:26:15 +0000</pubDate>
		<dc:creator>Alexander</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://www.alexander-stelter.de/blog/?p=18</guid>
		<description><![CDATA[Heute möchte ich ein interessantes Framework vorstellen, welches die Entwicklung mit JavaScript extrem vereinfacht und dem Entwickler (größtenteils Cross-Browser) viele Dinge vereinfacht. Hierbei handelt es sich um Prototype. Entstanden ist es ursprünglich aus dem Framework Ruby on Rails.
Als Beispiel nehmen wir ein Formular, welches eine Anfrage via AJAX an den Server schickt und die Antwort [...]]]></description>
			<content:encoded><![CDATA[<p>Heute möchte ich ein interessantes Framework vorstellen, welches die Entwicklung mit JavaScript extrem vereinfacht und dem Entwickler (größtenteils <strong>Cross-Browser</strong>) viele Dinge vereinfacht. Hierbei handelt es sich um <strong><a title="prototype" href="http://www.prototypejs.org">Prototype</a></strong>. Entstanden ist es ursprünglich aus dem Framework <a title="Ruby on Rails" href="http://www.rubyonrails.org/">Ruby on Rails</a>.</p>
<p>Als Beispiel nehmen wir ein Formular, welches eine Anfrage via <a title="AJAX" href="http://de.wikipedia.org/wiki/Ajax_%28Programmierung%29">AJAX</a> an den Server schickt und die Antwort des Servers wieder in das Script zurückholt. Hierzu verwenden wir die eingebettete <a title="JSON" href="http://www.alexander-stelter.de/blog/archives/9-JavaScript-Object-Notation-JSON.html">JSON</a>-Funktionalität. Hierbei sei zu beachten, dass Prototype auf einem JSON-Objekt auch nur mit <em>eval()</em> operiert. Hier besteht also bei Produktivanwendungen noch Prüfungsbedarf. Mit Prototype kann man auf jeden Fall vor der Ausgabe Script-, HTML-Tags etc. entfernen lassen, wenn man das möchte. Das schützt allerdings nicht vor dem Angriff durch JavaScript, welches sich in der Response des Servers befindet und direkt ausgeführt werden könnte.<span id="more-18"></span><br />
JSON kann bei Prototype via Header und &#8220;normaler&#8221; Übergabe übertragen werden. Bei der Übergabe per Header muss der X-JSON-Header gesendet werden. Bei größeren Datenmengen empfielt sich jedoch wieder das <em>echo</em>. Dies wird von Prototype erkannt, wenn der Content-Type <em>text/javascript</em> ist. Ich stelle hier die Lösung mit X-JSON-Header vor. Wichtig ist hier wieder, dass die JSON-Extention[3] für PHP installiert ist, bzw. eincompiliert[2] ist.</p>
<p>Beginnen wir also mit dem AJAX-Beispiel. Vorrausgesetzt ist hier, dass die Datei <em>prototype.js</em> korrekt im Header der HTML-Seite eingebunden ist, ich denke das muss ich nicht erklären <img src='http://www.alexander-stelter.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Für die eigenen Funktion verwende ich eine weitere JavaScript-Datei <em>article-prototype.js</em>. Falls das doch jemandem nicht ganz klar sein sollte, verweise ich jetzt mal frech auf selfhtml[4]. Ich verwende hier auch Inline-JavaScript, was ich eigentlich mittels Behaviours verstecken würde, aber das wird evtl. Thema eines neuen Artikels sein <img src='http://www.alexander-stelter.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p>Zunächst basteln wir uns eine HTML-Seite, die eine FORM enthält, in der man mittels einer Selectbox einen oder alle Datensätze wählen kann:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;h2&gt;Daten wählen&lt;/h2&gt;
&nbsp;
&lt;form action=&quot;#&quot; method=&quot;post&quot;&gt;
	&lt;label for=&quot;datensatz&quot;&gt;Datensätze ausgeben&lt;/label&gt;
&lt;select id=&quot;datensatz&quot; name=&quot;datensatz&quot;&gt;
		&lt;option value=&quot;0&quot;&gt;Alle Datensätze&lt;/option&gt;
		&lt;option value=&quot;1&quot;&gt;Datensatz 1&lt;/option&gt;
		&lt;option value=&quot;2&quot;&gt;Datensatz 2&lt;/option&gt;
		&lt;option value=&quot;3&quot;&gt;Datensatz 3&lt;/option&gt;
		&lt;option value=&quot;4&quot;&gt;Datensatz 4&lt;/option&gt;
		&lt;option value=&quot;5&quot;&gt;Datensatz 5&lt;/option&gt;
	&lt;/select&gt;
&lt;input onclick=&quot;RequestData();&quot; type=&quot;button&quot; value=&quot;Daten abholen&quot; /&gt;
&lt;/form&gt;
&nbsp;
&lt;h2&gt;Ausgabe&lt;/h2&gt;
&nbsp;
&nbsp;
&lt;div id=&quot;output&quot;&gt;Keine Daten ausgewählt&lt;/div&gt;</pre></div></div>

<p>Jetzt legen wir eine Funktion an, die unseren AJAX-Aufruf beherbergt:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> RequestData <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   <span style="color: #003366; font-weight: bold;">new</span> Ajax.<span style="color: #660066;">Request</span>
   <span style="color: #009900;">&#40;</span>
      <span style="color: #3366CC;">'/test/prototype-server.php'</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#123;</span>
	   method<span style="color: #339933;">:</span><span style="color: #3366CC;">'post'</span><span style="color: #339933;">,</span>
	   parameters<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> datensatz<span style="color: #339933;">:</span> parseInt<span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'datensatz'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	   onSuccess<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>transport<span style="color: #339933;">,</span> json<span style="color: #009900;">&#41;</span>
	   <span style="color: #009900;">&#123;</span>
		handleSuccess<span style="color: #009900;">&#40;</span>json<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	   <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		onFailure<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			handleFailure<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
   <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Wir haben jetzt eine Funktion, die ein AJAX-Objekt angelegt und die Methode POST verwendet, implementiert. Über <em>parameters:</em> kann man die einzelnen Parameter angeben, die man an den Request übergeben will. Hier verwende ich die von Prototype implementierte Kuzform für <em>document.getElementById(&#8216;datensatz&#8217;)</em> (<em>$(&#8216;id-name&#8217;)</em>). Möchte man eine komplette Form übergeben, bietet Prototype eine Serialisierung der Daten:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'id_of_form_element'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Als nächstes definieren wir die vorgegebenen Funktionen <em>onSuccess</em> und <em>onFailure</em>. Verwendet man JSON, werden zwei Variablen an onSuccess übergeben, die zweite enthält dann die Response-Daten als JSON-Objekt. Die Bedeutung der Funktionen sollte selbsterklärend sein. Der Übersicht halber machen diese Funktionen nichts anderes, als eine  andere Funktion aufzurufen. Die Fehler-Funktion ist hier recht unspektakulär und wird nur aufgerufen, wenn ein Timeout beim Request eintritt:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> handleFailure <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Ein Problem ist aufgetreten, die Daten konnten nicht abgeholt werden'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jetzt geben wir einfach die abgeholten Daten aus. Hierzu leeren wir zunächst den Content-Container. Danach laufen wir mit einer Schleife durch das Result:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> handleSuccess <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>response<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'output'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> response.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'output'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">+=</span> i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'output'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">+=</span> <span style="color: #3366CC;">' =&amp;gt; '</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'output'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">+=</span> response<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'output'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">+=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Danach können wir unsere Ausgabe bestaunen <img src='http://www.alexander-stelter.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Der Server dazu sieht übrigens so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$AryData</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayObject <span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'PHP'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'Perl'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Python'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'C++'</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">'C#'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'datensatz'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$Output</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$AryData</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$Output</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$AryData</span> <span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'datensatz'</span><span style="color: #009900;">&#93;</span> – <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'X-JSON: '</span><span style="color: #339933;">.</span><span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$Output</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Das Ganze ist beliebig erweiterbar und auf jeden Fall recht mächtig. Prototype nimmt einem an vielen Stellen eine Menge Arbeit ab und es läuft großteils auch alles in fast allen gängigen Browsern <img src='http://www.alexander-stelter.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Das war natürlich nur ein Feature von vielen, die Prototype bietet, mehr findet man auch auf der Webseite[1].</p>
<p>Bei Fragen, Problemen etc. einfach einen Kommentar hinterlassen <img src='http://www.alexander-stelter.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Die Sourcen versende ich auf Anfrage. Interessenten können auch gerne einen Kommentar hinterlassen; ist vielleicht weniger Arbeit, als alles hier rauszukopieren.</p>
<p><strong>Links</strong><br />
[1] <a title="http://www.prototypejs.org" href="http://www.prototypejs.org">http://www.prototypejs.org</a><br />
[2] <a title="http://de.php.net/json" href="http://de.php.net/json">http://de.php.net/json</a><br />
[3] <a title="http://pecl.php.net/package/json" href="http://pecl.php.net/package/json">http://pecl.php.net/package/json</a><br />
[4] <a title="http://de.selfhtml.org" href="http://de.selfhtml.org">http://de.selfhtml.org</a></p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=JavaScript+Entwicklung+mit+Prototype+http://bit.ly/atrdVw" title="Post to Twitter"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://www.alexander-stelter.de/blog/18-javascript-entwicklung-mit-prototype/&amp;title=JavaScript+Entwicklung+mit+Prototype" title="Post to Delicious"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://www.alexander-stelter.de/blog/18-javascript-entwicklung-mit-prototype/&amp;title=JavaScript+Entwicklung+mit+Prototype" title="Post to Digg"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://www.alexander-stelter.de/blog/18-javascript-entwicklung-mit-prototype/&amp;t=JavaScript+Entwicklung+mit+Prototype" title="Post to Facebook"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.alexander-stelter.de/blog/18-javascript-entwicklung-mit-prototype/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JavaScript Object Notation (JSON)</title>
		<link>http://www.alexander-stelter.de/blog/9-javascript-object-notation-json/</link>
		<comments>http://www.alexander-stelter.de/blog/9-javascript-object-notation-json/#comments</comments>
		<pubDate>Wed, 21 Feb 2007 19:09:00 +0000</pubDate>
		<dc:creator>Alexander</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[active-x]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[soap]]></category>

		<guid isPermaLink="false">http://www.alexander-stelter.de/blog/?p=9</guid>
		<description><![CDATA[Web 2.0 ist in aller Munde und dabei fällt auch meist im nächsten Satz das Wort AJAX. AJAX steht für Asynchronous JavaScript and XML. Bei dieser Technologie wird mittels eines HTTP-Requests per Active-X oder Javascript eine Seite oder ein Script aufgerufen und dessen Daten übertragen, ohne dass die Seite neu geladen werden muss. Mit AJAX [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://de.wikipedia.org/wiki/Web_2.0"  title="Web 2.0">Web 2.0</a> ist in aller Munde und dabei fällt auch meist im nächsten Satz das Wort <a href="http://de.wikipedia.org/wiki/Ajax_%28Programmierung%29"  title="AJAX">AJAX</a>. AJAX steht für Asynchronous JavaScript and XML. Bei dieser Technologie wird mittels eines HTTP-Requests per Active-X oder Javascript eine Seite oder ein Script aufgerufen und dessen Daten übertragen, ohne dass die Seite neu geladen werden muss. Mit AJAX kann man also eine Webanwendung stricken, die das Look an Feel einer Desktopanwendung hat. So kann man zum Beispiel eine Tabelle mit Daten dynamisch nach einer Spalte sortieren, ohne die Seite neu zu laden.<span id="more-9"></span><!-- s9ymdb:16 --><img width='450' height='434' style="border: 0px; padding-right: 5px;" src="/blog/uploads/programmierung/Ajax-vergleich.png" alt="" /></p>
<div class="serendipity_imageComment_txt">(Quelle: <a href="http://de.wikipedia.org" >de.wikipedia.org</a>)</div>
<p>Zur Übertragung der Daten gibt es einige Formate, die sich in der Praxis bewiesen haben. Hierzu gehören u.a. <a href="http://de.wikipedia.org/wiki/XML"  title="XML">XML</a>, <a href="http://de.wikipedia.org/wiki/ReStructuredText"  title="reST">reST</a>, <a href="http://de.wikipedia.org/wiki/JSON"  title="JSON">JSON</a> und <a href="http://de.wikipedia.org/wiki/SOAP"  title="SOAP">SOAP</a>.</p>
<p><strong>Was ist JSON?</strong><br />
JSON steht für JavaScript Object Notation. Hierbei wird auf Anforderung mit einem Algorithmus serverseitig aus einem Objekt (z.B. einem PHP-Array) ein JSON-Objekt serialisiert. JSON-Objekte haben den Vorteil gegenüber XML, dass sie wenige Bytes für die eigenen Strukturinformationen verwenden und somit wenig Overhead beim Übertragen von Daten erzeugt wird. Will man natürlich komplexe Datenstrukturen übertragen,  sollte man sich überlegen XML zu verwenden, denn hier sind die Methoden zum Zugriff auf die Baumstruktur der Daten ausgereift und verschwenden weniger Rechenleistung des Clients. Zum Übertragen von Arrays mit überschaubarer Verschachtelung ist JSON aber die richtige Wahl. </p>
<p>Bei der Wahl des Datenformats sollte man bedenken, dass auf Seiten des Clients zusätzlich Rechenleistung von Nöten ist, um die Daten zur Ausgabe aus dem Format zu extrahieren.</p>
<p><strong>Verarbeitung</strong><br />
Erhält man nun von Serverseite ein JSON-Objekt, hat man zwei Methoden zur Auswahl um aus diesem Objekt ein verwendbares Javascript-Objekt zu erzeugen:</p>
<p><strong>1. eval()</strong><br />
Mittels eval() kann man ein JSON-Objekt direkt ausführen und so zu einem benutzbaren Javascript-Objekt machen. Das hat den gewaltigen Nachteil, dass nicht vertrauenswürdige Daten ausgeführt würden könnten und somit auch schadhafter Code ausgeführt werden kann. Daher sollte man darauf verzichten.</p>
<p><strong>2. JSON-Parser</strong><br />
Ein JSON-Parser[1] bietet ebenso die Möglichkeit aus einem JSON-Objekt ein brauchbares Javascript-Objekt zu erzeugen. Hierbei kann man entscheiden, was man mit im JSON-Objekt vorhandenen Methoden vorgeht. Man kann sie umwandeln oder auch nicht. Der hier verwendete JSON-Parser überläd bei Einbindung alle Strings, Arrays etc. und ergänzt nötige Methoden für das umwandeln in ein Javascript-Objekt. Bei Bedarf können diese dann aufgerufen werden.</p>
<p><strong>Ein Beispiel:</strong><br />
Wir haben ein PHP-Array. Dieses wird dann mittels der in PHP 5.2 enthaltenen JSON-Bibliothek[2] codiert. Für Versionen < PHP 5.2 ist eine Extention in <a href="http://pecl.php.net"  title="PECL">PECL</a> vorhanden [3].</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$Data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span>
<span style="color: #009900;">&#40;</span>
	<span style="color: #990000;">array</span>
	<span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Stephan'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'ort'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Bonn'</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	<span style="color: #990000;">array</span>
	<span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Thomas'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'ort'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Köln'</span>
	<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$Data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Diese Daten werden nun via AJAX übertragen. In der Callback-Funktion des AJAX-Objekts haben wir dann folgende Code-Stelle:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Data <span style="color: #339933;">=</span> response.<span style="color: #660066;">responseText</span>.<span style="color: #660066;">parseJSON</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Der Funktion parseJSON können auch noch zusätzliche Filter übergeben werden, mit denen man entscheiden kann, wie mit Methoden etc. umgegangen werden soll. Dies lassen wir hier mal außen vor. Jetzt können wir einzelne Daten hiervon ausgeben:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>Data<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Der JSON-Parser erkennt, dass es sich hierbei um ein Array handelt und wandelt es um. Es ist also recht einfach die Daten zurückzuwandeln.</p>
<p>So kann man einfach und schnell Daten von PHP nach Javascript übertragen und diese dort weiterverarbeiten ohne ein externes Framework einzubinden (welche natürlich auch ihre Vorteile haben). </p>
<p>Demnächst werde ich in einem eigenen Artikel auf AJAX mit <a href="http://www.prototypejs.org/"  title="Prototype">Prototype</a> eingehen, lasst Euch überraschen <img src='http://www.alexander-stelter.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p><strong>Links</strong><br />
[1] <a href="http://www.json.org/"  title="http://www.json.org/">http://www.json.org/</a><br />
[2] <a href="http://de.php.net/json"  title="http://de.php.net/json">http://de.php.net/json</a><br />
[3] <a href="http://pecl.php.net/package/json"  title="http://pecl.php.net/package/json">http://pecl.php.net/package/json</a></p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=JavaScript+Object+Notation+%28JSON%29+http://bit.ly/c0so75" title="Post to Twitter"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://www.alexander-stelter.de/blog/9-javascript-object-notation-json/&amp;title=JavaScript+Object+Notation+%28JSON%29" title="Post to Delicious"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://www.alexander-stelter.de/blog/9-javascript-object-notation-json/&amp;title=JavaScript+Object+Notation+%28JSON%29" title="Post to Digg"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://www.alexander-stelter.de/blog/9-javascript-object-notation-json/&amp;t=JavaScript+Object+Notation+%28JSON%29" title="Post to Facebook"><img class="nothumb" src="http://www.alexander-stelter.de/blog/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.alexander-stelter.de/blog/9-javascript-object-notation-json/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
