HTML5: Anwenderseitige Skripte


Auch anwenderseitige Skripte können auf Inhalte von (X)HTML-Dokumenten angewendet werden. HTML5 empfiehlt allerdings explizit, nach Möglichkeit deklarative Methoden stattdessen zu verwenden, weswegen HTML5 für einige häufig auftretende Anwendungen einige Strukturen definiert hat, die früher typisch von Skripten umgesetzt wurden.

HTML5 sieht keine spezifische Skriptsprache vor, die interpretiert werden müßte. Das W3C selbst stellt nur mit dem DOM (Dokument-Objekt-Modell) Strukturen bereit, in welchen Skriptsprachen agieren können. HTML5 selbst hat eine Erweiterung des DOMs, die spezifisch für diese Sprachvariante ist. Das W3C selbst hat keine Skriptsprache spezifiziert. Von ECMA wird allerdings eine Spezifikation für einen Skriptsprachen-Prototyp spezifiziert, welcher mehr oder weniger in einer Sprachenfamilie umgesetzt wird, die im allgemeinen Sprachgebrauch als JavaScript bezeichnet wird.

Da mit Skriptsprachen der Inhalt oder die Verfügbarkeit von Inhalt manipuliert werden kann, ist von Autoren besonders auf Zugänglichkeit und Barrierefreiheit von Dokumenten zu achten, die solche Skripte verwenden, denn der Autor kann weder davon ausgehen, daß ein Darstellungsprogramm eine bestimmte Skriptsprache oder alle Funktionen einer solchen interpretieren kann, noch kann er davon ausgehen, daß der jeweilige Nutzer die Skriptinterpretation überhaupt erlaubt.

Die Elemente noscript, script, template, canvas stehen in Verbindung mit anwenderseitigen Skriptsprachen, welche also gegebenenfalls vom Darstellungsprogramm interpretiert oder ausgeführt werden. Während script dazu dient, Quelltext von Skriptsprachen zu beinhalten oder auf externe Skript-Dokumente zu verweisen, dient noscript (nur in der Markierungssuppen-Variante) der Angabe von alternativem Inhalt für den Fall, daß die verwendeten Skriptsprachen nicht interpretiert werden. noscript kann also Strukturen beinhalten, die angezeigt werden, wenn Skripte nicht ausgeführt werden. template kann Fragmente beinhalten, die von Skripten kopiert werden können. canvas repräsentiert per Skript erzeugte Pixelbilder.

Das Konzept von noscript ist allerdings nicht besonders durchdacht, denn man kann nicht angeben, für welche Skriptsprache oder welche Version davon die Alternative gelten soll. Der Elementinhalt ist also generell nur zu interpretieren, wenn Skripte nicht interpretiert werden, etwa weil die Interpretation von Skripten der verwendeten Sprache vom Nutzer deaktiviert ist oder gar nicht implementiert ist.

Neuere Konzepte gehen hingegen von einem Schichtenmodell aus, welches kein Element noscript benötigt. Die erste Schicht ist dabei die des eigentlichen Inhaltes. Darin wird mit (X)HTML unabhängig von der Interpretation von Stilvorlagen oder Skripten der gesamte Inhalt barrierefrei zugänglich gemacht. Die zweite optionale Schicht ist die der Stilvorlagen. Mit dieser kann eine alternative Darstellung des Inhaltes der ersten Schicht erreicht werden, am eigentlichen Inhalt wird nichts geändert. Die dritte optionale Schicht ist die der anwenderseitigen Skriptsprachen. Ähnlich wie mit der der Stilvorlagen kann damit eine alternative Darstellung des Inhaltes der ersten Schicht erreicht werden, insbesondere auch stark interaktiv. Auch die zweite Schicht kann mit den Skripten modifiziert werden, sofern vorhanden. Die Schichtenfolge ist dabei immer so zu gestalten, daß der Inhalt immer verfügbar gehalten wird. Also egal, ob nur die Inhaltsschicht interpretiert wird oder die Inhaltsschicht samt Stilvorlagen oder die Inhaltsschicht samt der Skripte oder auch Inhalt, Stilvorlangen und Skripte zusammen, der Zugang zum gleichen Inhalt muß immer möglich sein. Dieser Ansatz wird auch der unaufdringliche (englisch: unobtrusive) genannt, weil der Inhalt immer zugänglich bleibt, egal ob oder welche Schichtebene zusätzlich zur Inhaltsebene interpretiert wird oder nicht. Daher ist das Element noscript für die Variante von HTML5 mit XML-Notation bereits gestrichen, also nicht verfügbar.

