Too Cool for Internet Explorer

JavaScript: The World's Most Misunderstood Programming Language


Eigentlich sollte ich stolz sein: es gibt tatsächlich Leser meines Blogs, die meine Artikel aufgreifen und sich darüber kritische(?) Gedanken machen. Gestern bin ich zufälligerweise auf einen Artikel in einem Blog gestossen, in dem sich der Autor über meine Einstellung zu JavaScript lustig macht. Bei all seinem Sarkasmus vergisst der Autor leider Argumente vorzubringen warum er meine Einstellung so lächerlich findet. Die im Text eingestreuten Klischees, die man ähnlich so eigentlich nur aus dem Heise-Forum kennt, können es kaum sein.

Dabei kann ich die Einstellung tatsächlich sogar verstehen: In JavaScript lässt es sich ähnlich schmutzig und disziplinlos programmieren, wie mit PHP. Nur: dort wo PHP einem Steine in den Weg legt, weil der Parser viele dinge einfach nicht zulässt, ist JavaScript in der Regel offen und man kann einen sehr sauberen und eleganten Programmierstil fahren. Nun ist es bei JavaScript so wie mit jeder Programmiersprache: man muss sich damit beschäftigen. Was PHP und JavaScript darüberhinaus gemein haben ist, dass es für beide Sprachen wenig gute Literatur, dafür aber umso mehr schlechte Literatur gibt.

Bei ernsthaftem Interesse an JavaScript möchte ich an dieser Stelle auf einen Artikel von Douglas Crockford verweisen -- JavaScript: The World's Most Misunderstood Programming Language. Dieser Artikel räumt mit einigen Vorurteilen gegenüber JavaScript auf und macht vielleicht auch verständlich, warum JavaScript einen derart schlechten Ruf hat.



Ich liebe JavaScript


Ich gestehe: ich liebe JavaScript -- ich habe noch keine Programmiersprache kennengelernt, in der es sich ähnlich intuitiv entwickeln lässt. Die Sprache ist absolut logisch aufgebaut, es gibt eigentlich nie aha-Effekte, dass etwas unerwarteterweise nicht möglich ist. Ähnlichen Spass am Programmieren hatte ich zuletzt mit Turbo Pascal vor vielen Jahren. Sollte es irgendwann eine ernstzunehmende serverseitige JavaScript Implementation geben, die sich über fastCGI in meinen bevorzugten Webserver einhängen lässt, werde ich (wahrscheinlich :-)) nicht zögern PHP hinter mir zu lassen um auch serverseitig JavaScript einzusetzen.

Mit der neuen JavaScript Engine von Google -- v8 -- die erstmals im Google Browser Chrome zum Einsatz kam, ist der Traum vielleicht irgendwann keiner mehr. Da die JavaScript Engine im Quellcode erhältlich ist und die Bibliothek sich ohne Probleme unter den wichtigsten Betriebssystemen compilieren lässt, sind schon zahlreiche Projekte entstanden, die v8 auch serverseitig einsetzbar machen sollen.

Im Moment spiele ich hier ein wenig mit llv8call -- eine Bibliothek, die v8 um Zahlreiche Funktionen erweitert, wie z.B.:

  • File und Dir
  • System Variablen
  • STDIN, STDOUT und STDERR
  • Process Management / Prozess Kontroll Funktionen
  • Dynamic Library Loader
  • Sockets
  • libxml Support

... und ausserdem noch folgende Erweiterungen mitbringt:

  • memcached
  • fastCGI Support
  • sqlite 3 Support
  • Curl

Auch eine Verbesserte Shell (im Vergleich zur mit v8 Verfügbaren Shell) ist vorhanden, die nun Dank libreadline mehr Komfort mitbringt (z.b. die Befehlshistorie).

Zur Installation unter OSX sind evtl. folgende Tools und Bibliotheken notwendig:

Sofern man die Entwicklungstools von OSX installiert hat, lassen sich die genannten Bibliotheken ohne weiteres installieren. Lediglich bei ClearSilver musste ich den Ruby-Support deaktivieren:

./configure --disable-ruby

... und nach der Installation einen Symlink erstellen, damit llv8call beim Compilieren die Header-Dateien von ClearSilver einbinden konnte:

ln -snf /usr/local/include/ClearSilver /usr/include/ClearSilver

Wenn scons ohne Fehler durchgelaufen ist, kann man die erzeugten Binaries unter ./out/ im llv8call Quellverzeichnis finden.



Ermitteln der Version der JVM im Internet Explorer - The Microsoft Way


WTF!?

<HTML xmlns:IE>
<HEAD>
<STYLE>
@media all {
IE\:clientCaps {behavior:url(&default;clientcaps)}
}
</STYLE>
</HEAD>

<BODY>
<IE:clientCaps ID="oClientCaps" />

<SCRIPT>
sMSvmVersion = oClientCaps.getComponentVersion("{08B0E5C0-4FCB-11CF-AAA5-00401C608500}", "ComponentID");
</SCRIPT>
</BODY>

