<?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>ROAE-Blog &#187; Javascript</title>
	<atom:link href="http://blog.root-of-all-evil.com/category/codeschnipsel/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.root-of-all-evil.com</link>
	<description>Studium, Codeing und Gedachtes</description>
	<lastBuildDate>Mon, 30 Jan 2012 22:58:12 +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>Using -webkit and/or -moz Styles with mootools.</title>
		<link>http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/</link>
		<comments>http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 15:57:17 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[Fx]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[moz]]></category>
		<category><![CDATA[property]]></category>
		<category><![CDATA[setStyle]]></category>
		<category><![CDATA[styles]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=808</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/" title="Using -webkit and/or -moz Styles with mootools."></a>In order to use -webkit and/or -moz style CSS3 attributes such as &#8216;-webkit-transform&#8217; or &#8216;-moz-rounded-border&#8217; to generate rounded borders, transformations etc. you have to extend the mootools Element.Styles hash. Doing this enables you to use the Element.setStyle() method. You can &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/" title="Using -webkit and/or -moz Styles with mootools."></a><p>In order to use -webkit and/or -moz style CSS3 attributes such as &#8216;-webkit-transform&#8217; or &#8216;-moz-rounded-border&#8217; to generate rounded borders, transformations etc. you have to extend the mootools Element.Styles hash. Doing this enables you to use the Element.setStyle() method. You can even use the whole mootools effects library and tween -webkit and/or -moz styles.</p>
<pre class="JavaScript" title="code">Element.Styles.extend({
	WebkitTransform: 'rotateX(@deg)'
});</pre>
<p>The styles property-name has to be given camelCases. Thus &#8216;-webkit-transform&#8217; has to be given as &#8216;WebkitTransform&#8217;. Specify how the property has to be set by defining a string like &#8216;rotateX(@deg)&#8217; and leaving the @ to be replaced by the value you set the css property to.</p>
<p>Read on for an example.<span id="more-808"></span></p>
<pre class="JavaScript" title="code">Element.Styles.extend({
	WebkitTransform: 'rotateX(@deg)' // @ will get replaced by the value you pass over
});

window.addEvent('domready', function() {
	$('button').addEvent('click', function() {
		var swingAnimation = new Fx.Tween($('contentBox'), {
			property: '-webkit-transform',
			duration: 2000,
			transition: Fx.Transitions.Elastic.easeOut
		});
		swingAnimation.start(60, 0);
	});
});</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Favelizer &#8211; ein 16&#215;16 Pixel Frequenz Spectrum</title>
		<link>http://blog.root-of-all-evil.com/2010/05/favelizer-ein-16-x-16-pixel-frequenz-spectrum/</link>
		<comments>http://blog.root-of-all-evil.com/2010/05/favelizer-ein-16-x-16-pixel-frequenz-spectrum/#comments</comments>
		<pubDate>Mon, 03 May 2010 20:18:34 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[audio tag]]></category>
		<category><![CDATA[equalizer]]></category>
		<category><![CDATA[frequency]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[processing.js]]></category>
		<category><![CDATA[spectrum]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=776</guid>
		<description><![CDATA[Favelizer - ein 16 x 16 Pixel Frequenz Spectrum in der Browseradresszeile! Mit HTML 5 kommt auch das neue audio Element. Es erlaubt das Abspielen von Audiodateien direkt im Browser. Eine kleine Gruppe Entwickler bei Mozilla bemühen sich auch um eine Audio API, die das Abfragen und Manipulieren der Audioelemente ermöglichen kann. Noch gilt die API als experimentel, soll aber in zukünftige Firefox Versionen zu finden sein.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/05/favelizer-ein-16-x-16-pixel-frequenz-spectrum/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/05/favelizer-ein-16-x-16-pixel-frequenz-spectrum/" title="Favelizer - ein 16x16 Pixel Frequenz Spectrum"></a><p>Mit HTML 5 kommt auch das neue &lt;audio&gt; Element. Es erlaubt das abspielen von Audiodateien direkt im Browser. Eine kleine Gruppe Entwickler bei Mozilla bemühen sich auch um eine Audio API, die das Abfragen und Manipulieren der Audioelemente ermöglichen kann. Noch gilt die API als experimentel, soll aber in zukünftige Firefox Versionen zu finden sein.</p>
<p>Was für Möglichkeiten sich mit dieser API ergeben zeigen <a href="http://vocamus.net/dave/?p=1074" target="_blank">zahlreiche eindrucksvolle Beispiele</a>. Hier ist eines meiner Experimente:<br />
<span id="more-776"></span><br />
Favelizer &#8211; ein 16 x 16 Pixel Frequenz Spectrum in der Browseradresszeile:</p>
<p><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/05/favelizer.jpg" rel="lightbox[776]"><img class="aligncenter size-medium wp-image-777" title="favelizer" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/05/favelizer-300x137.jpg" alt="" width="300" height="137" /></a>Eine Live-Vorschau findet sich hier: <a title="Favelizer" href="http://labs.daslaboratorium.de/favelizer" target="_blank">http://labs.daslaboratorium.de/favelizer</a></p>
<p>Wer sich die gepatchte Firefox-Beta nicht herunterladen möchte, kann den Favelizer auch hier in Aktion ansehen (leider ohne Sound):</p>
<p><object width="680" height="520"><param name="movie" value="http://blog.root-of-all-evil.com/wp-content/uploads/2010/05/Favelizer.swf"><param name="quality" value="high"><param name="bgcolor" value="#FF6633"><embed src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/05/Favelizer.swf" quality="high" type="application/x-shockwave-flash" width="680" height="520"></embed></object></p>
<h3>So funktionierts:</h3>
<p>Das Audio-Element erhält ein onaudiowritten Attribut, mit dem wir beim Abspielen der Musik fortlaufend eine beliebige Javascript Funktion aufrufen können:</p>
<pre class="html" title="code">&lt;audio src="datei.ogg" controls="true" onaudiowritten="update(event);"&gt;</pre>
<p>Mit dem übergebenen event-Objekt können wir auf die Audio-Signale zugreifen:</p>
<pre class="JavaScript" title="code">function update(event) {
     signal   = event.mozFrameBuffer;
     spectrum = event.mozSpectrum;
 }
</pre>
<p>Um das Favicon dynamisch und möglichst schnell erzeugen zu können, greife ich auf processing.js zurück. Das ist wesentlich einfacher als beispielsweise mit</p>
<pre class="JavaScript" title="code">ctx = $('frame').getContext('2d');
ctx.fillStyle = '#000';
ctx.fillRect(1, 1, 1, 16);</pre>
<p>Pixel für Pixel einzeln zu färben.</p>
<p><a href="http://processingjs.org/" target="_blank">Processing.js</a> ist eine durch Javascript verwirklichte eigene Programmiersprache und gleicht in seinem Aufbau Java. Processing.js nutzt das html5 canvas object und ermöglicht beeindruckende Graphikdarstellungen im Browser &#8211; ganz ohne Flash.</p>
<p>Mit einem bisschen Mathematik lässt sich so ganz einfach ein Frequenz Spectrum auf 16 x 16 Pixel bringen:</p>
<pre class="Java" title="code">void draw() {
    background(0);
    strokeWeight(1.0);

    if (spectrum.length &gt; 0) {
        for (int i = 0; i &lt;= 16; i++) {
            var j         = i + 30 * spectrum.item(i * 4);
            var log       = -1 * Math.log(1 / j);
            var magnitude = 16 - spectrum.item(i * 4) * 256 * log;
            stroke(0, 255, 0);
            line(i, 16, i, 16 - magnitude);
        }
    }
}</pre>
<p>Das Favicon brauchen wir dann nur noch in regelmäßigen Abständen auszutauschen:</p>
<pre class="JavaScript" title="code">window.setInterval(function() {
    var icon = $('icon');
    var newIcon = icon.cloneNode(true);
    newIcon.setAttribute('href', ctx.canvas.toDataURL());
    icon.parentNode.replaceChild(newIcon, icon);
 }, 60);
</pre>
<p>Es lohnt sich auf jeden Fall ein Blick in den Sourcecode: <a title="Favelizer" href="http://labs.daslaboratorium.de/favelizer" target="_blank">http://labs.daslaboratorium.de/favelizer</a></p>
<h3>Es stockt bei mir!?</h3>
<p>Das liegt daran, dass wir zum Austausch der einzelnen Favicon-Frames ein neues Objekt erstellen und damit das alte Icon auswechseln müssen. Da häuft sich natürlich einiges an Datenmüll (alte, nicht mehr verwendete Objekte) an, der aufwendig beseitigt werden muss. Der sg. Garbage-Collector verschluckt sich. Eine schnelle Lösung habe ich im Moment leider noch nicht parat.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/05/favelizer-ein-16-x-16-pixel-frequenz-spectrum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 WebSocket &#8211; Fullduplex Verbindungen mit JavaScript</title>
		<link>http://blog.root-of-all-evil.com/2010/04/html5-websocket-fullduplex-verbindungen-uber-javascript-und-html5/</link>
		<comments>http://blog.root-of-all-evil.com/2010/04/html5-websocket-fullduplex-verbindungen-uber-javascript-und-html5/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 13:02:30 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[google chrome]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[pywebsocket]]></category>
		<category><![CDATA[Websocket]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=752</guid>
		<description><![CDATA[Das WebSocket Interface erlaubt den Aufbau einer bestehenden, fullduplex Verbindung über das WebSocket Protokoll und lässt sich erstaunlich einfach mit JavaScript in die eigenen Webanwendungen implementieren.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/04/html5-websocket-fullduplex-verbindungen-uber-javascript-und-html5/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/04/html5-websocket-fullduplex-verbindungen-uber-javascript-und-html5/" title="HTML5 WebSocket - Fullduplex Verbindungen mit JavaScript"></a><p>Das »Web2.0« mit seiner neuen (alten) Technologie Ajax macht viele Webseiten zu komplexen Programmen. Webseiten können zur Laufzeit verändert und mit dynamischen Inhalten gefüttert werden. Doch Ajax ist nicht unbedingt geeignet für jede Webanwendung, da es immer noch zwei Verbindungen benötigt: Einen Up-Stream für die GET- oder POST-Anfrage und einen Downstream für die Response.</p>
<p>Wer beispielsweise schon einmal mit Google Wave gespielt hat, wird merken, dass eingegebene Zeichen (mit sehr kurzer Verzögerung) auf dem Bildschirm des Gesprächspartners erscheinen. Wer so etwas mit Ajax verwirklichen will muss trickreich mit so genannten long live HTTP GET Requests spielen (<a title="Google I/O Wave uses long live HTTP GET Requests" href="http://code.google.com/intl/fr-FR/events/io/2009/sessions/GoogleWavePoweredByGWT.html" target="_blank">siehe diese Google Wave Präsentation</a>, Minute 11:00). Doch Abhilfe naht: das HTML5 WebSocket Interface findet sich bereits in den erstsen Web-Browsers implementiert. Auch der neue <a href="http://dev.w3.org/html5/websockets/" target="_blank">Editor&#8217;s Draft der WebSocketAPI</a> von gestern (15. April 2010) sieht vielversprechend aus.</p>
<p><span id="more-752"></span>Das WebSocket Interface erlaubt den Aufbau einer bestehenden, fullduplex Verbindung über das WebSocket Protokoll und lässt sich erstaunlich einfach mit JavaScript in die eigenen Webanwendungen implementieren. Es besitzt einen Constructor</p>
<pre class="JavaScript" title="code">WebSocket(url [, protocol])</pre>
<p>mit den Parameter URL (String) und dem optionalen Parameter protocoll (String).</p>
<p>Das WebSocket Interface besitzt die folgenden Attribute:</p>
<pre>readonly String URL
readonly unsigned short readyState
    0 = Connecting
    1 = Open
    2 = Closing
    3 = Closed
readonly unsigned long bufferedAmount</pre>
<p>Das WebSocket Interface besitzt zudem die folgenden Funktionen:</p>
<pre>boolean send(String data)
void close()</pre>
<p>Außerdem besitzt das Interface folgende Events:</p>
<pre>onopen
onmessage
onerror
onclose</pre>
<p>Eine typische und rudimentäre Implementierung könnte demnach so aussehen:</p>
<pre class="JavaScript" title="code">var mySocket = new WebSocket('ws://domain.com:80');
mySocket.onopen = function() {
    setInterval(function() {
        mySocket.send('Hello');
    }, 50);
}</pre>
<p>Wir erstellen demnach ein WebSocket Objekt und senden alle 50ms eine Nachricht an den Empfänger auf Port 80. Hier können bereits Probleme auftreten: Was wenn die Verbindung des ausführenden Rechners nicht ausreicht um alle 50ms eine Nachricht zu versenden? Hierfür nehmen wir das Attribut bufferedAmount zur Hilfe. bufferedAmount ist nur dann gleich 0, wenn keine Daten mehr in der Warteschlange zum Versenden sind. Unsere überarbeitete Implementierung:</p>
<pre class="JavaScript" title="code">var mySocket = new WebSocket('ws://domain.com:80');
mySocket.onopen = function() {
    setInterval(function() {
        if(mySocket.bufferedAmount == 0) {
            mySocket.send('Hello');
        }
    }, 50);
}
</pre>
<p>Empfangene Daten können wir mit dem onmessage Event verarbeiten:</p>
<pre class="JavaScript" title="code">mySocket.onmessage = function(data) {
    document.getElementById('Output').appendChild(
        document.createTextNode(data)
    );
}
</pre>
<p>Hier zeigen wir die Daten im Browserfenster an. Fehler können wir mit dem error Event abfangen. Das Auslösen des error Events muss nicht zwangsläufig bedeuten, dass die Verbindung abgebrochen ist, kann es aber:</p>
<pre class="JavaScript" title="code">mySocket.onerror = function(error) {
    alert('error');
    if(mySocket.readyState != 1) {
        document.getElementById('Output').appendChild(
            document.createTextNode("Ein Fehler ist aufgetreten.")
        );
    }
}
</pre>
<p>Um Daten mit einem Server auszutauschen benötigen wir einen Server, der das WebSocket-Protokoll unterstützt. Für die ersten Experimente eignet sich zum Beispiel <a href="http://code.google.com/p/pywebsocket/" target="_blank">pywebsocket</a>. Es kann sowohl als Apache-Modul oder auch als Stand-Alone-Server betrieben werden.</p>
<p>Im Moment unterstützen meines Wissens leider nur Google Chrome und Safari WebSocket. Firefox wird es in nicht alzu ferner Zukunft implementieren. <a href="http://bloga.jp/ws/jq/conn/wsdemo2.htm" target="_blank">Eine Chat-Demo unter Verwendung von WebSockets findet sich hier</a>.</p>
<p>Anregungen? Hierfür sind die Kommentare da.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/04/html5-websocket-fullduplex-verbindungen-uber-javascript-und-html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Verlinkbare AJAX-Seiten für Favoriten &#8211; Parameterübergabe in Ankern</title>
		<link>http://blog.root-of-all-evil.com/2010/04/verlinkbare-ajax-seiten-fur-favoriten-parameterubergabe-in-ankern/</link>
		<comments>http://blog.root-of-all-evil.com/2010/04/verlinkbare-ajax-seiten-fur-favoriten-parameterubergabe-in-ankern/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 17:06:03 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Erklärungen]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[Favoriten]]></category>
		<category><![CDATA[Parameter]]></category>
		<category><![CDATA[verlinkbare Ajax-Seiten]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=164</guid>
		<description><![CDATA[Einer der Hauptkritikpunkte von Ajax ist die fehlende native Unterstützung von Bookmarks - also Favoriten. Dynamisch durch Javascript und Ajax veränderte Webseiten lassen sich nicht in ihrem momentanen Zustand zu den Favoriten hinzufügen, da lediglich die URL der Seite nicht aber die vorangegangen Aktionen des Benutzers die zum momentanen Zustand der Seite geführt haben, gespeichert werden. Gleiches gilt für das Verlinken auf solche dynamischen Seiten - in Zeiten des Austausch von Links in sozialen Netzwerken ein nicht zu unterschätzendes Defizit.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/04/verlinkbare-ajax-seiten-fur-favoriten-parameterubergabe-in-ankern/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/04/verlinkbare-ajax-seiten-fur-favoriten-parameterubergabe-in-ankern/" title="Verlinkbare AJAX-Seiten für Favoriten - Parameterübergabe in Ankern"></a><p>Webseiten sind in Zeiten des Web2.0 häufig komplexe, dynamische Programme. Große Soziale Netze wie Facebook machen es vor: Das Wechseln von einer Seite zur nächsten mittels Links hat ausgedient. Vielmehr werden die Inhalte dynamisch mit Hilfe von Ajax-Anfragen in das Layout geladen. Damit ergeben sich aber auch einige Nachteile.</p>
<p>Einer der Hauptkritikpunkte von Ajax ist die fehlende native Unterstützung von Bookmarks &#8211; also Favoriten. Dynamisch durch Javascript und Ajax veränderte Webseiten lassen sich nicht in ihrem momentanen Zustand zu den Favoriten hinzufügen, da lediglich die URL der Seite nicht aber die vorangegangen Aktionen des Benutzers die zum momentanen Zustand der Seite geführt haben, gespeichert werden. Gleiches gilt für das Verlinken auf solche dynamischen Seiten &#8211; in Zeiten des Austausch von Links in sozialen Netzwerken ein nicht zu unterschätzendes Defizit.</p>
<p>Dabei gibt es Wege und Möglichkeiten auch Javascript mit Parametern über eine URL zu versorgen. Ein simples Beispiel soll hier gezeigt werden.<br />
<span id="more-164"></span></p>
<h3>Javascript Parameter mittels Anker</h3>
<p>Anker, das ist der letzte Teil einer jeden URL, beginnend mit einem Raute- oder auch Hash-Zeichen(#). Anker verweisen auf &#8216;Lesezeichen&#8217; auf der Webseite und dienen dazu, beim Verlinken verticale Lesezeichen anzuspringen oder auch um innerhalb einer Webseite vertikal zu springen.</p>
<p>Der große Vorteil von Ankern für Javascript Parameter ist die Möglichkeit diese durch Javascript zur Laufzeit zu verändern ohne, dass die Webseite verlassen wird. Es ist also möglich die Anker jederzeit durch Javascript ohne Einschränkung des Benutzers zu bearbeiten. Anker können über den Zugriff auf die Eigenschaft</p>
<pre>window.location.hash</pre>
<p>ausgelesen und verändert werden.</p>
<h3>Mehrere Javascript Parameter im Anker unterbringen</h3>
<p>Wie bei gewöhnlichen GET-Parametern, müssen auch mehrere Javascript Parameter möglich sein. GET-Parameter verwenden zur Trennung ein &amp; Zeichen:</p>
<pre>http://url.de?parameter1=wert1<strong><span style="color: #ff0000;">&amp;</span></strong>parameter2=wert2</pre>
<p>Auch bei Javascript-Parametern kann ein &amp;-Zeichen verwendet werden um Parameter von einander zu trennen. Ich persönlich schlage aber das ~-Zeichen vor um Javascript-Parameter von den gewöhnlichen GET-Parametern auch optisch zu trennen.</p>
<pre>http://url.de?parameter1=wert1<strong>&amp;</strong>parameter2=wert2#javascript1=jswert1<strong><span style="color: #ff0000;">~</span></strong>javascript2=jswert2</pre>
<p>Selbstverständlich ist dies nur Geschmackssache und ist abhängig von der jeweiligen verwendeten Implementierung.</p>
<h3>Javascript Parameter auslesen</h3>
<p>Um die mitgegebenen Parameter auszulesen nutze ich die folgende rudimentäre Implementierung:</p>
<pre class="JavaScript" title="code">function getParams() {
	var params = window.location.hash.replace('#', '').split('~');
	var toReturn = new Array();
	for(var i = 0; i &lt; params.length; i++) {
		var find = /^(\w+)(=(.*))?$/;
		find.exec(params[i]);
		toReturn[RegExp.$1] = RegExp.$3;
	}
	return toReturn;
}</pre>
<p>Die Funktion wird beim Start ausgeführt und gibt ein assoziatives Array ähnlich der $_GET und $_POST Arrays in PHP zurück. Selbstverständlich ist auch eine objekt-orientierte Implementierung möglich (ja, richtig gehört, Javascript kann sehr wohl objektorientiert sein).</p>
<h3>Javascript Parameter setzen und löschen</h3>
<p>Javascript Parameter können wie folgt gesetzt werden:</p>
<pre class="JavaScript" title="code">function setParam(param, value) {
	var paramtxt = (value) ? param + '=' + value : param; // Parameter zusammensetzen
	var params = window.location.hash.replace('#', '').split('~');
	var location = params.findParam(param);
	if(location === false)
		// wenn der Parameter noch nicht gesetzt war, setzen wir den Parameter neu
		params.push(paramtxt);
	else
		// war der Parameter schon gesetzt ändern wir ihn entsprechend ab
		params[location] = paramtxt;
	window.location.hash = params.join('~');
}

/* Array.findParam(needle) Hilfsfunktion - ähneld einer in_array Funktion */
Array.prototype.findParam = function(needle) {
	for(var i = 0; i &lt; this.length; i++)
		if(this[i].search('^' + needle + '(=.*)?$') != -1) return i;
	return false;
}</pre>
<p>Parameter lassen sich so ohne Probleme neu setzen oder überschreiben. Um Parameter komplett zu löschen eignet sich folgende Funktion:</p>
<pre class="JavaScript" title="code">function removeParam(param) {
	var params = window.location.hash.split('~');
	var location = params.findParam(param);
	if(location !== false)
		params.splice(location, location);
	window.location.hash = params.join('~');
}</pre>
<p>Mit diesen drei Funktionen können wir also Javascript Parameter im Anker auslesen, setzen und löschen. Das sollte für eine einfache Implementierung reichen.</p>
<h3>Beispiel</h3>
<p>Ein einfaches Anwendungsbeispiel findet sich hier: <a title="Javascript Parameter in Anker für verlinkbare Ajax-Webseiten" href="http://labs.daslaboratorium.de/roae/jsparams.html" target="_blank">http://labs.daslaboratorium.de/roae/jsparams.html</a></p>
<p>Mein erster Gehversuch mit JavaScript Parameter findet sich auf <a title="Regnets.in/deinerStadt?" href="http://www.regnets.in" target="_blank">www.regnets.in</a> implementiert.</p>
<p>Kommentare oder Anregungen? Dafür gibt es die Möglichkeit zum Kommentieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/04/verlinkbare-ajax-seiten-fur-favoriten-parameterubergabe-in-ankern/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bookmarklet erstellen: Methode bei HTML-Formularen ändern</title>
		<link>http://blog.root-of-all-evil.com/2010/02/bookmarklet-erstellen-methode-bei-html-formularen-andern/</link>
		<comments>http://blog.root-of-all-evil.com/2010/02/bookmarklet-erstellen-methode-bei-html-formularen-andern/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 17:25:12 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[bookmarklet]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[form method]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[post]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=441</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/02/bookmarklet-erstellen-methode-bei-html-formularen-andern/" title="Bookmarklet erstellen: Methode bei HTML-Formularen ändern"></a>Als Entwickler ist es oft wichtig zu sehen welche Daten übetragen werden. Gründe hierfür sind z.B. Sicherheit und Debuging. Folgendes Bookmarklet, wandelt alle Formulare auf der Seite von post- auf get-Formulare um. Nachstehende Funktion ermittelt alle Form-Tags auf der Seite. &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/02/bookmarklet-erstellen-methode-bei-html-formularen-andern/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/02/bookmarklet-erstellen-methode-bei-html-formularen-andern/" title="Bookmarklet erstellen: Methode bei HTML-Formularen ändern"></a><p>Als Entwickler ist es oft wichtig zu sehen welche Daten übetragen werden. Gründe hierfür sind z.B. Sicherheit und Debuging. Folgendes Bookmarklet, wandelt alle Formulare auf der Seite von post- auf get-Formulare um.</p>
<p><span id="more-441"></span></p>
<p>Nachstehende Funktion ermittelt alle Form-Tags auf der Seite. Sie überprüft anschließend, ob das method-Attribute vorhanden ist, wenn nicht wird es erstellt und der Wert &#8220;get&#8221; zugewiesen. Sollte das method-Attribute vorhanden sein, und den Wert &#8220;post&#8221; besitzen, wird dieser auf &#8220;get&#8221; geändert.</p>
<pre class="javascript" title="code">function changePostToGet()
{
	count = 0;
	els = document.getElementsByTagName('form');
	for(i=0;i&lt;els.length;i++)
	{
		if(!els[i].getAttribute('method'))
		{
			attrib = document.createAttribute('method');
			attrib.nodeValue = 'get';
			els[i].setAttributeNode(attrib);

			count ++;
		}
		else if(els[i].getAttribute('method').toLowerCase()=='post')
		{
			els[i].setAttribute('method', 'get');

			count ++;
		}
	}

	alert(count+' form(s) transformed.');
}</pre>
<p>Da es nun praktisch schlecht ist, diesen Code auf jeder Seite unterzubringen, auf welchen man ihn benötigen würde, erstellen wir uns daraus ein <a href="http://de.wikipedia.org/wiki/Bookmarklet">Bookmarklet</a>.</p>
<p>Der Funktionsrumpf wird hierzu in den <a href="http://javascriptcompressor.com/">Javascript Compressor</a> kopiert, welcher daraus folgenden String erstellt:</p>
<pre class="javascript" title="code">count=0;els=document.getElementsByTagName('form');for(i=0;i&lt;els.length;i++){if(!els[i].getAttribute('method')){attrib=document.createAttribute('method');attrib.nodeValue='get';els[i].setAttributeNode(attrib);count++}else if(els[i].getAttribute('method').toLowerCase()=='post'){els[i].setAttribute('method','get');count++}}alert(count+' form(s) transformed.');</pre>
<p>Um das Bookmarklet jetzt z.B. im Firefox zu benutzen, wird über den Lesezeichenmanager in der Lesezeichen-Symbolleiste ein neuer Favorit erstellt.  Bei Adresse tragen wir <em>javascript:&lt;code&gt;</em> ein wobei <em>&lt;code&gt;</em>durch den obigen String ersetzt wird.</p>
<div id="attachment_442" class="wp-caption aligncenter" style="width: 387px"><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/02/22.02.jpg" rel="lightbox[441]"><img class="size-full wp-image-442" title="Bookmarklet in Firefox" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/02/22.02.jpg" alt="" width="377" height="265" /></a><p class="wp-caption-text">Erstellen eines neuen Bookmarklets in Firefox</p></div>
<p>Nach dem Klick auf &#8220;Hinzufügen&#8221; werden nun alle Formulare auf der Seite welche man gerade betrachtet, von post in get konvertiert.</p>
<p>Alternativ reicht es auch diesen Link in die Favoritenleiste des Browsers zu ziehen: <a style="cursor: move;" title="PostToGet Bookmarklet" href="javascript:count=0;els=document.getElementsByTagName('form');for(i=0;i&lt;els.length;i++){if(!els[i].getAttribute('method')){attrib=document.createAttribute('method');attrib.nodeValue='get';els[i].setAttributeNode(attrib);count++}else if(els[i].getAttribute('method').toLowerCase()=='post'){els[i].setAttribute('method','get');count++}}alert(count+' form(s) transformed.');">PostToGetBookmarklet</a></p>
<p>Wird dann ein solches Formular abgeschickt, ist schnell ersichtlich welche Parameter welchen Wert besitzen &#8211; ohne das Änderungen an der Webseite selbst vorgenommen werden müssen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/02/bookmarklet-erstellen-methode-bei-html-formularen-andern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das Zend Framework und die eBay trading API – Teil 4</title>
		<link>http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/</link>
		<comments>http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 16:09:35 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Guides]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[eBay]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[trading API]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=370</guid>
		<description><![CDATA[Wir werden einen Prozess schaffen, der es dem Nutzer erlaubt den eBay User Consent Flow mit Hilfe unserer Webapplikation zu durchschreiten. Dieser Prozess soll möglichst unkompliziert, direkt und intuitiv bedienbar sein. Ich empfehle also die Verwendung von Ajax-Methoden um das User Interface und den darzustellenden Prozess zu visualisieren. Wie das Zend Framework mit Ajax Anfragen umgehen kann wird hier also auch Thema sein.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/" title="Das Zend Framework und die eBay trading API – Teil 4"></a><p>Die ersten drei Teile dieser Reihe hatten sich mit der theoretischen und praktischen Implementierung des User Consent Flow Prozesses, der für die Authentifizierung des Nutzers mit und der Verwendung der eBay Trading API notwendig ist, befasst. Im vierten und letzten Teil sollen die Implementierungen der letzten drei Teile (<a title="Zum ersten Teil dieses Guides" href="http://blog.root-of-all-evil.com/?p=131" target="_self">Teil 1</a>, <a title="Teil zwei dieser Reihe" href="http://blog.root-of-all-evil.com/?p=161" target="_self">Teil 2</a>, <a title="Der dritte Teil dieser Reihe" href="http://blog.root-of-all-evil.com/?p=205" target="_self">Teil 3</a>) dieser Reihe in die Controller und Views umgesetzt und so ein visueller Anmelde- und Authentifizierungsprozess geschaffen werden.</p>
<h3>Was wird Teil 4 dieses Guides zeigen?</h3>
<p>Wir werden einen Prozess schaffen, der es dem Nutzer erlaubt den eBay User Consent Flow mit Hilfe unserer Webapplikation zu durchschreiten. Dieser Prozess soll möglichst unkompliziert, direkt und intuitiv bedienbar sein. Ich empfehle also die Verwendung von Ajax-Methoden um das User Interface und den darzustellenden Prozess zu visualisieren. Wie das Zend Framework mit Ajax Anfragen umgehen kann wird hier also auch Thema sein.<span id="more-370"></span></p>
<h3>Warum Ajax?</h3>
<p>Wenn wir uns eben an den Ablauf des (<a title="Teil 1" href="http://blog.root-of-all-evil.com/?p=131" target="_blank">in Teil 1 ausführlich beschriebenen</a>) Consent Flow Prozesses erinnern: Der Benutzer muss selbst nur wenige Klicks und Eingaben machen &#8211; namentlich die Anmeldung auf der eBay Login-Seite zu der er weitergeleitet wird. Im Hintergrund muss unsere Applikation allerdings zwei Anfragen machen. (1) Eine SessionID von der eBay trading API anfragen und (2) nach der Rückkehr des Benutzers<a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow.jpg" rel="lightbox[370]"><img class="alignright size-thumbnail wp-image-139" title="eBayUserConsentFlow" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow-150x150.jpg" alt="Der eBay User Consent Flow" width="150" height="150" /></a> zur Applikation den mit der SessionID verknüpften Auth-Token anfragen.</p>
<p>Hier empfehle ich Ajax: Dem Benutzer soll visualisiert werden, dass sich hinter den Kulissen etwas tut und nicht lange auf den Seitenaufbau warten müssen (die API-Anfragen dauern ein paar wenige Sekunden). Wir werden also die Seite ausliefern, und von dieser eine Ajax-Anfrage starten, die die getSessionID und später die fetchToken Actionen anstoßen wird. Der Benutzer wird ein Lade-Grafik sehen und damit merken, dass sich etwas tut. Die Weiterleitung soll vollautomatisch erfolgen. Das Ergebnis sieht also keinerlei Actionen vom Benutzer auf unserer Applikation vor. Er muss lediglich warten bis er zu eBay weiter geleitet wird und sich dort anmelden kann.</p>
<p><img class="aligncenter size-full wp-image-374" title="consentFlowGUI" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/02/consentFlowGUI.jpg" alt="" width="500" height="220" /></p>
<h3>Die benötigten Actions</h3>
<p>Wie in Teil 2 bereits aufgestellt brauchen wir neben dem Ebayauth Controller folgende fünf Actions:</p>
<ul>
<li><em>index</em> (stößt den Consent Flow an)<em><br />
</em></li>
<li><em>step1</em> (ist Ziel eines Ajax-Requests &#8211; übernimmt getSessionID)</li>
<li><em>success </em>(bei erfolgreichem Login auf eBay wird der Benutzer hierhin  weitergeleitet)</li>
<li><em>step2 </em>(ist Ziel eines Ajax-Requests &#8211; übernimmt fetchToken)</li>
<li>und <em>denied</em> (bei fehlgeschlagenem oder abgebrochenen Login)<em><br />
</em></li>
</ul>
<p>und vier Views für den Controller <em>Ebayauth</em>:</p>
<ul>
<li><em>index.phtml</em></li>
<li><em>step1.ajax.phtml</em></li>
<li><em>success.phtml<br />
</em></li>
<li><em>step2.ajax.phtml</em></li>
<li>und <em>denied.phtml</em></li>
</ul>
<h3>Ajax Requests erkennen und entsprechend handeln</h3>
<p>Um die Unterscheidung zwischen &#8216;normalem&#8217; Request und einem Ajax-Request können wir einen Context-Switcher verwenden, den uns das Zend Framework zur Verfügung stellt. Dieser muss in der init()-Methode des Controllers initialisiert werden uns sieht in unserem Fall so aus:</p>
<pre class="php" title="code">$contextSwitch = $this-&gt;_helper-&gt;getHelper('AjaxContext');
$contextSwitch-&gt;addActionContext('step1', 'html') // wir geben html zurück
              -&gt;addActionContext('step2', 'html') // möglich wäre auch xml oder json
              -&gt;initContext();

// Das übrige Layout abschalten
if($this-&gt;_request-&gt;isXmlHttpRequest()) {
     $this-&gt;_helper-&gt;layout-&gt;disableLayout();
}</pre>
<p>Unsere zwei step Actions benötigen noch eine kleine Fallunterscheidung. Wir möchten sie nur ausführen lassen, wenn es sich tatsächlich um einen Ajax-Request handelt:</p>
<pre class="php" title="code">if(!$this-&gt;_request-&gt;isXmlHttpRequest()) {
    $this-&gt;_redirect('/ebayauth/index'); // zum Start des Auth-Prozesses umleiten
}</pre>
<h3>Der Controller Ebayauth</h3>
<p>Springen wir gleich in den Code:</p>
<pre class="php" title="code">public function indexAction() {}

public function step1Action()
{
    if(!$this-&gt;_request-&gt;isXmlHttpRequest()) {
        $this-&gt;_redirect('/ebayauth/index');
    }

    // die getSessionID API-Anfrage durchführen
    $tokenAdapter = new Ebay_Auth_ConsentFlow();
    $return = $tokenAdapter-&gt;getSessionID();

    // Wir müssen die SessionID in einer Datenbank oä. zwischenspeichern
    $modelAccount = new Model_Account();

    if($return != false) {
        // zwischenspeichern - bitte durch eigenen Implementierung ersetzen
        $modelAccount-&gt;writeEbaySessionId($this-&gt;accountID, $return['sessionId']);
        if(isset($return-&gt;ShortMessage)) {
            // bei Fehler ist ShortMessage teil der API Rückgabe
            $this-&gt;view-&gt;error = (string)$return-&gt;ShortMessage;
        } else {
            $this-&gt;view-&gt;redirectURL = $return['redirectUrl'];
        }
    } else {
        $this-&gt;view-&gt;error = 'Keine Verbindung zu eBay.';
    }
}

public function successAction() {}

public function step2Action()
{
    if(!$this-&gt;_request-&gt;isXmlHttpRequest()) {
        $this-&gt;_redirect('/ebayauth/index');
    }

    // die im step1 zwischengespeicherte SessionID aus der Datenbank holen
    $modelAccount = new Model_Account();
    $sessionId = $modelAccount-&gt;getEbaySessionId($this-&gt;accountID);

    // die fetchToken API Anfrage ausführen
    $tokenAdapter = new Ebay_Auth_ConsentFlow();
    $return = $tokenAdapter-&gt;getToken($sessionId);

    if($return != false) {
        // auch hier wieder eigenen Implementierung Verwenden
        $modelAccount-&gt;writeEbayTokenId($this-&gt;accountID, $return['token'], $return['expiration']);
        if(isset($return-&gt;ShortMessage)) {
            $this-&gt;view-&gt;error = (string)$return-&gt;ShortMessage;
        } else {
            // Hier festlegen wohin umgeleitet werden soll
            $this-&gt;view-&gt;redirectURL = '/'; // zurück zur Startseiten
            $this-&gt;view-&gt;expiration = $return['expiration'];
        }
    } else {
        $this-&gt;view-&gt;error = 'Keine Verbindung zu eBay';
    }
}

public function deniedAction() {}</pre>
<p>Die drei Actions index, success und denied benötigen keine Methoden im Controller. Der JavaScript, der den Ajax-Request anstößt coden wir einfach fest in die views ein.</p>
<h3>Die Views</h3>
<p>Das hier ist der index view (<em>index.phtml</em>). Wir binden ein JavaScript ein und rufen die Funktion <em>shootAjaxHtml()</em> auf.</p>
<pre class="php" title="code">&lt;div&gt;
    &lt;div id="loader" class="redirect"&gt;&lt;img src="/images/preloader.gif" /&gt; Weiterleitung an eBay wird vorbereitet ...
        &lt;script type="text/javascript"&gt;shootAjaxHtml('/ebay/step1', 'loader')&lt;/script&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Der <em>step1.ajax.phtml</em> View:</p>
<pre class="php" title="code">&lt;?php if(isset($this-&gt;redirectURL)) { ?&gt;
&lt;p&gt;Automatische Weiterleitung zu eBay in wenigen Sekunden. &lt;a href="&lt;?php echo($this-&gt;redirectURL); ?&gt;" title="Weiterleitung"&gt;Oder hier klicken.&lt;/a&gt;&lt;/p&gt;
&lt;script type="text/javascript"&gt;window.location = '&lt;?php echo($this-&gt;redirectURL); ?&gt;';&lt;/script&gt;
&lt;?php } elseif(isset($this-&gt;error)) { ?&gt;
&lt;p class="error"&gt;&lt;strong&gt;Fehler:&lt;/strong&gt; &lt;?php echo $this-&gt;error; ?&gt;&lt;/p&gt;
&lt;?php } ?&gt;</pre>
<p><em>success.phtml</em>:</p>
<pre class="php" title="code">&lt;div&gt;
    &lt;div id="loader" class="redirect"&gt;&lt;img src="&lt;?php echo SKINPATH; ?&gt;/images/preloader.gif" /&gt; eBay Anmeldung wird abgeschlossen ...
        &lt;script type="text/javascript"&gt;shootAjaxHtml('/ebay/authgettoken', 'loader')&lt;/script&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Und <em>step2.ajax.phtml</em>:</p>
<pre class="php" title="code">&lt;?php if(isset($this-&gt;redirectURL)) { ?&gt;
&lt;p class="info"&gt;Die Verknüpfung des Benutzerkontos mit eBay verliert am &lt;?php echo date('d.m.Y', strtotime($this-&gt;expiration)); ?&gt; um &lt;?php echo date('H:m', strtotime($this-&gt;expiration)); ?&gt; Uhr seine Gültigkeit.&lt;/p&gt;
&lt;p&gt;&lt;a href="/ebay" class="black" title="Zurück zur Startseite"&gt;Weiter&lt;/a&gt;&lt;/p&gt;
&lt;?php } elseif(isset($this-&gt;error)) { ?&gt;
&lt;p class="error"&gt;&lt;strong&gt;Fehler:&lt;/strong&gt; &lt;?php echo $this-&gt;error; ?&gt;&lt;/p&gt;
&lt;?php } ?&gt;</pre>
<p>Im denied View gebe ich nur eine Fehlermeldung wie &#8220;Anmeldung fehlgeschlagen&#8221;.</p>
<h3>Der JavaScript (mit mootools):</h3>
<pre class="javascript" title="code">function shootAjaxHtml(action, loaderid)
{
    var remote = new Request.HTML({
        url: action + "?format=html",
        onSuccess: function(html) {
            $(loaderid).getParent('div').empty().adopt(html);
        },
        onFailure: function(xhr) {
            $(loaderid).getParent('div').empty().adopt(new Element('p').set('text', 'Es ist ein Fehler aufgetreten: ' +xhr.status +' ' +xhr.statusText).addClass('error'));
        }}).get();
}</pre>
<p>Und damit sind wir auch schon fertig.</p>
<p>Ich hoffe die ersten drei Teile dieser Einführung in eine Mögliche Implementierung des Consent Flows der eBay trading API in eine Webapplikation mit dem Zend Framework waren gut verständlich und konnten einen guten Überblick über die benötigten Implementierungsschritte geben. Teil vier hat anhand von Codebeispielen gezeigt, wie man den Consent Flow möglichst benutzerfreundlich umsetzen kann.</p>
<p>Empfehlungen, Anmerkungen, Verbesserungsvorschläge? Dazu sind die Kommentare da!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dezimalzahl in beliebig anderes Zahlensystem umrechnen</title>
		<link>http://blog.root-of-all-evil.com/2010/01/dezimalsystem-in-beliebig-anderes-zahlensystem-umrechnen/</link>
		<comments>http://blog.root-of-all-evil.com/2010/01/dezimalsystem-in-beliebig-anderes-zahlensystem-umrechnen/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 23:36:08 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=98</guid>
		<description><![CDATA[Beschreibung wie beispielhaft in Javascript, eine beliebige Zahl in ein anderes Zahlensystem konvertiert werden kann.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/01/dezimalsystem-in-beliebig-anderes-zahlensystem-umrechnen/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/01/dezimalsystem-in-beliebig-anderes-zahlensystem-umrechnen/" title="Dezimalzahl in beliebig anderes Zahlensystem umrechnen"></a><p>Beschreibung wie beispielhaft in Javascript, eine beliebige Zahl in ein anderes Zahlensystem konvertiert werden kann.</p>
<p><span id="more-98"></span></p>
<p>Folgender Javascript-Code, rechnet eine Zahl in ein beliebiges Zahlensystem bzw. <a href="http://de.wikipedia.org/wiki/Stellenwertsystem" target="_blank">Stellenwertsystem</a> um. Ist das Zahlensystem größer dem <a href="http://de.wikipedia.org/wiki/Hexadezimalsystem" target="_blank">Hexadezimalsystem,</a> muss die Funktion<em> replaceNrByHex(nr)</em> entsprechend noch erweitert werden.</p>
<pre class="javascript" title="code">function convertByPlaceValueNotation(nr, pvn) {
    retStr = "";
    restAry = new Array();

    while(nr&gt;0) {
        restAry.push(nr % pvn);
        nr = parseInt(nr / pvn);
    }

    for(var i=restAry.length-1; i&gt;=0; i--) {
        retStr += replaceNrByHex(restAry[i]);
    }

    return (retStr=="" ? "0" : retStr);
}

function replaceNrByHex(nr) {
    switch(nr) {
        case 10:
            return "A";

        case 11:
            return "B";

        case 12:
            return "C";

        case 13:
            return "D";

        case 14:
            return "E";

        case 15:
            return "F";

        default:
            return nr;
    }
}</pre>
<p>Mögliche Aufrufe sind dann z.B.:</p>
<pre class="javascript" title="code">// Rechnet die Zahl 542 in das Dualsystem um
convertByPlaceValueNotation(452, 2);

// Rechnet die Zahl 16 in das Oktalsystem um
convertByPlaceValueNotation(16, 8);

// Rechnet die Zahl 78 in das Hexadezimalsystem um
convertByPlaceValueNotation(78, 16);

// Rechnet die Zahl 42 in das fiktive Zahlensystem mit der Basis 13 um
convertByPlaceValueNotation(42,13);</pre>
<p>Zu beachten ist, dass es sich bei der Rückgabe um einen String handelt.</p>
<p>Für weitere Informationen und Beispiele ist die Seite <a href="http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm" target="_blank">Umrechnung von Zahlensystemen auf arndt-bruenner.de</a> zu empfehlen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/01/dezimalsystem-in-beliebig-anderes-zahlensystem-umrechnen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