Skripte können in diesem Sinne hilfreich und nützlich eingesetzt werden, wenn sie die Ergonomie eines komplizierteren Dokumentes oder Projektes für jene Nutzergruppen verbessern, bei denen solche Skripte interpretiert werden. Die meist verwendeten Skriptsprachen vom Typ 'application/javascript', die konkrete Umsetzungen oder auch proprietäre Erweiterungen von 'application/ecmascript' darstellen, haben allerdings in der Praxis das Problem, daß verschiedene Darstellungsprogramme diese unterschiedlich umgesetzt haben. Das hat zur Folge, daß auch innerhalb eines Skriptes die unaufdringliche Strategie fortgesetzt werden muß, indem immer wieder abgefragt werden muß, ob spezielle Funktionalitäten verfügbar sind.

Bei größeren Inhaltsmengen könnte als Anwendung etwa mit einem Skript Inhalt ausgeblendet werden und bei Bedarf auf bestimmte Ereignisse hin wieder eingeblendet. Bei sehr großen so zu verwaltenden Inhaltsmengen kann der primäre Inhalt dann auch aus einem Navigationsmenü bestehen, welches viele Dokumente referenziert, auf welche der Inhalt verteilt ist. Das Skript wiederum könnte dieses Navigationsmenü ausblenden und stattdessen eine interaktive Bedienung anbieten, bei der der Nutzer die Inhalte bei Bedarf etwa mit der Technik 'AJAX' im selben Dokument einblenden kann oder mehrere Inhalte flexibel darauf anordnen kann.

Mit der alten Methode würde bei diesem Beispiel also das Navigationsmenü in einem Element noscript stehen. Über das DOM würde dann das Skript alle weiteren Bedienelemente erzeugen und den alternativen Zugang zum Inhalt per Skript ermöglichen. Bei dem neuen Konzept ist das Navigationsmenü einfach ohne Skript vorhanden und wird vom Skript dann zum Dokumentbeginn über das DOM ausgeblendet. Somit wird zum Ausblenden dieselbe Schicht verwendet, die auch für die alternative Bedienung verantwortlich ist. Diese Vermeidung der Vermischung der Ebenen kann dann auch für den Autor die Übersichtlichkeit stark verbessern, unter welchen Umständen welcher Inhalt wie dargestellt wird.

Element noscript

Bearbeiten

noscript ist nur in der Markierungssuppenvariante verfügbar, nicht in der XML-Variante. Es kann im Element head notiert werden, ebenso dort, wo Phraseninhalt erwartet wird.

noscript ist ein transparentes Element, darin kann notiert werden, was im Elternelement notiert werden kann.

Der Inhalt wird präsentiert, falls Skriptinterpretation nicht verfügbar oder nicht aktiviert ist.

Element script

Bearbeiten

Das Element script referenziert entweder ein externes Dokument mit anwenderseitigen Skripten oder beinhaltet selbst solche Skripte (zum Beispiel JavaScript).

Der Inhalt ist bei der XML-Variante interpretierter Text. Besondere Zeichen von XML, insbesondere >, < und &, sind also zu maskieren oder innerhalb eines CDATA-Bereiches zu notieren, sofern sie sonst einen Konflikt mit der XML-Syntax hervorrufen. Das ist etwa der Fall, wenn die Skriptsprache wie JavaScript keine XML-Syntax hat, also auch keine Elementmarkierungen hat, > und < aber in anderem Zusammenhang verwendet werden.

In der Markierungssuppen-Variante wird der Inhalt nicht als interpretierter Text betrachtet, Sonderzeichen sind also nicht zu maskieren. Aufgrund dieser Inkonsistenz der beiden Sprachvarianten ist es zu empfehlen, die Skripte immer nur als externe Dokumente zu referenzieren, nicht im Element zu notieren, falls zu spezifische XML-Zeichen darin notiert sind.

script kann als Phrasenelement verwendet werden. Zudem oder insbesondere kann es im Element head notiert werden.

Attribut type

Bearbeiten

