Dass Javascript eine
gute Ergänzung zu ColdFusion ist, wurde schön öfters erwähnt,
doch leider wird Javascript nicht immer von allen Browsern unterstützt,
bzw. ist nicht immer im Client-Browser eingeschaltet. Für den Webprogrammierer
bedeutet das, auf diesen Fall vorbereitet zu sein und sicherzustellen, dass
wenigstens die Grundfunktionen einer Webapplikation auch ohne Javascript funktionieren.
Dazu muss man auf sicheren Wege ermitteln, ob im Browser Javascript aktiviert
ist und gegebenen Falls umleiten. Auch kann es von Interesse sein, zu testen,
ob nur eine bestimmte Javascript Version vorhanden ist um z. B. eine Website
in DHTML-Version (mit Javascript 1.2) und eine Pure HTML-Version (mit Javascript
< 1.2) anzubieten.
Die Browserversion abzufragen ist in diesem Fall nicht ratsam. Zwar kann man
ermitteln, ob der Browser Javascript könnte, aber man kann so nicht feststellen,
ob es ein- oder ausgeschaltet ist. Da man also auf Serverseite nicht allein
entscheiden kann, ob ein benötigtes Javascript vorhanden ist, muss in jedem
Falle der Browser bemüht werden.
1.Möglichkeit
Die erste Methode besteht aus reinem Javascriptcode.
Angenommen, wir haben 2 Webseiten, start_html.cfm ist eine Seite, die
aus reinem HTML besteht und für alle Browser angezeigt werden soll, die
kein Javascript aktiv haben. start_js.cfm ist die Startseite für
Browser mit Javascript.In start_html.cfm setzt man jetzt in den HEAD-Bereich
ein kleines Umleitungs-JS-Script.
<head>
<script language="JavaScript">
<!--
top.location.replace("start_js.cfm");
// -->
</script>
</head>
Nun führt man
den User zuerst auf start_html.cfm. Hat der User in seinem Browser Javascript
aktiviert, wird beim Laden der Seite das Javascript im <HEAD> ausgeführt
und der Browser auf die start_js.cfm umgeleitet. Im allgemeinen geht
das so schnell, dass der User die erste Seite nicht zu Gesicht bekommt. Für
ihn ist es so, als wäre er direkt auf diese Seite geleitet worden. Der
replace() Befehl von Javascript leitet aber den Browser nicht einfach
zu einer neuen URL um sondern ersetzt den jetzigen History-Eintrag in der URL
Liste des Browsers durch die angegebene URL. Das bedeutet, wenn der User den
Back Button an seinem Browser drückt, wird er nicht zu start_html.cfm
zurückgeführt (auf der er ja zuerst war), sondern gleich zu den Seite
vor start_html.cfm. Er merkt also auch hier nicht, dass eine Seite dazwischengeschaltet
war.
Kommt der User auf start_html.cfm und hat kein Javascript (alter Browser
oder ausgeschaltet) wird er nicht umgeleitet und er bekommt die ganze start_html.cfm
zu sehen. Man sollte also hier seinen HTML Code unterbringen, der ohne JS funktioniert.
Es bietet sich in solchen Fällen an, bestimmt Blöcke, die in beiden
Seiten-Versionen vorkommen als Includes auszulagern!
Man kann aber das Prinzip der Umleitung auch benutzen um z. B. eine DHTML-Version von einer normalen Version zu trennen. Da DHTML ab 4'er Browser funktioniert und diese Javascript Version 1.2 unterstützen, machen wir uns dieses Merkmal zu nütze. Das Umleitungsscript sieht diesmal ein klein wenig anders aus:
<head>
<script language="JavaScript1.2">
<!--
top.location.replace("start_js.cfm");
// -->
</script>
</head>
Durch die Angabe von "Javascript1.2" im LANGUAGE-Attribut des SCRIPT-Tags wird das Script nur ausgeführt, wenn Javascript1.2 (und grösser) im Browser aktiviert ist. Kleinere Versionen (1.0, 1.1) führen den replace() nicht aus und die Seite wird im Browser sichtbar. Leider kann bei langsamen Leitungen und je nach Browsertyp doch kurtzzeitig etwas von der ersten Seite sichtbar sein. Besser und völlig unsichtbar für den User ist die Methode 2, die CFML-Code benutzt (aber andere Nachteile hat).
2.
Möglichkeit
Dazu ist ein Formular nötig, dessen Antwort-Seiten für Browser mit
und ohne JS verschieden sind. Das Formular übergibt ColdFusion einen FORM-Parameter,
der Javascript im Browser kennzeichnet und man kann auf dem Server mit dem CFLOCATION-Tag
darauf reagieren. Wir erzeugen dazu mal wieder ein HTML-Formular in der Seite
foo.cfm:
<form action="foo.cfm" method="post">
<script language="JavaScript">
document.writeln('<input type="hidden" name="jsflag" value="Yes">');
</script>
<input type="submit" value="enter!">
</form>
Das Formular ruft
sich selbst beim Absenden auf. Im Formular ist ein Stück JS-Code enthalten,
der direkt beim Laden der Seite ausgeführt wird (im Browser!) und ein verstecktes
Formularelement names jsflag und dem Wert "Yes" erzeugt (mit der Methode
writeln() des JS-Objekts document kann man direkt in die Seite
schreiben!). Beim Abschicken des Formulars wird mit diesem Formularelement in
der Ergebnisseite die ColdFusion-Variable FORM.jsflag="yes" vorhanden sein,
mit der man auf der Serverseite sicher feststellen kann, das JS vorhanden ist.
Hat der User kein JS aktiv, wird auch kein Formularelement jsflag erzeugt
und das Fehlen der Variable FORM.jsflag zeigt das Fehlen von JS vorhanden.
Der folgende Code prüft das Submit-Resultat und leitet entsprechend serverseitig(!)
um.
<cfparam name="FORM.jsflag" default="No">
<cfif FORM.jsflag>
<!--- javascript lauft --->
<CFLOCATION URL="js.cfm">
<CFELSE>
<!--- kein javascript --->
<CFLOCATION URL="html.cfm">
</cfif>
Da die Variable FORM.jsflag ohne Javascript nicht vorhanden ist, erzeugt man am besten für diesen Fall einen Default-Wert. Dadurch hat man ein boolsches Ergebnis und kann vereinfacht im CFIF-Tag abfragen.
Auch hier lässt sich z.B. durch <script language="JavaScript1.2"> erreichen, das man zwischen DHTML-tauglichen und einfachen Seiten unterscheiden kann.