Gefunden im MSDN

...und der schliessende HTML tag fehlt im Beispiel auch noch...



Javascript Komponenten


Im Weblog von Ryan Campbell habe ich eben neben dem interessanten Artikel zum Dokumentieren von Quellcode (s.u.) auch zwei Javascript Komponten gefunden, die mir gefallen und die ich mir merken muss:

Bei 'Preview your links' handelt es sich um eine nette Komponente, die Symbole an Textlinks hängt, sobald eine Seite geladen wurde. So können z.b. Links automatisch markiert werden, die nicht zu einer HTML Seite sondern auf ein Dokument z.b. im .doc oder .pdf Format verweisen. Die Funktion kann über das onload event aufgerufen werden und prüft selbständig alle Textlinks einer Seite.

Desweiteren gibt es ein 'Combo-Box' Element (Kombination aus Pulldown- und Eingabefeld), das mir sehr taugt, da es auf Standard-Formularelemente zurückgreift. So erscheint die Combo-Box wie es sich gehört im Safari auch im Aqua-Look. Ich habe mir die Demo im Safari sowie im Firefox angesehen - schaut recht gut aus und funktioniert wunderbar.




JSAN - JavaScript Archive Network


Was dem Perl-Programmierer sein CPAN, ist des JavaScript-Programmierers JSAN.

Ähnlich dem in der Perl-Welt sehr bekannten und beliebten Sourcecode Archiv CPAN versuchen die Gründer des JSAN Projektes ein Archiv mit wiederverwendbaren JavaScript Bibliotheken aufzubauen.

Mitmachen kann jeder - es gibt kaum Anforderungen an die veröffentlichte Bibliothek wie Coding-Guidelines, wie sie das Pear Projekt von PHP erwartet. Lediglich die Benamung und Struktur der Bibliothek muss bestimmten Richtlinien folgen, damit sie ins Archiv aufgenommen wird.

Es wäre sehr zu begrüssen, wenn sich viele JavaScript am Auf- und Ausbau von JSAN beteiligen, damit bald ein zentrales Archiv wiederverwendbarer Komponenten entsteht, wie man es von anderen Programmiersprachen wie Perl und PHP schon gewohnt ist.




Dynamisches Laden von JavaScript



Externe JavaScript Dateien können nachträglich geladen werden, indem man mittels document.createElement ein neues 'script' Element anlegt und diesem die externe JavaScript Datei im src Attribut zuweist. Ich habe das ganze mit Firefox 1.0.2 und Opera 8 unter Linux sowie mit dem IE 6.0.x unter Windows 2000 getestet:

test.html

<html>
<script language="javascript">
function create() {

var js = document.createElement('script');

js.src = 'test.js';
document.body.appendChild(js);

document.getElementById('new').innerHTML = '<input type="button" value="click!" onclick="hello()" />';

}
</script>

<body>

<div>

<input type="button" value="create" onclick="create()" />

</div>

<div id="new">
</div>

</body>
</html>

test.js

function hello() {

alert('hello world!');

}



Javascript Datenbank und SQL Interpreter


Jsdb ist eine kleine komplett in JavaScript geschriebene und in Standard Browsern ausführbare Datenbank mit einfachem SQL Interpreter. Eine in jsdb angelegte Datenbank existiert nur im Speicher des Web Clients. Die Datenbank ist sehr rudimentär gehalten, der SQL Interpreter unterstützt einfache SELECT Abfragen mit multiplen Joins, Bedingungen sowie Sortierung der Datensätze. Zum Manipulieren der Datenbank findet sich lediglich die INSERT Anweisung.

Nett - leider ist die Web Seite fast ausschließlich in catalan bzw. spanisch verfaßt - das gilt auch für die Kommentare im Quellcode. Da das Script aber ohnehin sehr einfach gehalten ist, ist die Funktionsweise mehr oder weniger selbsterklärend.


PHP & Javascript


Googles Gmail Service sowie die Google Maps verdanken ihre komfortable Benutzerführung nicht zuletzt auch einer Methode, die es ermöglicht Daten zwischen einem Web Client und dem Server auszutauschen - nachdem eine Seite schon fertig geladen ist und ohne diese erneut komplett laden zu müssen.

Im Wiki von JSPan findet sich eine Sammlung an Informationen und Notizen zu dem Javascript Objekt XMLHTTPRequest welches einen Datenaustausch zwischen Client und Server bewerkstelligt, ohne dabei einen komplett neuen Reload der Seite zu benötigen.

JSPan ist ein Projekt welches die einfache Interaktion eines Javascript Clients mit einer PHP Serveranwendung ermöglichen soll, sodaß sich der Programmieraufwand diesbezüglich in Grenzen hält und die möglichen Fehlerquellen reduziert werden. Kurz gesagt soll es möglich sein eine Klasse in PHP zu definieren und deren Methoden auf Client Seite über Javascript aufzurufen als wären es native Methoden.