Mit dem erforderlichen Attribut type wird der Inhaltstyp der verwendeten Skriptsprache notiert. Anhand dieser Angabe kann das Darstellungsprogramm dann entscheiden, ob der Inhalt von script überhaupt interpretiert wird oder gleich pauschal übersprungen, falls die Sprache nicht interpretierbar ist oder per Voreinstellung des Nutzers nicht interpretiert werden soll.

Beispiele für Werte sind etwa 'application/javascript' (veraltet auch: 'text/javascript') und 'application/ecmascript' oder auch 'text/tcl'.

Attribut src

Bearbeiten

Mittels src kann ein externes Dokument mit einem Skript als Inhalt referenziert werden. In der Regel ist das Element selbst dann leer. Der Wert ist eine IRI/URI. Ist diese vorhanden, wird gegebenenfalls vorhandener Elementinhalt ignoriert und gegebenenfalls das Skript interpretiert, welches im referenzierten Dokument steht.

In der praktischen Anwendung jenseits von Lehrbeispielen in Büchern wie diesem ist es meist angemessen, Skripte so auszulagern, um sie klar vom eigentlichen Inhalt des Dokumentes zu trennen.

Zu beachten: Das Darstellungsprogramm wird bei aktivierter Skriptinterpretation das referenzierte Skript fast immer ohne vorherige Nachfrage beim Nutzer von der angegebenen Quelle zu laden versuchen. Beim Aufruf einer externen Quelle mittels absoluter IRI/URI gelangt so Information ohne Wissen des Nutzers auf den externen Dienstrechner. Aufgrund der möglichen Komplexität von Skripten besteht so ein Potential, daß der Nutzer durch diese Hintertür durch das referenzierte Skript ausspioniert wird. Zudem besteht die Möglichkeit, daß das externe Skript in den Datenfluß eingreift und eigentlich vertrauliche Informationen abgreift und für eigene, intransparente Zwecke verwendet, unkontrolliert weiter verbreitet. Autoren der lokalen Seite haben keinerlei Kontrolle über Änderungen der externen Skripte, dortige Sicherheitslücken etc. Externe Skripte stellen also ein hohes Risiko für die Nutzer einer Seite dar, ebenso allerdings für den Seitenbetreiber, welcher diese Skripte so auf die Besucher seiner Seite losläßt.

Hinsichtlich des Datenschutzes und der Privatsphäre des Nutzers ist dies ein massiver Eingriff, folglich also unbedingt zu vermeiden. Ist trotzdem eine externe Referenzierung erwünscht, ist im Sinne des Datenschutzes zuvor ein von dem Sachverhalt nicht betroffenes Dokument vorzuschalten, in welchem der Nutzer über das massive Datenleck informiert wird, welches vermutlich dazu führt, daß auf den betroffenen Seiten keine Vertraulichkeit des Datenaustausches mehr gewährleistet ist. Natürlich sollte auch eine lokale Alternative zur Auswahl angeboten werden, welche ohne derartige Skripte und Datenlecks auskommt, damit sich der Nutzer frei entscheiden kann, ob er ausspioniert werden möchte oder besser nicht.

Üblich sind etwa derartige externe Skripte für statistische Zwecke, allerdings auch als sogenannte 'frameworks' für massiv interaktive Anwendungen. Google etwa bietet solche Skripte und Bibliotheken an, primär um Informationen über Personen und deren Verhalten im Netz zu sammeln und kommerziell zu nutzen. Der Nutzen für die Autoren, welche solche Sammlungen referenzieren, dürfte folglich nur Lockvogel sein, um an Daten zu kommen.

Attribut charset

Bearbeiten

Ist src gesetzt, so kann mit charset die Kodierung des referenzierten Dokumentes angegeben werden. Das kann zur Wirkung kommen, wenn sonst keine qualifizierte Instanz Angaben zur Kodierung des referenzierten Dokumentes macht. Der Wert ist eine Kodierungsangabe, siehe auch das gleichnamige Attribut von a oder link.

Attribut defer

Bearbeiten

Das Attribut kann angegeben werden, um zu kennzeichnen, daß der Elementinhalt keinen weiteren Inhalt erzeugt, also keinen weiteren Einfluß auf die unmittelbare Darstellung hat. Ein Darstellungsprogramm muß dann nichts abwarten, sondern kann gleich mit der Darstellung des Dokumentes fortfahren.

