ASP.NET WebForms - Check for JavaScript

Zunächst mal ein kleines Vorwort. Natürlich unterstütz heutzutage jeder Vernünftige Browser JavaScript und erlaubt dieses auch auszuführen.
Jedoch sollte man die Zahl an ‘uralt’ PC’s/Browsern oder Usern welche JavaScript von Hand deaktivieren nicht unterschätzen. Besondern sollte
man sich dabei zu helfen wissen.

Nun zur Lösung des Problems. Der Ansatz ist eig. schon vorhanden aber seht selbst…
Einfach im Page_Load…

  1: if (Request.Browser.JavaScript == false)
  2: }
  3:     Response.Redirect("~/NoJS.aspx");
  4: }

… und die Sache sollte funktionieren. Falsch gedacht. Das JavaScript Property sagt nur aus ob der Browser JavaScript unterstützt, nicht ob es erlaubt wird auszuführen.
Diese Variante würde sich also nicht dazu eignen herauszufinden, ob der User das Ausführen von JS-Code von Hand deaktiviert hat.

Man braucht also einen anderen Lösungsansatz…
Zunächst einmal, alle Wege (oder viele davon) führen nach Rom. Einen davon werden wir im Folgenden betrachten.

Ich habe mich für die URL-Parameter Variante entschieden, wobei hier natürlich der Nutzer sein Unwesen treiben kann.

Dazu habe ich folgenden JavaScript Code eingefügt:

  1: window.location = "/?js=true";

Dies hat zur Folge, dass ein Redirect geschieht und der entsprechende Parameter der URL hinzugefügt wird.
Jetzt könnten wir zwar ganz einfach bereits herausfinden, ob der Redirect erfolgreich war oder eben nicht. Aber falls JS aktiviert ist wird nun jedes Mal beim Ausführen dieser
Zeile ein Redirect durchgeführt und es entsteht eine klassische Endlosschleife :-)

Um das zu verhindern fügen wir folgende Abfrage hinzu:

  1: if ('<%: tokenExists()%>' == 'false') {
  2:     window.location = "/?js=true";
  3: }
*(1) *(2)

In der Methode ‘tokenExists’ welche wir hier aufrufen…

  1: public bool tokenExists()
  2: {
  3:     if (Request["js"] != null)
  4:     {
  5:         return true;
  6:     }
  7:     return false;
  8: }

…überprüfen liefern wir true zurück, falls der Parameter bereits gesetzt sein sollte, ansonsten false.
Je nach dem was nun zurück gegeben wird und JavaScript aktiviert sein sollte wird nun erfolgt nun eben der Redirect, es wird erneut überprüft und nun wird true
zurück geliefert wenn JavaScript enabled ist und andernfalls false.

Nun haben wir schon mal die Überprüfung ob JavaScript enabled ist oder eben nicht, jetzt fehlt noch die Reaktion darauf.
Hier auch wieder ‘alle Wege führen nach Rom’.

Ob man nun ein Label einblendet mit der entsprechenden Warnung/Hinweis oder den Nutzer über ein Response.Redirect() auf eine NoneJS.aspx weiterleitet oder was auch immer
ist dem Entwickler natürlich überlassen.

Dazu könnte man folgendermaßen z. B. im Page_Load abfragen:

  1: if (Request["js"] == null)
  2: {
  3:     Response.Redirect("~/NoJS.aspx");
  4: }

Und schon sind wir fertig.

Diese Methode könnte man noch etwas sicherer gestalten, indem man Sessions mit einbringt, da der Nutzer die URL manipulieren bzw. an andere weiterleiten kann.
Einfach zum Beispiel in der tokenExists() Methode noch zusätzlich eine Session-Variable erzeugen, falls diese nicht bereits existiert und somit wäre auch dies kein Problem mehr.

zu *(1): hier ist noch wichtig zu wissen, dass der Aufruf von tokenExists() trotzdem ausgeführt wird, selbst wenn JS deaktiviert sein sollte. Da dies beim Rendern der Seite geschieht.
zu *(2): der Rückgabewert von tokenExists() wird als String interpretiert, d. h. man muss diesen selbstverständlich auch mit einem String vergleichen deswegen ‘false’
Kommentare sind geschlossen