
Bei diesem Dokument handelt es sich um eine Übersetzung eines W3C-Textes. Dieser Text ist urheberrechtlich geschützt; bitte beachten Sie die nachfolgenden Hinweise des Originaldokuments. Die Rechte an der Übersetzung liegen bei den Übersetzern und dem Verlag Addison-Wesley. Die Übersetzung hat keine durch das W3C legitimierte, normative Wirkung. Das einzige maßgebliche Dokument ist das englische Original.
Bitte senden Sie Fehler und Korrekturen zur deutschen Fassung an die Übersetzer.
Kommentare der Übersetzer, die als solche gekennzeichnet sind, unterliegen dem Urheberrecht der Übersetzer. Sie sind nicht Bestandteil des Ursprungsdokuments.
Diese Veröffentlichung ist eine Vorveröffentlichung.
Kein Teil dieses Textes darf kopiert werden. Alle Rechte vorbehalten.
Nach Abschluss der Arbeit wird das endgültige Dokument unter
der oben angegebenen Adresse veröffentlicht. Die jetzige Veröffentlichung
während der laufenden Arbeit dient zur Information von Interessierten und
zur Prüfung durch die Fachöffentlichkeit. Sollten Sie Fehler finden oder
Verbesserungsvorschläge haben, schicken Sie diese bitte per Mail
an die Übersetzer.
Folgende Teile liegen noch in Englisch vor und müssen noch
in deutscher Fassung
generiert werden: (a) Gesamtinhaltsverzeichnis (b) Index
Inhaltsverzeichnis
Neu: Die am weitesten verbreitete Skriptsprache,
die Web-Browser unterstützen, ist JavaScript. Wer JavaScript lernen möchte
findet unser Lehrbuch JavaScript-Workshop
nun
endlich auch online!.
Skripte bieten Autoren eine Möglichkeit, HTML-Dokumente in sehr aktiver und interaktiver Weise zu erweitern. Beispiele dafür sind:
Es gibt zwei Skriptarten, die Autoren zu einem HTML-Dokument hinzufügen können:
Anmerkung. Diese Spezifikation enthält detailliertere Informationen zu Skripten in den Abschnitten über »Anmerkungen zu Skripten« in Anhang B.
Der folgende Abschnitt behandelt Fragen, die Benutzerprogramme betreffen, die Skripte unterstützen.
<!ELEMENT SCRIPT - - %Script; -- script statements --> <!ATTLIST SCRIPT charset %Charset; #IMPLIED -- char encoding of linked resource -- type %ContentType; #REQUIRED -- content type of script language -- src %URI; #IMPLIED -- URI for an external script -- defer (defer) #IMPLIED -- UA may defer execution of script -- >
Start-Tag: erforderlich, End-Tag: erforderlich
Attributdefinitionen
An anderer Stelle definierte Attribute
Das Element SCRIPT platziert ein Skript innerhalb eines Dokuments. Diese Element kann beliebig oft im HEAD oder BODY eines HTML-Dokuments stehen.
Das Skript kann im Inhalt des SCRIPT-Elements definiert werden oder in einer externen Datei. Ist das src-Attribut nicht angegeben, müssen Benutzerprogramme den Inhalt des Elements als Skript interpretieren. Besitzt das src-Attribut einen URI-Wert, müssen Benutzerprogramme den Elementinhalt ignorieren und das Skript über den URI empfangen. Beachten Sie, dass sich das charset-Attribut auf die Zeichenkodierung des Skripts bezieht, das durch jenes src-Attribut angegeben ist; es bezieht sich nicht auf den Inhalt des SCRIPT-Elements.
Anmerkung der Übersetzer:
Mit der Vorgabe, dass Benutzerprogramme den Elementinhalt ignorieren müssen, wenn über das src-Attribut eine externe Skript-Datei eingebunden wird, weicht diese Spezifikation von älteren Auffassungen einiger Browseranbieter ab. Bevor das src-Attribut in die HTML-Spezifikation aufgenommen wurde, wurde der Elementinhalt als Alternative für den Fall betrachtet, dass das Laden der externen Datei nicht erfolgen kann.
Da viele Autoren diese Betrachtung noch in ihren Köpfen haben dürften, sei an dieser Stelle deutlich darauf hingewiesen, dass dem nicht mehr so ist. Neuere Browser schließen sich in ihrem Verhalten inzwischen auch dieser Spezifikation an.
Skripte werden durch Skript-Engines evaluiert, die dem Benutzerprogramm bekannt sein müssen.
Die Syntax von Skriptdaten ist abhängig von der Skriptsprache (siehe Abschnitt 6.14).
Da HTML sich nicht auf eine bestimmte Skriptsprache beschränkt, müssen Autoren dem Benutzerprogramm die Sprache jedes einzelnen Skripts explizit mitteilen. Dies kann entweder durch eine Standard-Deklaration oder durch eine lokale Deklaration geschehen.
Autoren sollten die Standard-Skriptsprache für alle Skripte in einem Dokument durch Angabe der folgenden META-Deklaration im HEAD festlegen:
<META http-equiv="Content-Script-Type" content="type">
»type« ist darin der Inhaltstyp (siehe Abschnitt 6.7), der die Skriptsprache benennt. Beispiele für Werte sind »text/tcl«, »text/javascript«, »text/vbscript«.
Ohne eine META-Deklaration kann der Standard durch den HTTP-Header »Content-Script-Type« gesetzt werden:
Content-Script-Type: type
»type« ist hier ebenfalls ein Inhaltstyp, der die Skriptsprache benennt.
Benutzerprogramme sollten die Standard-Skriptsprache für ein Dokument anhand der folgenden Schritte festlegen (von der höchsten zur niedrigsten Priorität):
Dokumente, die keine Informationen zur Standard-Skriptsprache geben und Elemente enthalten, die Skripte für eingebettete Ereignisse spezifizieren, sind inkorrekt. Benutzerprogramme können trotzdem versuchen, inkorrekt angegebene Skripte zu interpretieren, sind jedoch nicht dazu verpflichtet. Autoren-Tools sollten die Standard-Skriptsprachen-Information erzeugen, um Autoren dabei zu unterstützen, ungültige Dokumente zu vermeiden.
Das Attribut type muss für jede SCRIPT-Elementinstanz in einem Dokument angegeben sein. Der Wert des type-Attributs für ein SCRIPT-Element überschreibt für dieses Element die Standard-Skriptsprache.
In diesem Beispiel deklarieren wir die Standard-Skriptsprache als »text/tcl«. Wir integrieren ein SCRIPT im Kopf, dessen Skript in einer externen Datei in der Skriptsprache »text/vbscript« vorliegt. Wir beziehen auch ein SCRIPT in den Rumpf ein, das sein eigenes Skript, geschrieben in »text/javascript«, enthält.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>Ein Dokument mit SCRIPT</TITLE>
<META http-equiv="Content-Script-Type" content="text/tcl">
<SCRIPT type="text/vbscript" src="http://someplace.com/progs/vbcalc">
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT type="text/javascript">
...etwas JavaScript...
</SCRIPT>
</BODY>
</HTML>
Jede Skriptsprache hat ihre eigenen Konventionen, HTML-Objekte aus einem Skript heraus zu referenzieren. Diese Spezifikation definiert keinen Standardmechanismus, um sich auf HTML-Objekte zu beziehen.
Jedoch sollten Skripte mit Hilfe des Elementnamens Bezug auf ein Element nehmen. Skript-Engines sollten den folgenden Ablauf beachten, wenn sie ein Element identifizieren: ein name-Attribut hat Vorrang vor einem id-Attribut, wenn beide angegeben sind. Ansonsten kann das eine oder das andere verwendet werden.
Anmerkung: Autoren von HTML-Dokumenten werden darauf hingewiesen, dass es wahrscheinlich Änderungen im Bereich der eingebettetten Ereignisse geben kann (zum Beispiel, wie Skripte an Ereignisse gebunden werden). Die Arbeit auf diesem Gebiet wird durch die Mitglieder der W3C Document Object Model Working Group fortgesetzt (siehe Web-Site des W3C unter http://www.w3.org/ für weitere Informationen).
Attributdefinitionen
Anmerkung der Übersetzer:
Die HTML-Spezifikationen hat sich erst vergleichsweise spät der konkreten Einbindung von Skripten angenommen (ab HTML 4). Skripte werden aber schon geraume Zeit von den Browsern unterstützt (erste Implementierung unter dem Namen »LiveScript« im Navigator 2 beta, Ende 1995; siehe www.mintert.com/javascript/#chronologie). Darunter sind Browser, deren Skript-Engines eigene, voneinander abweichende Entwicklungswege nahmen. Beim Einsatz von Skripten muss man dieser Entwicklung noch immer Rechnung tragen. Man darf also nicht unbedingt erwarten, dass mehrere Browser, die vermeintlich eine bestimmte Skriptsprache unterstützen, dies in der gleichen Weise tun.
Die oben aufgelisteten Attribute zur Reaktion auf Ereignisse sind ein Beispiel dafür. Ob die Reaktionsmöglichkeit auf ein Ereignis für ein bestimmtes Element implementiert ist, kann man nicht allgemeingültig sagen. Auch diese Spezifikation, an die sich neuere Browser durchaus halten, legt für einige der Attribute nicht definitiv fest, für welche Elemente sie gelten müssen, sagt nur »für die meisten«. Als Autor sollte man sich dieser Tatsache stets bewusst sein, wenn man praxistaugliche Dokumente erstellen möchte.
Es ist möglich, eine Aktion mit einer bestimmten Anzahl von Ereignissen zu verknüpfen, die auftreten, wenn ein Benutzer mit einem Benutzerprogramm interagiert. Jedes der oben aufgeführten »eingebetteten Ereignisse« nimmt einen Wert an, der ein Skript ist. Das Skipt wird immer dann ausgeführt, wenn das Ereignis für dieses Element eintritt. Die Syntax der Skriptdaten ist abhängig von der Skriptsprache.
Anmerkung der Übersetzer:
Um genau zu sein: In der Auflistung oben sind nicht die »eingebetteten Ereignisse« selbst aufgeführt, sondern die Attribute, deren Werte Skripte darstellen, die bei Eintreten der eingebetteten Ereignisse ausgeführt werden. Eingangs dieses Kapitels werden sie korrekt »Attribute für eingebettete Ereignisse (intrinsic event attributes)« genannt. An dieser Stelle geht man etwas unsauberer, damit eventuell auch irreführend mit dem Begriff um.
Steuerelemente wie INPUT, SELECT, BUTTON, TEXTAREA und LABEL reagieren alle auf bestimmte eingebettete Ereignisse. Stehen diese Elemente nicht innerhalb eines Formulars, können sie dazu verwendet werden, die graphische Benutzerschnittstelle des Dokuments aufzuwerten.
Zum Beispiel wollen Autoren vielleicht Schaltflächen in ihre Dokumente einbinden, die zwar kein Formular übertragen, aber dennoch mit einem Server kommunizieren, wenn sie aktiviert werden.
Die folgenden Bespiele zeigen einige mögliche Verhaltensweisen von Steuerelementen und Benutzerschnittstellen, die auf eingebetteten Ereignissen beruhen.
Im folgenden Beispiel ist userName ein erforderliches Textfeld. Versucht der Benutzer, das Feld zu verlassen, ruft das onblur-Ereignis eine JavaScript-Funktion auf, die bestätigt, dass userName einen gültigen Wert hat.
<INPUT NAME="userName" onblur="validUserName(this.value)">
Anmerkung der Übersetzer:
Gemeint ist, dass onblur eine Funktion, hier
validUserName(), aufgerufen wird, die prüft, ob
ein gültiger Wert eingegeben wurde. Über eventuelle
Reaktionen auf gültige oder ungültige Eingaben sagt das
einfache Beispiel nichts.
Hier ist ein weiteres JavaScript-Beispiel:
<INPUT NAME="num"
onchange="if (!checkNum(this.value, 1, 10))
{this.focus();this.select();} else {thanks()}"
VALUE="0">
Hier ist ein VBScript-Beispiel eines Event-Handlers für ein Textfeld:
<INPUT name="edit1" size="50">
<SCRIPT type="text/vbscript">
Sub edit1_changed()
If edit1.value = "abc" Then
button1.enabled = True
Else
button1.enabled = False
End If
End Sub
</SCRIPT>
Hier ist das gleiche Beispiel mit Tcl:
<INPUT name="edit1" size="50">
<SCRIPT type="text/tcl">
proc edit1_changed {} {
if {[edit value] == abc} {
button1 enable 1
} else {
button1 enable 0
}
}
edit1 onChange edit1_changed
</SCRIPT>
Hier ist ein JavaScript-Beispiel für die Ereignisbindung (event binding) in einem Skript. Zuerst folgt ein einfacher Klick-Handler:
<BUTTON type="button" name="mybutton" value="10">
<SCRIPT type="text/javascript">
function my_onclick() {
. . .
}
document.form.mybutton.onclick = my_onclick
</SCRIPT>
</BUTTON>
Hier ist ein in interessanterer Fenster-Handler:
<SCRIPT type="text/javascript">
function my_onload() {
. . .
}
var win = window.open("some/other/URI")
if (win) win.onload = my_onload
</SCRIPT>
Mit Tcl sieht das so aus:
<SCRIPT type="text/tcl">
proc my_onload {} {
. . .
}
set win [window open "some/other/URI"]
if {$win != ""} {
$win onload my_onload
}
</SCRIPT>
Beachten Sie, dass »document.write« oder äquivalente Ausdrücke in eingebetteten Event-Handlern eher ein neues Dokument erzeugen und hineinschreiben als das aktuelle zu verändern.
Anmerkung der Übersetzer:
In der Regel funktioniert die Ausführung von
document.write() zur Modifikation des aktuellen
Dokuments nur während das Dokument zum ersten Mal
aufgebaut wird (salopp ausgedrückt: »während des
Ladens«). Falls Sie das Dokument nachträglich
verändern wollen, vergessen Sie document.write()
vollkommen! In einem solchen Fall ist DOM-Scripting (Document
Object Model) angesagt. Doch das ist ein Thema, das den Rahmen
dieser Spezifikation sprengen würde.
Die dynamische Modifikation des Dokuments könnte wie folgt ausgeführt werden:
HTML-Dokumente müssen konform zu der HTML-DTD sein, sowohl bevor als auch nachdem irgendein SCRIPT-Element verarbeitet wurde.
Anmerkung der Übersetzer:
Es sei noch einmal betont, was im vorhergehenden Kommentar bereits gesagt wurde: Die Überschrift der dynamischen Modifikation verleitet zur Annahme, dass sich die HTML-Seite verändert, während sie angezeigt wird. Hier geht es jedoch ausschließlich um eine Modifikation vor dem ersten Anzeigen der Seite. Alles andere erfordert einen programmgesteuerten Eingriff in das Document Object Model der angezeigten Seite. Dieses Thema ist jedoch zu neu, als dass es in dieser HTML-Spezifikation berücksichtigt sein könnte.
Die Details sind natürlich auch von der verwendeten
Script-Sprache abhängig. Da das W3C keine Programmiersprachen
»im Angebot« hat, wird es im Rahmen der edition
W3C.de auch keine Einführung dazu geben. Dem
interessierten Leser sei deshalb ein anderer Titel für den
Einstieg in JavaScript empfohlen: <eigenwerbung>www.javascript-workshop.de</eigenwerbung>
Das folgende Beispiel zeigt, wie Skripte ein Dokument dynamisch verändern können. Das folgende Skript:
<TITLE>Testdokument</TITLE>
<SCRIPT type="text/javascript">
document.write("<p><b>Hello World!<\/b>")
</SCRIPT>
hat die gleichen Auswirkungen wie dieser HTML-Auszeichnung:
<TITLE>Testdokument</TITLE> <p><b>Hello World!</b>
Der folgende Abschnitt erörtert, wie Autoren Dokumente erzeugen können, die mit Benutzerprogrammen, die Skripte nicht unterstützen, funktionieren.
<!ELEMENT NOSCRIPT - - (%block;)+ -- alternate content container for non script-based rendering --> <!ATTLIST NOSCRIPT %attrs; -- %coreattrs, %i18n, %events -- >
Start-Tag: erforderlich, End-Tag: erforderlich
Das Element NOSCRIPT erlaubt es Autoren, alternativen Inhalt anzubieten, wenn ein Skript nicht ausgeführt wird. Der Inhalt eines NOSCRIPT-Elements sollte nur in den folgenden Fällen von einem skriptfähigen Benutzerprogramm dargestellt werden:Benutzerprogramme, die Client-seitige Skripte nicht unterstützen, müssen den Inhalt dieses Elements darstellen.
Im folgenden Beispiel wird ein Benutzerprogramm, welches das SCRIPT ausführt, einige dynamisch erzeugte Daten in das Dokument einfügen. Unterstützt das Benutzerprogramm keine Skripte, kann der Benutzer die Daten dennoch über einen Link beziehen.
<SCRIPT type="text/tcl"> ...ein Tcl-Skript, um Daten einzufügen... </SCRIPT> <NOSCRIPT> <P>Zugang zu <A href="http://someplace.com/data">data.</A> </NOSCRIPT>
Benutzerprogramme, die das SCRIPT-Element nicht erkennen, werden wahrscheinlich den Inhalt des Elements als Text darstellen. Einige Skript-Engines, einschließlich der Engines für die Sprachen JavaScript, VBScript und Tcl, gestatten die Angabe der Skriptzeilen in SGML-Kommentaren. Benutzerprogramme, die das SCRIPT-Element nicht erkennen, werden folglich den Kommentar ignorieren, während clevere Skript-Engines verstehen werden, dass dieses Skript im Kommentar ausgeführt werden soll.
Eine weitere Lösung des Problems ist die Speicherung der Skripte in externen Dokumenten und ihr Aufruf über das Attribut src.
Skripte in JavaScript kommentieren
Die JavaScript-Engine erlaubt die Zeichenkette »<!--« zu
Beginn des SCRIPT-Elements und ignoriert weitere Zeichen bis zum
Ende der Zeile. JavaScript interpretiert »//« als den Beginn
eines Kommentars, der sich bis zum Ende der Zeile erstreckt. Dies
wird benötigt, um die Zeichenkette »-->« vor dem
JavaScript-Parser zu verbergen.
<SCRIPT type="text/javascript">
<!-- um Skriptinhalt vor alten Browsern zu verstecken
function square(i) {
document.write("The call passed ", i ," to the function.","<BR>")
return i * i
}
document.write("The function returned ",square(5),".")
// end hiding contents from old browsers -->
</SCRIPT>
Skripte in VBScript kommentieren
In VBScript bewirkt ein Apostroph (single quote), dass der Rest der
aktuellen Zeile als Kommentar angesehen wird. Deshalb kann es dazu
verwendet werden, die Zeichenkette »-->« vor VBScript zu
verbergen, zum Beispiel:
<SCRIPT type="text/vbscript">
<!--
Sub foo()
...
End Sub
' -->
</SCRIPT>
Skripte in TCL kommentieren
In Tcl wird der Rest der Zeile durch das Zeichen »#«
auskommentiert:
<SCRIPT type="text/tcl">
<!-- um Skriptinhalt vor alten Browsern zu verstecken
proc square {i} {
document write "The call passed $i to the function.<BR>"
return [expr $i * $i]
}
document write "The function returned [square 5]."
# end hiding contents from old browsers -->
</SCRIPT>
Anmerkung. Einige Browser schließen Kommentare nach dem ersten »>«-Zeichen. Um Skriptinhalt vor solchen Browsern zu verbergen, können Sie Operanden in Vergleichs- und Shift-Operationen vertauschen (verwenden Sie zum Beispiel »y < x« statt »x > y«) oder verwenden Sie spezifische Ersatzzeichen (escapes) der Skriptsprache für »>«.