<?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>Tue, 09 Mar 2010 16:09:05 +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>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 Schriften [...]]]></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 4
Datenblatt 5

Jede Menge Daten [...]]]></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>1</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 gestern [...]]]></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 die E-Mail Adresse ohne &#8220;@&#8221;-Zeichen und Domain ausgegeben, was [...]]]></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 Lösung: [...]]]></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>0</slash:comments>
		</item>
	</channel>
</rss>
