| Zugriff
auf Cascading Style Sheets mit JavaScript |
|
Wie bereits im Kapitel Cascading
Style Sheets erwähnt, ist dies kein Handbuch zu css.
Wir werden über css in Kürze ein Handbuch schreiben.
Dies ist ein Handbuch über JavaScript. Auf css wurde
im Kapitel vorher nur insoweit eingegangen, als es für
das Verständnis dieses Kapitels sinnvoll ist. css an
sich ist auch einfach, es ist nur viel. Ist das Prinzip jedoch
klar, ist es nicht besonders schwierig, alle css Anweisungen
zu verstehen. Das Grundprinzip ist immer das gleiche. Komplizierter
wird es erst dann, wenn css mit JavaScript angesprochen werden
soll. Viele Effekte, die man im Netz sieht, basieren darauf,
dass die css Formatierung, die ein bestimmtes Element formatiert,
dynamisch, das heisst in Abhängigkeit einer Aktion des
Users ausgetauscht wird. Einige dieser Möglichkeiten
wurden schon im Kapitel Rollover
et alter besprochen. Wie dort bereits besprochen, ist
es im Spezialfall Hyperlinks einfach, die css Formatierung
auszutauschen. Was ist aber, wenn wir etwa das css für
eine komplette Zeile austauchen wollen, also einen solchen
Effekt erreichen wollen, wie ihn unten stehendes Beispiel
illustriert. Fährt man mit der Maus über eine Zeile,
ändert sich das Aussehen der Zeile, in der Mauszeiger
gerade befindet. Auch dieses Beispiel funktionniert nur mit
den sechser Versionen und aufwärts der jeweiligen Browser
| Informationen
zu Rainer Maria Rilke |
Sehr gut gemachte Seite über den Autor des "Buchs der Bilder". Wir sehen uns mit der bedenklichen Tatsache konfrontiert, dass private Initiativen, wie diese Seite, mehr bewegen als Seiten öffentlicher Einrichtungen. Es gäbe jetzt viel zu sagen zum Thema Content im Internet, aber wir lassen das jetzt. |
| www.thomas-mann.de |
Wer meint auf dieser Seite Informationen über Thomas Mann zu finden, der irrt. Man landet bei der Buchhandlung Thomas Mann |
| www.goethe.de |
Auch das starker Tobak. Man erwartet Informationen zu Goethe und landet beim Goethe Institut. Dort wird man dann informiert über die Deutschkurse des Goethe Institutes. Wahnsinnig spannend ! Dann gibt es noch Informationen über Deutschland allgemein, die an jeder Ecke im Internet stehen. Auf Deutsch und Englisch. Mehr Sprachen gibt es für den Leuchtturm der deutschen Kulturvertreter nicht. (Gibt noch was auf Arabisch, das geht dann aber Deutsch und Englisch weiter). |
| www.schiller.de |
Und ? Informationen zu Schiller ? Pustekuchen. Es kommt irgend so ein Flash Teil |
| www.robert-musil.de |
Und ? Informationen zum Autor von "der Mann ohne Eigenschaften" ? Niente Pizza. Domain grabbing Alarm. Kommt under construction. |
| www.ernst-bloch.de |
Bingo !!! Informationen zu einem der bedeutendsten Philosophen des zwanzigsten Jahrhunderts. Zwar noch etwas dürftig das ganze, aber der Wille ist erkennbar. |
Der Skript, der das bewirkt, sieht so aus (aus Gründen der Darstellung
wurde der Text gekürzt).
<body><html><head><title>javascript
und css</title></head>
<body>
<script language="javascript">
function neuer(i)
{
i.style.color="blue";
i.firstChild.firstChild.style.color="black";
i.style.fontSize = "11pt";
i.firstChild.firstChild.style.fontSize="11pt";
i.style.background = "white";
}
function alter(i)
{
i.style.color="black";
i.firstChild.firstChild.style.color="green";
i.style.fontSize = "10pt";
i.firstChild.firstChild.style.fontSize="10pt";
i.style.background = "#CCCCCC";
}
</script>
<table border=0>
<tr onmouseover="neuer(this)" onMouseOut="alter(this)"><td>
<A href="http://www.rilke.de">Informationen
zu Rainer Maria Rilke</A>
</td><td>Sehr gute Seite über den Autor des
"Buchs der Lieder!</td></tr>
<tr onmouseover="neuer(this)" onMouseOut="alter(this)"><td>
<A href="http://www.thomas-mann.de">www.thomas-mann.de</A>
</td><td>Keine Infor zu Thomas Mann, sondern über
eine Buchhandlung</td></tr>
<tr onmouseover="neuer(this)" onMouseOut="alter(this)"><td>
<A href="http://www.goethe.de">www.goethe.de</a>
</td><td>Trivialitäten des Goethe Institutes</td></tr>
<tr onmouseover="neuer(this)" onMouseOut="alter(this)"><td>
<A href="http://www.schiller.de">www.schiller.de</a>
</td><td>Und ? Informationen zu Schiller ? Pustekuchen.
Es kommt irgend so ein Flash Teil</td></tr>
<tr onmouseover="neuer(this)" onMouseOut="alter(this)"><td>
<A href="http://www.robert-musil.de">www.robert-musil.de</A>
</td><td> Domain grabbing Alarm. Kommt under construction.</td></tr>
<tr onmouseover="neuer(this)" onMouseOut="alter(this)"><td>
<A href="http://www.ernst-bloch.de">www.ernst-bloch.de</A>
</td><td> Bingo !!! Informationen zu einem der
bedeutendsten Philosophen des zwanzigsten Jahrhunderts.</td></tr>
</table>
</body></html>
Wie deutlich zu sehen,
wird hier ein Ansatz gewählt, denn wir schon aus dem
Kapitel nochmehr Objekte,
hyperlinks,body et alter mit DOM her kennen. Merkwürdig
ist nun der Parameter, der beim Aufruf der Funktionen neuer()
bzw. alter() übergeben wird. Hierfür muss man verstehen,
dass bei DOM alle HTML Elemente (als Spezialfall von XML Elementen)
Knoten sind, folglich auch tr ein Knoten ist. Ein Knoten ist
aber ein Objekt und this ist der Verweis auf eine Instanz
dieses Objektes. Der Knoten tr, wie im übrigen jeder
Knoten, hat nun eine Menge Eigenschaften, z.B. nodeName für
den Namen des Knotens, oder nodeValue für den Wert des
Knotens, firstChild für den ersten Kindknoten etc. etc.
Angewendet auf ein HTML Dokument hat der Knoten auch noch
das Kindobjekt style, das alle möglichen css Formatierungen
speichert. Drei dieser Formatierungen, nämlich color,
fontSize und background tauschen wir aus. Das war es dann
auch schon. Erstaunlich ist dann die Zeile
i.firstChild.firstChild.style.fontSize="11pt";
Hierfür müssen wir verstehen, dass
i den Wert von this animmt (für Übergabe von Parametern
an Funktionen siehe Funktionen).
this wiederum ist ein Zeiger auf die Instanz des jeweiligen
Knotens, aus dem heraus die Funktion aufgerufen wird. Mit
this landen wir also, wenn es aus der ersten Zeile heraus
aufgerufen wurde in
document.getElementByTagName("tr")[0]
also zu Deutsch beim ersten tr Element. Das
Problem ist nun, dass wir mit
i.style.color="blue";
(was in Bezug auf das erste tr Element gleichbedeutend
ist mit document.getElementByTagName("tr")[0]
.style.color="blue")
lediglich die Farbe für die Textelemente
austauschen, die Kinder oder Kindeskinder von tr sind. Der
Text beim Hyperlink ist aber kein Kind oder Kindeskind von
tr, sondern vom Element A. Mit i.style.color="blue"
ändern wir nur die Farbe im Feld Beschreibung ("Sehr
gut gemachte Seite über den Dichter ......."), nicht
aber die Farbe des Hyperlinks. Um die Farbe des Hyperlinks
zu ändern, müssen wir erst in den entsprechenden
Knoten fahren.
i.firstChild.firstChild.style.color="blue";
Wir müssen uns klar machen, dass der Textknoten,
der die Beschriftung des Hyperlinks darstellt, zwei Hierarchiestufen
unterhalb von tr sitzt (zuerst kommt td und dann a). Mit ..firstChild.firstChild
wandern wir diese zwei Hierarchiestufen nach unten. Wenn wir
dann beim Knoten a angelangt sind, weisen wir mit style.color
diesem einen neuen Wert zu. Aus didaktischen Gründen
vereinfachen wir das Beispiel nochmal und lassen uns ein paar
Zwischenwerte zeigen.
| Informationen zu Rainer Maria Rilke | Sehr gut gemachte Seite über den Autor des "Buchs der Bilder". Wir sehen uns mit der bedenklichen Tatsache konfrontiert, dass private Initiativen, wie diese Seite, mehr bewegen als Seiten öffentlicher Einrichtungen. Es gäbe jetzt viel zu sagen zum Thema Content im Internet, aber wir lassen das jetzt. |
Wir sehen also wenn wir mit der Maus über die
Zeile fahren und dort clicken in einem alert Fenster die einzelnen
Werte. Zur Verdeutlichung wurde in einem zweiten alert Fenster
der Knoten nochmal mit dem kompletten Pfad nach dem dom Ansatz
angesteuert. Das Programm sieht so aus.
<script language="javascript">
function neuer2(i)
{
i.style.color="blue";
i.firstChild.firstChild.style.color="blue";
i.style.fontSize = "14pt";
i.firstChild.firstChild.style.fontSize="14pt";
i.style.background = "yellow";
alert("Name-Aufruf des Knoten mit this: "+i.nodeName+"\nerstes
Kind: "+i.firstChild.nodeName+"\nzweites Kind: "+i.firstChild.firstChild.nodeName+"\nKnoten
Namen des Textknotens: "+i.firstChild.firstChild.firstChild.nodeName+"\nWert
des Textknotens: "+i.firstChild.firstChild.firstChild.nodeValue);
alert("Name-Aufruf des Knoten mit Dom Pfadangabe: "+
document.getElementsByTagName("tr")[0].nodeName);
}
function alter2(i)
{
i.style.color="black";
i.firstChild.firstChild.style.color="blue";
i.style.fontSize = "12pt";
i.firstChild.firstChild.style.fontSize="12pt";
i.style.background = "white";
}
</script>
<table border=1>
<tr onmouseover="neuer2(this)" onMouseOut="alter2(this)"><td><A
href="http://www.rilke.de">Informationen zu Rainer
Maria Rilke</A></td><td>Sehr gut gemachte
Seite über den Autor des "Buchs der Bilder".
Wir sehen uns mit der bedenklichen Tatsache konfrontiert,
dass private Initiativen, wie diese Seite, mehr bewegen als
Seiten öffentlicher Einrichtungen. Es gäbe jetzt
viel zu sagen zum Thema Content im Internet, aber wir lassen
das jetzt.</td></tr>
</table>
Damit dürfte klar sein, wie man mit
JavaScript bei jedem x-beliebigen Element die css Formatierungen
austauschen kann. Bevor wir eine weitere Möglichkeit
besprechen, müssen wir uns noch über etwas anderes
klar werden. Der Ansatz oben funktionniert nur, wenn das Element
zu Beginn entweder gar keine css Formatierungen hatte, wie
hier, oder die Formatierung über das Attribut style definiert
wurden. Wir betrachten dieses
Beispiel
<html><head><title>cssRules</title></head>
<body
<script language="javascript">
function neuer3(i)
{
document.styleSheets[0].cssRules[0].style.color = "yellow"
}
function alter3(i)
{
i.style.color="black";
i.firstChild.firstChild.style.color="blue";
i.style.fontSize = "12pt";
i.firstChild.firstChild.style.fontSize="12pt";
i.style.background = "white";
}
</script>
<style type=text/css>
td {
background-color:gold;
font-family:Tahoma;
font-size:14px;
font-weight:bold;
color:red;
}
</style>
<table border=1>
<tr onmouseover="neuer3(this)" onMouseOut="alter3(this)"><td><A
href="http://www.rilke.de">Informationen zu Rainer
Maria Rilke</A></td><td>Sehr gut gemachte
Seite über den Autor des "Buchs der Bilder".
Wir sehen uns mit der bedenklichen Tatsache konfrontiert,
dass private Initiativen, wie diese Seite, mehr bewegen als
Seiten öffentlicher Einrichtungen. Es gäbe jetzt
viel zu sagen zum Thema Content im Internet, aber wir lassen
das jetzt.</td></tr>
</table>
</body></htm>
Der einzige Unterschied besteht darin, dass
in diesem Beispiel bereits eine css Formatierung vorliegt.
Eine bestehende css Formatierung läßt sich mit
der oben dargestellten Methode nicht überschreiben. Das
Beispiel funktionniert also nur noch mit den Eigenschaften,
für die noch keine css Formatierung vorliegt, also nur
noch für die Beschreibung des Hyperlinks. Für Elemente,
deren Gestaltung bereits durch eine css Formatierung festgelegt
ist, brauchen wir also ein anderes Verfahren
| Zugriff
auf das cascading style sheet selbst mit rules bzw. cssrules |
|
Das Verfahren funktionniert nun so, dass direkt das cascading
style sheet verändert wird, dass das entsprechende Element
formatiert. Das ist nun komplizierter, als man meinen könnte,
da erstmal das richtige cascading style sheet angesprochen
werden muss und zweitens innerhalb dieses cascading style
sheets das richtige Element. Man muss sich klar machen, dass
eine Seite durch mehrere cascading style sheets beschrieben
werden kann, z.B. durch ein externes und durch eine direkt
in der Seite und innerhalb der Seite kann es auch mehrere
geben. Jedes dieser cascading style sheets definiert nun die
Eigenschaften für mehrere Elemente. Folglich muss geklärt
werden, welches cascading style sheet und innerhalb dieses
cascading style sheets welches Element angesprochen wird.
Machen wir uns das anhand eines Beispieles klar. Wir gehen
wieder von dem Beispiel aus, dass, aus den genannten Gründen
nicht funktionniert hat. Das modifizierte Beispiel, dass dann
funktionniert, sieht so aus.
<html><head><title>cssRules</title>
<style type="text/css">
td {
background-color:gold;
font-family:Tahoma;
font-size:14px;
font-weight:bold;
color:red;
}
a {
font-family:Tahoma;
font-size:14px;
font-weight:bold;
color:red;
}
</style>
</head>
<body>
<script language="javascript">
die_Formatierungen=new Array();
function neuer3(i)
{
if (document.styleSheets[0].cssRules)
die_Formatierungen = document.styleSheets[0].cssRules;
else if (document.styleSheets[0].rules)
die_Formatierungen = document.styleSheets[0].rules;
else alert("Das ist keine sechser Version von Explorer
oder Netscape");
die_Formatierungen[0].style.background
= "yellow";
die_Formatierungen[0].style.color = "blue";
die_Formatierungen[1]. style. fontSize= "18px";
die_Formatierungen[1].style.color = "green";
}
function alter3(i)
{
die_Formatierungen[0].style.background = "gold";
die_Formatierungen[0].style.color = "red";
die_Formatierungen[1].style. fontSize= "14px";
die_Formatierungen[1].style.color= "red";
}
</script>
<table border=1>
<tr onmouseover="neuer3(this)" onMouseOut="alter3(this)">
<td><A href="http://www.rilke.de">Informationen
zu Rainer Maria Rilke</A></td>
<td>Sehr gut gemachte Seite über den Autor des
"Buchs der Bilder". Wir sehen uns mit der bedenklichen
Tatsache konfrontiert, dass
private Initiativen, wie diese Seite, mehr bewegen als Seiten
öffentlicher Einrichtungen. Es gäbe jetzt viel zu
sagen zum Thema Content im Internet, aber wir lassen das jetzt.</td></tr>
</table>
</body>
</html>
Wer sich das jetzt live anschauen will,
kann hier
clicken. Wie deutlich zu erkennen, ist
das Verfahren nun ein völlig anderes. Wir sprechen nicht
das Element an und verändern via Element.style.color,
Element.style.bgColor etc. die Formatierung des Elementes
selbst. Sondern wir verändern via Array_Stylesheet.angesprochene_Formatierung.style.color,
Array_Stylesheet.angesprochene_Formatierung.style.color etc.
das cascading style sheet, welches das entsprechende Element
formatiert. Machen wir uns klar, wie der Skript funktionnert.
Wir haben nicht ernsthaft damit gerechnet, dass die Browser
hier compatibel sind und natürlich ist das auch nicht
so. Die verschiedenen Formatierungen der jeweiligen Stylesheets
spreichert der Explorer in einem Array namens rules, Netscape
aber in einem Array namens cssRules. Folglich müssen
wir herausfinden, mit welchem Browser wir es zu tun haben,
was wir durch diesen Vierzeiler bewerkstelligen.
if (document.styleSheets[0].cssRules)
die_Formatierungen
= document.styleSheets[0].cssRules;
else if (document.styleSheets[0].rules)
die_Formatierungen
= document.styleSheets[0].rules;
else alert("Das ist keine sechser
Version von Explorer oder Netscape");
Wenn das Objekt cssRules vorhanden ist,
handelt es sich offensichtlich um Netscape, ist das Objekt
rules vorhanden, handelt es sich offensichtlich um den Exploder.
Trifft beides nicht zu, haben wir es mit einem Browser zu
tun, der weder das eine noch das andere kennt. Wir greifen
also mit document.styleSheets[0].cssRules bzw. mit document.styleSheets[0].rules
alle Formatierungen des ersten Stylesheets ab, wobei in unserem
Fall nur eines vorhanden ist. Alle unsere Formatierungen stecken
dann in dem Array die_Formatierungen, genau genommen haben
wir einen Array mit Referenzen auf Objekte,die die Formatierungen
darstellen. Jede von diesen wiederum hat das Kindobjekt style,
welches wiederum Eigenschaften wie color, bgColor,fontSize
etc. etc. hat. Mit dieser Zeile
die_Formatierungen[0].style.color = "blue";
weisen wir der ersten Einheit unseres Stylesheets,
also dem Bereich der die Zellen formatiert, eine neue Farbe
zu und mit diesem Teil
die_Formatierungen[1].style. fontSize=
"14px";
weisen wir der zweiten Einheit unseres Stylesheets,
also dem Bereich der die Hyperlinks formatiert, eine neue
Größe für die Schrift zu.