Der Wert von defer ist 'defer' oder leer.

Attribut async

Bearbeiten

Das Attribut kann angegeben werden, um zu kennzeichnen, daß das Skript parallel zum Dokument geladen werden kann. Die Interpretation erfolgt, sobald das Skript geladen ist. Der genaue Zeitpunkt der Ausführung hat also keinen weiteren Einfluß auf die unmittelbare Darstellung.

Der Wert von async ist 'async' oder leer.

Ohne async und defer wird erst das Skript komplett geladen und ausgeführt, danach der Rest des Dokumentes interpretiert.

Attribut crossorigin

Bearbeiten

Mit dem Attribut kann angegeben werden, ob eine referenzierte Quelle als (technisch) vertrauenswürdig angesehen wird. Das kann sinnvoll sein, um Sicherheitsmaßnahmen zu ergreifen, wenn über das Element Daten in das aktuelle Dokument aus einer externen Quelle (andere Domäne) eingebettet werden. Ist das Attribut nicht gesetzt, kann das Darstellungsprogramm darüber keine Annahmen machen. 'anonymous' als Wert oder ein leerer Wert entspricht dem Verhalten, wenn das Attribut nicht gesetzt ist. Vertrauenswürdig sind dabei nur Quellen in derselben Domäne. Ist der Wert 'use-credentials', so wird die referenzierte Quelle als vertrauenswürdig eingestuft.

So kann etwa der Austausch von Keksen (englisch: cookies und anderen Merkmalen zur Identifizierungen von Sitzungen oder Nutzern kontrolliert werden.

Attribut nonce

Bearbeiten

Mit dem Attribut wird zu kryptographischen Zwecken eine Zeichenfolge etwa als Schlüssel angegeben. Der Wert ist also einfacher Text. Bei einer Referenzierung kann so ein Programm abgleichen, ob die Antwort paßt oder nicht. Zum Beispiel könnte die MD5-Summe einer externen Ressource notiert werden, woraufhin mit einem Skript prüfbar wird, ob sich die referenzierte Quelle verändert hat.

Element template

Bearbeiten

Das Element dient dazu, Vorlagen vorzuhalten, die kopiert werden können. Anders als das Konzept des Standards für Vektorgraphik SVG ist das von HTML5 allerdings unausgegoren, denn es fehlt ein Element wie use in SVG, um die Vorlage deklarativ zu kopieren oder praktisch zu nutzen. Das Kopieren soll per Skript erfolgen, woraus folgt, daß eine solche Vorlage keinen relevanten Inhalt enthalten darf, der sonst unzugänglich würde.

Das Element kann im head notiert werden, ferner wo Phraseninhalt erlaubt ist, wo das Element script erlaubt ist, als Kind des Elementes colgroup, welches kein Attribut span gesetzt hat.

Der Inhalt ist formal Nichts, welches als Dokument-Fragment in Form von fließendem Inhalt notiert werden kann. Dieses Nichts darf inhaltlich nicht relevant sein und wird nicht präsentiert.

Element canvas

Bearbeiten

Das Element dient dazu, mit Skripten erzeugte Pixelbilder zu repräsentieren. Aufgrund der Abhängigkeit von Skripten darf solch ein Pixelbild folglich inhaltlich nicht relevant sein.

Sofern es eine andere Methode gibt, um ein gleichwertiges Bild zu erzeugen, soll diese stattdessen verwendet werden. In der Praxis gibt es solch eine andere Methode eigentlich immer, etwa ein SVG-Fragment oder SVG-Dokument oder aber die Erzeugung des Pixelbildes mit einem Dienstprogramm, also etwa per PHP.

Das Element kann dort notiert werden, wo Phraseninhalt erwartet wird. Das Element ist transparent, darin kann also notiert werden, was im Elternelement erlaubt ist. Der darin notierte Inhalt repräsentiert eine Alternative zum erzeugten Pixelbild, allerdings nur für solche Programme, welche das Element nicht kennen. Programme, die das Element kennen, aber zum Beispiel keine Skripte interpretieren, werden den Inhalt nicht darstellen. Auch daher ist das erzeugte Bild per Voraussetzung rein dekorativ und bietet keinerlei Information.

Das Element hat die Attribute width und height für Höhe und Breite in Pixeln, sinngemäß wie die gleichnamigen Attribute des Elementes img.