<?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>TheGeek.de &#187; javascript</title>
	<atom:link href="http://thegeek.de/t/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://thegeek.de</link>
	<description>WordPress, PHP, JavaScript, Web 2.0, Gaming, Motorräder, Fotografie, Piratenpartei, Privates</description>
	<lastBuildDate>Thu, 26 Jan 2012 13:19:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Anonymous: Nachfolger von LOIC lässt auf sich warten, dafür nun Angriff via JavaScript</title>
		<link>http://thegeek.de/anonymous-nachfolger-von-loic-lasst-auf-sich-warten-dafur-nun-angriff-via-javascript</link>
		<comments>http://thegeek.de/anonymous-nachfolger-von-loic-lasst-auf-sich-warten-dafur-nun-angriff-via-javascript#comments</comments>
		<pubDate>Thu, 26 Jan 2012 13:18:03 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[anonymous]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[loic]]></category>
		<category><![CDATA[refref]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=658</guid>
		<description><![CDATA[Vor einiger Zeit spekulierte ich über die neue Wunderwaffe &#8220;RefRef&#8221; des Hackerkollektivs Anonymous. Es waren leider nicht besonders viele Informationen erhältlich, aber es war von ungeschlossenen MySQL Lücken und JavaScript die Rede. Da ich auch jetzt nach 4 Monaten immer noch nichts von RefRef gehört habe, gehe ich mal davon aus, dass die Idee fallen [...]]]></description>
			<content:encoded><![CDATA[<p>Vor einiger Zeit spekulierte ich <a href="http://thegeek.de/anonymous-entwickelt-refref-als-nachfolger-von-loic-viele-fragen-bleiben-offen">über die neue Wunderwaffe &#8220;RefRef&#8221;</a> des Hackerkollektivs Anonymous. Es waren leider nicht besonders viele Informationen erhältlich, aber es war von ungeschlossenen MySQL Lücken und JavaScript die Rede. Da ich auch jetzt nach 4 Monaten immer noch nichts von RefRef gehört habe, gehe ich mal davon aus, dass die Idee fallen gelassen wurde, oder ein Hoax war. Trotzdem gibt es in der Anonymous Szene nun einen ernst zu nehmenden Ersatz für die Large Orbit Ion Cannon &#8211; das Standard DDoS Tool der losen Hacker-Vereinigung. Problem bei LOIC war aber immer, das die Benutzer mit einem Bein im Knast standen, weil dieses Tool nur bewusst installiert und ausgeführt werden kann. Das ist in den meisten Ländern strafbar &#8211; auch in Deutschland fällt dies unter den sogenannten &#8220;Hackerparagraphen&#8221;.</p>
<p>Jetzt haben sich die Anons etwas geschicktes einfallen lassen: Ein DDoS Tool, das in JavaScript geschrieben wurde und auf öffentlichen Servern wie pastebin plaziert wird. Danach werden die Links zur Aktion verbreitet &#8211; Anonymous goes social media &#8211; und wer den Link anklickt nimmt automatisch an der Op teil. Vorteil für die Mitglieder des Netzwerks: Die Behörden können schlecht nachweisen, ob die Seite bewusst, oder unbewusst für die Teilnahme an einem DDoS Angriff aufgerufen wurde, weil die Requests auf das Ziel ohne eigenes zutun im Hintergrund aufgebaut werden. Im Zweifel könnte das die Handlungsmöglichkeiten der Behörden aushebeln. Egal was man nun auch von den Methoden des Anonymous Netzwerks hält, aber das ist schon recht geschickt.</p>
<p>Vielleicht ist diese neue Form der DDoS Attacke sogar geschickter als ein kompliziertes und nur auf eine Schwachstelle in MySQL zielendes ominöses Tool wie RefRef. Ich werde mir den Quellcode jedenfalls ansehen (aus Neugier) und schauen wie es gemacht ist. Vermutlich ist es allerdings ziemlich einfach, denn ein solches JavaScript zu schreiben ist weniger aufwändig, als häufig gedacht wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/anonymous-nachfolger-von-loic-lasst-auf-sich-warten-dafur-nun-angriff-via-javascript/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ein Select Auswahlfeld mit Prototype elegant filtern &#8211; ohne Ajax.Request</title>
		<link>http://thegeek.de/ein-select-auswahlfeld-mit-prototype-elegant-filtern-ohne-ajax-request</link>
		<comments>http://thegeek.de/ein-select-auswahlfeld-mit-prototype-elegant-filtern-ohne-ajax-request#comments</comments>
		<pubDate>Fri, 23 Dec 2011 12:59:52 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[select]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=641</guid>
		<description><![CDATA[Wer kennt das Problem als Programmierer nicht? Die User meckern, bei ewig vielen Optionen in einem Auswahlfeld &#8211; und das zurecht! Nun können die Optionen des Auswahlfelds mittels Ajax.Request und einem Suchfeld gefiltert werden, aber ein Request ist eben ein Request und ich habe mir deswegen etwas überlegt, was ohne Request auskommt. Dabei herausgekommen ist [...]]]></description>
			<content:encoded><![CDATA[<p>Wer kennt das Problem als Programmierer nicht? Die User meckern, bei ewig vielen Optionen in einem Auswahlfeld &#8211; und das zurecht! Nun können die Optionen des Auswahlfelds mittels Ajax.Request und einem Suchfeld gefiltert werden, aber ein Request ist eben ein Request und ich habe mir deswegen etwas überlegt, was ohne Request auskommt. Dabei herausgekommen ist eine kleine JavaScript-Funktion, die ich gerne zur Verfügung stelle.</p>
<p>Aber zuerst eine kleines Beispiel, wie der HTML-Code dazu aussehen könnte:</p>
<pre class="brush:html">&lt;select name="auswahl" id="auswahl"&gt;
	&lt;option value=""&gt;--Bitte wählen --&lt;/option&gt;
	&lt;option value="1"&gt;Eins&lt;/option&gt;
	&lt;option value="2"&gt;Eins&lt;/option&gt;
	&lt;option value="3"&gt;Eins&lt;/option&gt;
	&lt;option value="4"&gt;Eins&lt;/option&gt;
	&lt;option value="5"&gt;Eins&lt;/option&gt;
	&lt;option value="1000000"&gt;Einemiooooon!!!!&lt;/option&gt;
&lt;/select&gt;

Filtern:
&lt;input type="text" size="12" value="" onkeyup="filterSelectField( 'auswahl', this.value )"/&gt;</pre>
<p>Die dazugehörige JavaScript-Funktion sieht dann so aus:</p>
<pre class="brush:javascript">function filterSelectField( fieldid, s ) {
	var rex = new RegExp( '^' + s.replace( '\.', '\\.' ), "i" );
	$$('select#' + fieldid + ' option').each( function (ele) {
		if( ele.value != '' )
		{
			if( ele.innerHTML.search( rex ) == -1  )
				ele.hide();
			else
				ele.show();
		}
	} );
}</pre>
<p>Die Funktionsweise ist schnell erklärt: Mittels einer RegEx wird die Bennenung des Werts der &#8220;option&#8221; durchsucht und bei einem Treffer angezeigt und bei keinem Treffer ausgeblendet. Einfacher und schneller geht&#8217;s nun wirklich nicht. :-)</p>
<p>Viel Spaß damit.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/ein-select-auswahlfeld-mit-prototype-elegant-filtern-ohne-ajax-request/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pornöse JavaScript GUIs, die doch barrierefrei sind</title>
		<link>http://thegeek.de/pornose-javascript-guis-die-doch-barrierefrei-sind</link>
		<comments>http://thegeek.de/pornose-javascript-guis-die-doch-barrierefrei-sind#comments</comments>
		<pubDate>Fri, 14 Jan 2011 12:28:58 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[barrierefrei]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=527</guid>
		<description><![CDATA[Mit Prototype, Scriptaculous, jQuery und Konsorten lassen sich wunderbare Interfaces zaubern, herrlich interaktiv mit tollen Effekten und vorallem wesentlich schneller durch den Einsatz von AJAX. Doch wo bleibt dabei die Barrierefreiheit, die ich übrigens im Netz für sehr wichtig halte, nicht nur weil auch blinde Menschen surfen, sondern weil eine barrierefreie Seite automatisch von jedem [...]]]></description>
			<content:encoded><![CDATA[<p>Mit Prototype, Scriptaculous, jQuery und Konsorten lassen sich wunderbare Interfaces zaubern, herrlich interaktiv mit tollen Effekten und vorallem wesentlich schneller durch den Einsatz von AJAX. Doch wo bleibt dabei die Barrierefreiheit, die ich übrigens im Netz für sehr wichtig halte, nicht nur weil auch blinde Menschen surfen, sondern weil eine barrierefreie Seite automatisch von jedem Endgerät besser gelesen werden kann.</p>
<p>JavaScript ist alles andere als barrierefrei, denn die Braille Browser, die von blinden Menschen benutzt werden, beherrschen kein JavaScript. Aber: Wir können trotzdem GUIs mit AJAX und jede Menge Eyecandy programmieren und der shit läuft trotzdem auch ohne JavaScript. Im Grunde ist es sogar kein großer Aufwand und bekanntlich führen sogar mehrere Wege zum Ziel. Den Weg, den ich immer gehe, den möchte ich mal kurz vorstellen. <span id="more-527"></span></p>
<p>Vorweg: Nicht notwendig, aber hilfreich ist der Einsatz eines Template Systems, wie z.B. Smarty. Da ich Smarty aber ziemlich unhandlich finde, habe ich mir seinerzeit mal eine eigene Template-Klasse geschrieben, mir der ich gut zurecht komme.</p>
<p>Erstmal zum grundlegenden Prinzip: Ein AJAX Request wird in der Regel durch eine onclick Aktion oder über das href Attribut eines Links ausgelöst. Soll das Ganze auch ohne JavaScript noch funktionieren muss im href Attribut ein Link stehen, der die Aktion ohne Einsatz eines asynchronen Requests auslöst, im onclick steht der Aufruf des AJAX Requests und danach, ganz wichtig, &#8220;return false&#8221;.</p>
<p>Ein Beispiel für einen solchen Link:</p>
<pre class="brush:html">
&lt;a href="index.php?action=show_entry&#038;entry_id=23" onclick="ajax_request( 'action=show_entry&#038;entry_id=23&#038;ajax=true', 'contentdiv' ); return false;"&gt;Zeige Eintrag&lt;/a&gt;
</pre>
<p>Ist JavaScript beim Klicken des Links nicht aktiv, wird der Link regulär aufgerufen, mit Hilfe von PHP entsprechend ausgewertet und das benötigte HTML erzeugt. Ist JavaScript aktiv, dann wird der AJAX Request gestartet und das reguläre Verfolgen des Links im href Attribut durch &#8220;return false&#8221; unterbunden. An PHP wird mittels Parameter &#8220;ajax=true&#8221; übermittelt, dass nicht das vollständige HTML zu erzeugen ist, sondern nur das was für den Inhaltsbereich benötigt wird.</p>
<p>Das klingt nun erstmal so, als wäre es sehr aufwändig, aber mit einem Template System ist es ein Kinderspiel. Ein wenig PHP Pseudocode dazu:</p>
<pre class="brush:php">
	// Auswahl des Templates
	if( empty( $_REQUEST[ 'ajax' ] ) )
	{
		$content = new template( 'templates/tpl_main.html' );

		$menu = new template( 'templates/tpl_menu.html' );
		$menu -> finish();

		$sidebar = new template( 'template/tpl_sidebar.html' );
		$sidebar -> finish();

		$content -> set( 'menu', $menu -> get_html() );
		$content -> set( 'sidebar', $sidebar -> get_html() );
	}
	else
	{
		$content = new template( 'templates/tpl_ajax.html' );
	}

	// Erzeugen und einsetzen des Inhalts der gewünschten Aktion
	if( $_REQUEST[ 'action' ] == 'show_entry' )
		$content -> set( 'content', show_entry( intval( $_REQUEST[ 'entry_id' ) ) );

	// Template rendern und ausgeben
	$content -> finish();
	echo $content -> get_html();
</pre>
<p>Im Prinzip ist es also ganz einfach: Ist der Parameter &#8220;ajax&#8221; leer, dann wird mittels des Template Systems die vollständige Seite zusammengebaut. Kommt der Request per AJAX, dann wird nur der benötigte Teil ausgegeben und mittels JavaScript in das entsprechende Div gesetzt. Im Prinzip also doch einfacher, als man vermutet.</p>
<p>Auch Formularübergaben können so sehr einfach sowohl per AJAX, als auch regulär abgesendet werden:</p>
<pre class="brush:html">
&lt;form name="entryaddform" id="entryaddform" action="index.php" method="post"&gt;
&lt;input type="hidden" name="action" id="entryaddform_action" value="entry_add"/&gt;
&lt;input type="hidden" name="ajax" id="entryaddform_ajax" value=""/&gt;

&lt;fieldset&gt;
	&lt;legend&gt;Eintrag anlegen&lt;/legend&gt;

	&lt;div&gt;
		&lt;label for="entry_titel"&gt;Bezeichnung des Eintrag&lt;/label&gt;
	&lt;/div&gt;
	&lt;div&gt;
		&lt;input type="text" name="entry_titel" id="entry_titel" size="40"/&gt;
	&lt;/div&gt;

&lt;/fieldset&gt;

&lt;input type="submit" value="Speichern" onclick="$('entryaddform_ajax').value = 'true'; ajax_form( 'entryaddform' ); return false;"/&gt;

&lt;/form&gt;
</pre>
<p>Auch hier ist es wieder sehr einfach: Genau wie beim Link, liegen auf der onclick Aktion des Submit Buttons die entsprechenden JavaScript Anweisungen, um das Hidden Field &#8220;ajax&#8221; mit einem Wert zu füllen, das Formular asynchron abszusenden und um schlussendlich das reguläre Senden des Formulars mit &#8220;return false&#8221; zu unterbinden. Ist JavaScript nicht aktiv, wird das Formular reguläre mit leerem Parameter &#8220;ajax&#8221; abgesendet.</p>
<p>Es ist also tatsächlich relativ einfach eine moderne Webanwendung barrierefrei zu gestalten.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/pornose-javascript-guis-die-doch-barrierefrei-sind/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Empfehlung: typeface.js &#8211; TTF und OTF Schriften im Browser verwenden</title>
		<link>http://thegeek.de/empfehlung-typeface-js-ttf-und-otf-schriften-im-browser-verwenden</link>
		<comments>http://thegeek.de/empfehlung-typeface-js-ttf-und-otf-schriften-im-browser-verwenden#comments</comments>
		<pubDate>Tue, 29 Dec 2009 17:49:23 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[opentype]]></category>
		<category><![CDATA[schriftarten]]></category>
		<category><![CDATA[truetype]]></category>
		<category><![CDATA[typeface]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=437</guid>
		<description><![CDATA[Ich habe die letzten zwei Tage für ein Kundenprojekt ein Screendesign in XHTML und CSS umgesetzt. Wichtiger Wunsch des Kunden war dabei, dass die extra für den Kunden entworfene Hausschrift Verwendung in der Webseite findet. Und das nicht zu knapp: Überschriften und vorallem das Menü sollte in der Schriftart &#8220;RKM Headline&#8221; ausgegeben werden. Um TrueType/OpenType [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe die letzten zwei Tage für ein Kundenprojekt ein Screendesign in XHTML und CSS umgesetzt. Wichtiger Wunsch des Kunden war dabei, dass die extra für den Kunden entworfene Hausschrift Verwendung in der Webseite findet. Und das nicht zu knapp: Überschriften und vorallem das Menü sollte in der Schriftart &#8220;RKM Headline&#8221; ausgegeben werden.</p>
<p>Um TrueType/OpenType Schriften in eine Webseite zu integrieren, gibt es verschiedene Möglichkeiten. Einmal wäre da <a href="http://www.mikeindustries.com/sifr">sIFR</a>, was ich aber nicht verwenden wollte, da ich Flash eher mit Abneigung gegenüberstehe und es zudem Probleme mit AdBlockern geben kann. Die nächste Möglichkeit wäre gewesen, es mit CSS3 zu lösen, was aber ebenfalls ausschied, da dies von zu wenig Browsern unterstützt wird.</p>
<p>Nach ein wenig Recherche fand ich allerdings eine mir zusagende Lösung: <a href="http://typeface.neocracy.org/">typeface.js</a> &#8211; ein kleines JavaScript, dass mittels SVG/VML die als TTF oder OTF gelieferte Schriftart im Browser verfügbar macht.<span id="more-437"></span></p>
<p>Der Einsatz ist relativ einfach: Auf der Webseite von typeface können beliebige Schriften (TTF/OTF) in JavaScript Dateien konvertiert werden, die zusammen mit der typeface.js im Header der Seite nach den eigenen CSS-Definitionen eingebunden werden. </p>
<p>Hier ein Beispiel:</p>
<pre class="brush:html">
&lt;head&gt;
	&lt;title&gt;Beispiel&lt;/title&gt;
	&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;
	&lt;link rel="stylesheet" href="style.css" media="screen"/&gt;
	&lt;script type="text/javascript" src="js/typeface-0.14.js"&gt;&lt;/script&gt;
	&lt;script type="text/javascript" src="js/rkm_headline_regular.typeface.js"&gt;&lt;/script&gt;
	&lt;script type="text/javascript" src="js/rkm_headline_bold.typeface.js"&gt;&lt;/script&gt;
&lt;/head&gt;
</pre>
<p>Anhand dieses HTML-Codes wird ein wichtiges Detail bereits deutlich: Jede Schriftvariante (Fett/Kursiv/&#8230;) muss gesondert in eine JavaScript Datei konvertiert werden, denn nur so ist es typeface möglich auch CSS-Angaben wie &#8220;font-weight: bold&#8221; richtig zu interpretieren. Fehlt die Fettschriftvariante der Schriftart, wird der Text nicht umgewandelt. Ein kleiner Stolperstein, aber wer es weiß, für den ist es kein Problem.</p>
<p>Ansonsten ist der weitere Einsatz von typeface einfach: Headline-Tags können per Stylesheet formatiert werden, bei anderen Tags muss eine Style-Angabe im Tag direkt gesetzt sein, Kind-Elemente werden nicht beachtet.</p>
<p>Beispieldefinition eines Headline-Tags:</p>
<pre class="brush:css">
#middle h2 {
	font-size:20px;
	font-weight:normal;
	text-transform:uppercase;
	letter-spacing:1px;
	margin-bottom:18px;
	font-family:'RKM Headline',Arial,Helvetica,sans-serif;
	font-weight:bold;
}
</pre>
<p>Der Tag wird erstmal wie gewöhnlich formatiert, so dass die Überschrift auch schön aussieht, wenn typeface nicht funktioniert. Dann wird per &#8220;font-family&#8221; einfach unsere selbst erzeugte Schriftart &#8220;RKM Headline&#8221; gesetzt, um den Rest kümmert sich das JavaScript.</p>
<p>Möchtest du ein anderes Element als eine Headline mit der Schriftart anzeigen, kann dies auch über das Style-Attribut des Tags gelöst werden:</p>
<pre class="brush:html">
	&lt;a class="typeface-js" style="font-family: 'RKM Headline',Arial,Helvetica,sans-serif;"&gt;Dies ist ein schöner Link&lt;/a&gt;
	&lt;br/&gt;
	&lt;br/&gt;
	&lt;a class="extern_link typeface-js" style="font-family: 'RKM Headline',Arial,Helvetica,sans-serif;"&gt;Dies ist ein schöner externer Link&lt;/a&gt;
</pre>
<p>Hier nur wichtig: Im Class-Attribut des Tags muss &#8220;typeface-js&#8221; vorkommen, der Rest läuft über das Style-Attribut, aber auch die CSS-Attribute &#8211; wie z.B. die Schriftgröße &#8211; die auf das Element wirken werden berücksichtigt.</p>
<p>Schon klasse muss ich sagen&#8230; und OpenSource noch dazu! Daumen hoch für typeface!</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/empfehlung-typeface-js-ttf-und-otf-schriften-im-browser-verwenden/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tab-Menüs mit Prototype generalisieren</title>
		<link>http://thegeek.de/tab-menus-mit-prototype-generalisieren</link>
		<comments>http://thegeek.de/tab-menus-mit-prototype-generalisieren#comments</comments>
		<pubDate>Fri, 27 Nov 2009 14:37:56 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[menüs]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[tabbing]]></category>
		<category><![CDATA[tabs]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=367</guid>
		<description><![CDATA[Wer kennt es nicht: Mehrere Datentabellen oder -abschnitte auf einer Seite und der Benutzer verliert schnell den Überblick. Die Lösung: Ein wenig JavaScript, mit ein wenig CSS und ein paar DIVs garniert, das ganze kräftig durchkneten und fertig ist der Tabbed-Content für jeden Einsatzzweck. Hier ein wenig HTML: Datenblatt 1 Datenblatt 2 Datenblatt 3 Datenblatt [...]]]></description>
			<content:encoded><![CDATA[<p>Wer kennt es nicht: Mehrere Datentabellen oder -abschnitte auf einer Seite und der Benutzer verliert schnell den Überblick. Die Lösung: Ein wenig JavaScript, mit ein wenig CSS und ein paar DIVs garniert, das ganze kräftig durchkneten und fertig ist der Tabbed-Content für jeden Einsatzzweck. <span id="more-367"></span></p>
<p>Hier ein wenig HTML:</p>
<pre class="brush:html">
<div id="tabmenu">
<div id="tab_datasheet1" class="tab active">Datenblatt 1</div>
<div id="tab_datasheet2" class="tab">Datenblatt 2</div>
<div id="tab_datasheet3" class="tab">Datenblatt 3</div>
<div id="tab_datasheet4" class="tab">Datenblatt 4</div>
<div id="tab_datasheet5" class="tab">Datenblatt 5</div>
</div>
<div id="datasheet1">Jede Menge Daten (1)</div>
<div id="datasheet2" style="display:none">Jede Menge Daten (2)</div>
<div id="datasheet3" style="display:none">Jede Menge Daten (3)</div>
<div id="datasheet4" style="display:none">Jede Menge Daten (4)</div>
<div id="datasheet5" style="display:none">Jede Menge Daten (5)</div>
</pre>
<p>Oben findet sich unser Tab-Menü, dass die insgesamt 5 Daten-Layer per Klick einblenden soll. Die DIVs mit den Daten sind per Style-Definition erstmal nicht sichtbar, bis auf den ersten DIV, da davon auszugehen ist, dass ohne einen Klick auf etwas das erste Datenblatt angezeigt werden soll. Damit das Tab-Menü auch ansprechend aussieht, brauchen wir noch folgende CSS Definitionen:</p>
<pre class="brush:css">
#tabmenu {
	overflow:hidden;
	border-bottom:1px solid #FFF;
}
#tabmenu .tab {
	float:left;
	border:1px solid #660000;
	border-bottom:none;
	margin-left:3px;
	padding:3px;
	background-color:#F4F4F4;
	font-weight:bold;
}
#tabmenu .active {
	background-color:#FFFFFF;
	color:#000099;
}
#tabmenu .tab:hover {
	background-color:#FFFFFF;
	cursor:pointer;
}
</pre>
<p>Damit wir nun nicht für jeden einzelnen Tab eine &#8220;onclick&#8221; Aktion schreiben müssen, habe ich mir überlegt ein auf Prototype aufsetzendes JavaScript zu schreiben, dass anhand der verwendeten IDs der Tabs und der Daten-DIVs (die nur zueinander passen müssen) eine generell einsetzbare Lösung schafft. Das Skript kann im Head-Bereich der Seite eingebunden werden und durchsucht beim Aufruf, ob Tabs vorhanden sind und behandelt diese entsprechend.</p>
<pre class="brush:js">
/**
 * Render a tabbed menu
 */
var tabids = [];
var containerids = [];
function create_tabs()
{
	$$('.tab').all( function( el ) {
			tabids.push( el.id );
			containerids.push( el.id.replace( 'tab_', '' ) );
			el.observe( 'click', handle_tab_click );
			return true;
	} );
}
/**
 * Hande a clicked tab
 */
function handle_tab_click( event )
{
	// Get container id
	containerid = this.id.replace( 'tab_', '' );
	// Set active tab menu point
	tabids.all( function( tab ) {
		$(tab).removeClassName( 'active' );
		return true;
	} );
	this.addClassName( 'active' );
	// Set active tab content container
	containerids.all( function( container ) {
		$(container).hide();
		return true;
	} );
	$(containerid).show();
}
/**
 * Init tabbing
 */
Event.observe( window, 'load', create_tabs );
</pre>
<p>Die erste Funktion &#8220;create_tabs&#8221; sucht alle DIV-Layer innerhalb der Seite, die mit der CSS-Klasse &#8220;tab&#8221; versehen sind. Die gefundenen Tabs werden danach zur weiteren Verarbeitung in einem Array gespeichert und mit einer String-Ersetzung der zugehörige Daten-Layer ermittelt. Die IDs der Datenlayer werden ebenfalls in einem Array gespeichert. Zu guter letzt wird dem Tab-Menüpunkt noch eine Handler-Funktion zugewiesen.</p>
<p>Die zweite Funktion ist diese Handler-Funktion. Beim Klick wird zuerst ermittelt, welcher Daten-Layer angezeigt werden soll, indem durch eine Zeichenersetzung das &#8220;tab_&#8221; in der ID des Tab-Menüpunkts entfernt wird. Übrig bleibt dann z.B. &#8220;datasheet1&#8243;, wenn der erste Menüpunkt ausgewählt wurde. So weiß die Funktion für den späteren Verlauf, welcher DIV angezeigt werden muss.</p>
<p>Nun geht es daran, das Tab-Menü entsprechend zu verändern, denn es soll ja der angeklickte Menüpunkt hervorgehoben werden. Dazu entfernen wir per Prototype-Methode &#8220;all&#8221;, die auf das bei der Initialisierung erstellte Array angewendet wird, bei allen Tabs die CSS Klasse &#8220;active&#8221;. Danach wir die Klasse &#8220;active&#8221; dann beim angeklickten Punkt gesetzt und das Menü ändert sich so entsprechend dem Nutzerverhalten.</p>
<p>Dann durchlaufen wir ebenfalls mit &#8220;all&#8221; das Array, das die IDs der Datenblätter enthält und verstecken mittels &#8220;hide&#8221; alle DIVs. Nun wird nur noch das richtige DIV eingeblendet und das Tabbing ist komplett.</p>
<p>Großes Finale im Skript ist dann noch ein Event-Observer, der nach dem Laden der Seite die Funktion &#8220;create_tabs&#8221; aufruft und so alle auf der Seite gefundenen Tabs initialisiert.</p>
<p>Wichtig für den Einsatz des Skripts ist nur folgendes: Die IDs der Tab-Menüpunkt und der Layer mit den Daten müssen auf einander abgestimmt sein und ein Tab-Menüpunkt muss immer mit &#8220;tab_&#8221; beginnen. Lege ich also einen Tab mit der ID &#8220;tab_datentabelle123&#8243; an, dann muss das DIV mit den Daten die ID &#8220;datentabelle123&#8243; haben, sonst funktioniert es nicht. Natürlich müssen die Tab-Menüpunkte auch die richtigen CSS-Klassen haben, aber das versteht sich wohl von selbst.</p>
<p>Und so könnte es aussehen:</p>
<div id="tabmenu">
<div id="tab_datasheet1" class="tab active">Datenblatt 1</div>
<div id="tab_datasheet2" class="tab">Datenblatt 2</div>
<div id="tab_datasheet3" class="tab">Datenblatt 3</div>
<div id="tab_datasheet4" class="tab">Datenblatt 4</div>
<div id="tab_datasheet5" class="tab">Datenblatt 5</div>
</div>
<div id="datasheet1">Jede Menge Daten (1)</div>
<div id="datasheet2" style="display:none">Jede Menge Daten (2)</div>
<div id="datasheet3" style="display:none">Jede Menge Daten (3)</div>
<div id="datasheet4" style="display:none">Jede Menge Daten (4)</div>
<div id="datasheet5" style="display:none">Jede Menge Daten (5)</div>
<style type="text/css">
#tabmenu {
	overflow:hidden;
	border-bottom:1px solid #FFF;
}
#tabmenu .tab {
	float:left;
	border:1px solid #660000;
	border-bottom:none;
	margin-left:3px;
	padding:3px;
	background-color:#F4F4F4;
	font-weight:bold;
}
#tabmenu .active {
	background-color:#FFFFFF;
	color:#000099;
}
#tabmenu .tab:hover {
	background-color:#FFFFFF;
	cursor:pointer;
}
</style>
<p><script type="text/javascript">
/**
 * Render a tabbed menu
 */
var tabids = [];
var containerids = [];
function create_tabs()
{
	$$('.tab').all( function( el ) {
			tabids.push( el.id );
			containerids.push( el.id.replace( 'tab_', '' ) );
			el.observe( 'click', handle_tab_click );
			return true;
	} );
}
/**
 * Hande a clicked tab
 */
function handle_tab_click( event )
{
	// Get container id
	containerid = this.id.replace( 'tab_', '' );
	// Set active tab menu point
	tabids.all( function( tab ) {
		$(tab).removeClassName( 'active' );
		return true;
	} );
	this.addClassName( 'active' );
	// Set active tab content container
	containerids.all( function( container ) {
		$(container).hide();
		return true;
	} );
	$(containerid).show();
}
/**
 * Init tabbing
 */
create_tabs();
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/tab-menus-mit-prototype-generalisieren/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Parallax Scrolling Effekt mit Prototype/Scriptaculous JavaScript</title>
		<link>http://thegeek.de/parallax-scrolling-effekt-mit-prototypescriptaculous-javascript</link>
		<comments>http://thegeek.de/parallax-scrolling-effekt-mit-prototypescriptaculous-javascript#comments</comments>
		<pubDate>Wed, 11 Nov 2009 10:09:57 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[eyecandy]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[parallax]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[scriptaculous]]></category>
		<category><![CDATA[scrolling]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=325</guid>
		<description><![CDATA[Wer sich an Spiele wie &#8220;Shadow of the Beast&#8221; erinnert, der muss sich auch zwangsweise an diesen netten Pseudo-3D Effekt erinnern, mit dem diese Spiele ihren coolen Look erhielten. Parallax Scrolling nennt man diese Technik übrigens, bei der verschiedene Layer aus Grafiken übereinander gelegt und unterschiedlich schnell horizontal oder auch vertikal bewegt werden. Weil mir [...]]]></description>
			<content:encoded><![CDATA[<p>Wer sich an Spiele wie &#8220;Shadow of the Beast&#8221; erinnert, der muss sich auch zwangsweise an diesen netten Pseudo-3D Effekt erinnern, mit dem diese Spiele ihren coolen Look erhielten. Parallax Scrolling nennt man diese Technik übrigens, bei der verschiedene Layer aus Grafiken übereinander gelegt und unterschiedlich schnell horizontal oder auch vertikal bewegt werden.</p>
<p>Weil mir gestern Abend langweilig war, habe ich mich damit beschäftigt den Parallax Effekt versuchsweise in JavaScript umzusetzen. Als Bibliotheken verwende ich dabei PrototypeJS und Scriptaculous. Nachdem ich mit einem Grafikprogramm meine 3 Layer gezeichnet und PNGs mit Transparenz exportiert hatte, ging es an die Umsetzung. Schnell wurde mir klar, wie simpel es im Grunde ist mit ein wenig CSS und JavaScript diesen Effekt zu erzeugen.<span id="more-325"></span></p>
<p>Das HTML Grundgerüst besteht lediglich aus 3 DIV Layern:</p>
<pre class="brush:html">
&lt;div id=&quot;layer_bg&quot;&gt;
	&lt;div id=&quot;layer2&quot;&gt;
		&lt;div id=&quot;layer1&quot;&gt;
		&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Auf diese DIVs werden ein paar einfache CSS Regeln angewendet, um die Hintergrundgrafiken zu setzen. Zudem wird noch die Breite und Höhe definiert und der &#8220;overflow&#8221; auf &#8220;hidden&#8221; gesetzt. So wird es möglich per CSS Anweisung &#8220;background-position&#8221; den Hintergrund, also unseren Parallax-Layer, zu verschieben und einen Scroll-Effekt zu realisieren.</p>
<pre class="brush:css">
#layer_bg {
	border:10px solid #FFF;
	width:1150px;
	height:400px;
	margin:auto auto;
	background-image:url( 'layer_bg.png' );
	background-repeat:repeat-x;
	background-position:0px 0px;
	overflow:hidden;
}
#layer1 {
	background-image:url( 'layer1.png' );
	background-repeat:repeat-x;
	background-position:0px 0px;
	width:1150px;
	height:400px;
	overflow:hidden;
}
#layer2 {
	background-image:url( 'layer2.png' );
	background-repeat:repeat-x;
	background-position:0px 0px;
	width:1150px;
	height:400px;
	overflow:hidden;
}
</pre>
<p>Die Bewegung der Hintergrundgrafiken übernimmt eine kleine JavaScript-Funktion, an welche die Art der Bewegung übergeben wird.</p>
<pre class="brush:js">
var position_index1 = 0;
var position_index2 = 0;
var position_index3 = 0;
var effect_running = false;
function run_effect( $move_type )
{
	if( !effect_running )
	{
		effect_running = true;
		if( $move_type == 'move_left' )
		{
			position_index3 += 200;
			position_index2 += 200;
			position_index1 += 200;
		}
		if( $move_type == 'move_right' )
		{
			position_index1 -= 200;
			position_index2 -= 200;
			position_index3 -= 200;
		}
		if( $move_type == 'rotate_left' )
		{
			position_index3 += 200;
			position_index2 += 50;
			position_index1 -= 200;
		}
		if( $move_type == 'rotate_right' )
		{
			position_index3 -= 200;
			position_index2 -= 50;
			position_index1 += 200;
		}
		new Effect.Morph( 'layer_bg', { style:'background-position:' + (position_index3 * 1) + 'px 0px;' } );
		new Effect.Morph( 'layer2', { style:'background-position:' + (position_index2 * 2) + 'px 0px;' } );
		new Effect.Morph( 'layer1', { style:'background-position:' + (position_index1 * 3) + 'px 0px;', afterFinish:function() { effect_running = false; } } );
	}
}
</pre>
<p>Bei Eintritt in die Funktion wir zuerst geprüft, ob eine Bewegung nicht bereits läuft, falls das nicht der Fall ist, werden für die unterschiedlichen Bewegungs-Arten die neuen Werte für die Hintergrund-Position des Hintergrundbildes berechnet und anschließend mit dem Effekt &#8220;Morph&#8221; gesetzt. Je näher der Layer an der &#8220;Kamera&#8221; ist, um so mehr (schneller) wird er bewegt, wodurch dem Betrachter eine dritte Dimension vorgegaukelt wird.</p>
<p>Wer das <strong><a href="http://www.codemonster.de/parallax/">vollendete Versuchsobjekt betrachten</a></strong> möchte, der kann das nun gerne tun und noch einen Blick in den Quellcode der Seite werfen. Ich habe den Code noch um einige Kleinigkeiten erweitert, z.B. um die Steuerung per Pfeiltasten.</p>
<p>Natürlich ist das mal wieder sinnloses eyecandy, denkbar wäre aber, ein schickes Menü damit zu realisieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/parallax-scrolling-effekt-mit-prototypescriptaculous-javascript/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>E-Mail Adresse vor Spam-Robots schützen</title>
		<link>http://thegeek.de/e-mail-adresse-vor-spam-robots-schutzen</link>
		<comments>http://thegeek.de/e-mail-adresse-vor-spam-robots-schutzen#comments</comments>
		<pubDate>Tue, 03 Nov 2009 12:16:39 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://thegeek.de/e-mail-adresse-vor-spam-robots-schutzen</guid>
		<description><![CDATA[Wenn man mal eben fix eine E-Mail Adresse vor Spam-Robots sichern will, dann geht das ganz einfach mit ein wenig JavaScript. // Entweder so document.write( '&#60;a h'+'ref="ma'+'ilto'+':post'+'@'+'thegeek'+'.'+'de"&#62;post'+'@'+'thegeek'+'.'+'de&#60;/a&#62;' ); // Oder auch so [prototype] $('my_mail_adress').update( '&#60;a h'+'ref="ma'+'ilto'+':post'+'@'+'thegeek'+'.'+'de"&#62;post'+'@'+'thegeek'+'.'+'de&#60;/a&#62;' ); Wichtig ist noch folgendes: &#60;noscript&#62; post AT thegeek . de &#60;/noscript&#62; Sollte JavaScript nicht verfügbar sein, wird einfach [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn man mal eben fix eine E-Mail Adresse vor Spam-Robots sichern will, dann geht das ganz einfach mit ein wenig JavaScript.</p>
<pre class="brush:js">
	// Entweder so
	document.write( '&lt;a h'+'ref="ma'+'ilto'+':post'+'@'+'thegeek'+'.'+'de"&gt;post'+'@'+'thegeek'+'.'+'de&lt;/a&gt;' );

	// Oder auch so [prototype]
	$('my_mail_adress').update( '&lt;a h'+'ref="ma'+'ilto'+':post'+'@'+'thegeek'+'.'+'de"&gt;post'+'@'+'thegeek'+'.'+'de&lt;/a&gt;' );
</pre>
<p>Wichtig ist noch folgendes:</p>
<pre class="brush:html">
	&lt;noscript&gt;
		post AT thegeek . de
	&lt;/noscript&gt;
</pre>
<p>Sollte JavaScript nicht verfügbar sein, wird einfach die E-Mail Adresse ohne &#8220;@&#8221;-Zeichen und Domain ausgegeben, was die Spam-Robots nicht dekodieren können.</p>
<p>Siehe hier (mit Protype umgesetzt, da document.write bei asynchron geladenem Content nicht sinnvoll ist):
<div id="my_mail_adress"></div>
<p><script type="text/javascript">
// <!--
	$('my_mail_adress').update( '<a h'+'ref="ma'+'ilto'+':post'+'@'+'thegeek'+'.'+'de">post'+'@'+'thegeek'+'.'+'de</a>' );
// -->
</script></p>
<p>PS: Die Mail-Adresse existiert nicht und wurde wirklich dynamisch mit JavaScript eingefügt. :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/e-mail-adresse-vor-spam-robots-schutzen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX loading Grafik neben dem Mauszeiger anzeigen</title>
		<link>http://thegeek.de/ajax-loading-grafik-neben-dem-mauszeiger-anzeigen</link>
		<comments>http://thegeek.de/ajax-loading-grafik-neben-dem-mauszeiger-anzeigen#comments</comments>
		<pubDate>Tue, 27 Oct 2009 12:31:07 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[eyecandy]]></category>
		<category><![CDATA[grafik]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=260</guid>
		<description><![CDATA[Um dem Benutzer zu visualisieren, dass gerade ein asynchroner HTTP Request ausgeführt wird, hat die AJAX Welt das ajax-loading.gif erfunden. Diese kleine animierte Grafik gibt es in vielen Varianten und bittet den Benutzer optisch darum zu warten, bis der Inhalt geladen wurde. Sinnvolle Sache, sonst klickt er sich nämlich doof und dusselig, falls es doch [...]]]></description>
			<content:encoded><![CDATA[<p>Um dem Benutzer zu visualisieren, dass gerade ein asynchroner HTTP Request ausgeführt wird, hat die AJAX Welt das <a href="http://www.ajaxload.info/">ajax-loading.gif</a> erfunden. Diese kleine animierte Grafik gibt es in vielen Varianten und bittet den Benutzer optisch darum zu warten, bis der Inhalt geladen wurde. Sinnvolle Sache, sonst klickt er sich nämlich doof und dusselig, falls es doch mal ein wenig länger dauert. Kurzerhand habe ich das auch mal hier in Form des springenden Punktes im Blog eingebaut.</p>
<p>Zuerst habe ich meinen Body-Tag mit einer ID versehen, damit ich mit Prototype einfach auf das Body-Element zugreifen kann.</p>
<pre class="brush:html">
	&lt;body id="body"&gt;
</pre>
<p>Dann habe ich ein kleines DIV samt Bild mit den CSS Eigenschaften &#8220;position:absolute&#8221; und &#8220;display:none&#8221; hinzugefügt. Das DIV kann mit Prototype so nämlich frei positioniert werden, wird aber vorerst nicht angezeigt.</p>
<pre class="brush:html">
	&lt;!-- Create hidden bouncing ball layer (ajax-loading.gif or similar) --&gt;
	&lt;div id="bouncer" style="position:absolute;display:none"&gt;&lt;img src="/images/ball.gif" alt=""/&gt;&lt;/div&gt;
</pre>
<p>Als nächstes wird ein Event-Handler an den Event &#8220;onmousemove&#8221; des Body-Tags geklebt. Der Handler ermittelt die aktuellen Maus-Koordinaten und platziert das (noch immer versteckte) DIV versetzt neben der Maus.</p>
<pre class="brush:js">
	// Move the bouncing ball next to mouse cursor position
	$('body').onmousemove = function( e ) {
		mouseX = Event.pointerX( e );
		mouseY = Event.pointerY( e );
		$('bouncer').setStyle( { left: (mouseX+15) + 'px', top: (mouseY+15) + 'px' } );
     		return true;
	}
</pre>
<p>Danach habe ich meine AJAX-Load Funktion noch so abgeändert, dass mit Beginn des Requests das DIV mit der Grafik angezeigt wird und bei Erfolg oder Fehler wieder versteckt wird. Anbei eine kleine Beispiel-Funktion.</p>
<pre class="brush:js">
	// Example function to use the bouncer
	function ajax_load( uri )
	{
		$('bouncer').show();
		new Ajax.Request( uri, {
					onSuccess: function( r ) {
						$('bouncer').hide();
					},
					onFailure: function( r ) {
						$('bouncer').hide();
					}
		});
	}
</pre>
<p>Wirklich einfach, aber ein toller und ausnahmsweise auch mal sinnvoller Effekt. ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/ajax-loading-grafik-neben-dem-mauszeiger-anzeigen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress dazu bringen Seiten per AJAX zu laden</title>
		<link>http://thegeek.de/wordpress-dazu-bringen-seiten-per-ajax-zu-laden</link>
		<comments>http://thegeek.de/wordpress-dazu-bringen-seiten-per-ajax-zu-laden#comments</comments>
		<pubDate>Fri, 23 Oct 2009 13:37:48 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[eyecandy]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[scriptaculous]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=186</guid>
		<description><![CDATA[Wer im Browser sein Javascript aktiviert hat, der wird sicherlich sehen, dass beim Klicken eines Links der Content hier dynamisch geladen wird. Um das in meinem WordPress Theme zu realisieren, habe ich zwei einfache JavaScript Funktionen geschrieben. Als JS Bibliotheken nutze ich dafür Prototype und Scriptaculous, es ginge aber auch sicherlich mit JQuery. Vorteil der [...]]]></description>
			<content:encoded><![CDATA[<p>Wer im Browser sein Javascript aktiviert hat, der wird sicherlich sehen, dass beim Klicken eines Links der Content hier dynamisch geladen wird. Um das in meinem WordPress Theme zu realisieren, habe ich zwei einfache JavaScript Funktionen geschrieben. Als JS Bibliotheken nutze ich dafür Prototype und Scriptaculous, es ginge aber auch sicherlich mit JQuery.</p>
<p>Vorteil der Lösung: Wenn ein Fehler auftritt, oder im Browser kein JavaScript aktiviert ist, dann funktioniert die Seite ganz normal, was nebenbei auch sehr Suchmaschinen freundlich ist.</p>
<p>Die erste Funktion &#8220;fixLinks&#8221; die ich nutze, hat den Zweck an alle Links, die nicht bestimmten Kriterien entsprechen &#8211; z.B. Links auf Bilder, externe Links oder aber Links in WordPress Backend &#8211; eine &#8220;onclick&#8221; Aktion anzufügen. Die neue &#8220;onclick&#8221; Aktion des Links ruft dann die zweite Funktion &#8220;get_page&#8221; auf, welche die Seite läd und mit einem netten Effekt dann anzeigt.</p>
<pre class="brush:js">function fixLinks()
{
	var myLinks = document.links;
	var myBrowserType = (window.attachEvent ? 1 : (window.addEventListener ? 2 : 0));
	var myDomain = 'thegeek.de';
	for( var i = 0; i < myLinks.length; i++ )
	{
		// Get the href
		myHref = myLinks[i].href.toString();
		// Get the onclick action
		myOnClick = myLinks[i].onclick ? myLinks[i].onclick : '';
		// Only attack onclick action, if not jscript links, images, wp-admin features and internal link
		if( 	myOnClick == ''
			&amp;&amp; myHref.indexOf( "#" ) != (myHref.length - 1)
			&amp;&amp; myHref.indexOf( "javascript:" ) == -1
			&amp;&amp; myHref.indexOf( "wp-admin" ) == -1
			&amp;&amp; myHref.indexOf( "#respond" ) == -1
			&amp;&amp; myHref.indexOf( "/trackback" ) == -1
			&amp;&amp; myHref.indexOf( "/feed" ) == -1
			&amp;&amp; myHref.indexOf( "/wp-login" ) == -1
			&amp;&amp; myHref.indexOf( ".jpg" ) == -1
			&amp;&amp; myHref.indexOf( ".gif" ) == -1
			&amp;&amp; myHref.indexOf( ".png" ) == -1
			&amp;&amp; myHref.indexOf( myDomain) != -1
		)
		{
			switch( myBrowserType )
			{
				case 1:
					Event.observe( myLinks[i], 'click', function( e ) { if( !get_page( this.href ) ) e.stop(); } );
					break;
				case 2:
					myLinks[i].setAttribute( "onclick", "return get_page( this.href );" );
					break;
				default:
					// Do nothing
			}
		}
	}
}
// body onload="fixLinks()" und die Sache läuft. :-)
</pre>
<p>Die zweite Funktion bewegt zuerst den Inhalt an die beim Init ermittelt Position außerhalb des Bildschirms und läd dann per asynchronem HTTP Request die neue Seite. Der Inhalt der Seite ist im Theme mit einem HTML Kommentar gekennzeichnet und wird mittels Regular Expression ermittelt, dann in den Layer eingefügt, um die Seite danach wieder an die ursprüngliche Position zu bewegen. Keine Ahnung, ob's im IE klappt, ist mir allerdings auch ziemlich egal. :-)</p>
<p>Sollte etwas schief gehen, dann gibt die Funktion "true" zurück, womit der Klick auf den Link ganz normal ausgewertet wird. Hat alles geklappt, liefert die Funktion "false" zurück und der Browser folgt dem angeklicktem Link dann nicht. So ist auf jeden Fall gewährleistet, dass die neue Seite angezeigt wird - auf die synchrone oder asynchrone Art.</p>
<pre class="brush:js">	var	c_w = $('content').getWidth();
	var	c_x = $('content').viewportOffset()[0];
	var	c_leave = (c_x + c_w) * -1;
	var	c_come = c_leave * -1;
	var	c_search = /(<!-- CONTENT -->)((?:.|[\r\n])*?)(<!-- \/CONTENT -->)/mgi;
	var	get_page_return_code = false;
	var	effect_running = false;
	function get_page( uri )
	{
		get_page_return_code = false;
		if( effect_running == false )
		{
			effect_running = true;
			new Effect.Move( 'content', { x: c_leave, y: 0, mode: 'relative', duration:0.5,
				afterFinish:function() {
					new Ajax.Request(	uri, {
									method:'get',
									onSuccess: function( r ) {
											$('content').update( '' );
											SearchResult = c_search.exec( r.responseText );
											while( SearchResult != null )
											{
												if( SearchResult[ 2 ] )
													$('content').update( SearchResult[ 2 ] );
												SearchResult = c_search.exec( r.responseText );
											}
											new Effect.Move( 'content', { x: c_come, y: 0, mode: 'relative', duration:0.5, afterFinish:function () {effect_running = false;} } );
											fixLinks();
									},
									onFailure: function( r ) {
										get_page_return_code = true;
										effect_running = false;
									}
					});
				}
			});
		}
		return get_page_return_code;
	}
</pre>
<p>Klar handelt es sich hier um ziemliches sinnfreies Eyecandy. Ich mag Eyecandy.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/wordpress-dazu-bringen-seiten-per-ajax-zu-laden/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

