| 
Was ist DHTML
Eine Schicht der HTML Seite
ein aus ausblenden
Steuerung der visibibility
mit z-index
Das Event an ein HTML Element
binden
event handler auf das gesamte Dokument auf ein
Objekt begrenzen
DHTML ist keine neue Programmiersprache, man
kann wahrscheinlich nicht mal behaupten, dass es sich um ein
neues, in sich geschlossenes System handelt. DHTML ist die
Verschmelzung von JavaScript, cascading style sheet, dem Document
Object Model Ansatz. Hinzugekommen ist noch die Idee, dass
man eine HTML Seite in Schichten zerlegen kann und diese einzelnen
Schichten einzeln ansprechen und manipulieren kann. Didaktisch
gesehen ist es wohl so, dass man von DHTML immer dann spricht,
wenn es um Grenzbereiche geht, also Technologien, die den
geschlossenen Systemen wie cascading style sheet, JavaScript,
dom nicht mehr eindeutig zugeordnet werden können. Wer
will kann aber auch die Verbindung aus JavaScript und css
oder die Verknüpfung von JavaScript und dem dom Ansatz
als DHTML bezeichnen. In der Vergangenheit wurde DHTML von
den verschiedenen Browser extrem unterschiedlich umgesetzt.
Der im Zusammenhang mit XML entwickelte dom Ansatz führte
dann aber zu einer gewissen Vereinheitlichung der Konzepte,
wenn man es sich auch noch einheitlicher wünschen kann.
Hier wird nur noch der allerneueste Standard beschrieben,
in der Hoffnung, dass Netscape 4.XX, welcher ein stark abweichendes
Modell vertreten hat, dass nicht mal Netscape 6.0 und höher
weiterhin unterstützt, sich vom Markt verabschiedet.
| Eine
Schicht der HTML Seite ein aus ausblenden |
|
Wie bereits gesagt, läßt sich mit
DHTML eine Seite in Schichten aufteilen. Man kann eine Schicht
über eine andere legen oder auch eine Schicht komplett
unsichtbar machen, wie dieses
Beispiel zeigt. Der Skript, der das bewerkstelligt sieht so
aus.
<html><head><title>test</title>
<script language=javaScript>
function zeigen()
{
document.getElementById("karotte").style.visibility="visible";
}
function nirvana()
{
}
function verstecken()
{
document.getElementById("karotte").style.visibility="hidden";
}
</script>
</head>
<body>
Das sieht man immer. Wenn er aber mit der mouse über
das Wort test fährt, wird es lyrisch.<br><br>
<div id="karotte" style="visibility:hidden">
Sage mir auf welchem Pfade <br>
heute sie vorüberschreite<br>
dass ich aus der reichsten Lade<br>
zarte Seidenweben hole <br>
Rosen pflücke und Violen<br>
dass ich meine Wange reiche<br>
Schemel unter ihrer Sohle<br><br>
STEFAN GEORGE
</div>
<A href=javascript:nirvana(); onMouseOver=zeigen(); onMouseOut=verstecken();
style="text-decoration:none"; >test. Get this
emotion !!!! For free !!!</a>
</body></html>
Wie deutlich zu erkennen, ist das Verfahren
ziemlich einfach. Wir sprechen, wie im Kapitel Zugriff
auf Cascading Style Sheets mit JavaScript bereits besprochen,
das entsprechende HTML Element an. Dieses wiederum hat ein
Kindobjekt, nämlich style und dieses wiederum die Eigenschaft
visibility. Die stellen wir auf visible, wenn wir mit der
Maus auf die Schrift fahren und auf hidden, wenn wir die Maus
wegbewegen. Es sein nochmals erwähnt, dass beide Browser
hierfür auch proprietäre, nicht kompatible Ansätze
haben, beide aber auch diese dritte, kompatible, Möglichkeit
unterstützen. Da die proprietären Ansätze keine
Zukunft haben, wird hier auch nicht weiter darauf eingegangen.
Der hier beschriebene Ansatz funktionniert ab den sechser
Versionen von Netscape respektive Explorer. Man kann das Beispiel
ausbauen und mehrere Schichten übereinander legen von
denen man dann man dann via Click eine nach der anderen sichtbar
werden lässt. Wer nicht weiss, von was die Rede ist,
kann hier
clicken. Das Programm, das uns das auf den Schirm setzt, sieht
dann so aus.
<html><head><title>test</title>
<script language=javaScript>
prolog=new Array();
prolog=document.getElementsByName("karotte");
var i=0;
var e=0;
function zeigen()
{
e=e+1;
for(i=0;i<prolog.length;i++)
{
if(e==i)
{prolog[i].style.visibility="visible";}
else {prolog[i].style.visibility="hidden";}
}
if(e ==prolog.length-1)
{e=-1;}
}
</script>
<style type=text/css>
#karotte
{
position:absolute;
top:50;
left:10;
background-color:yellow
}
</style>
</head>
<body>
Wer den Prolog im Himmel lesen will (Goethes Faust) der muss
unten clicken.<br><br>
<div name="karotte" id="karotte" style="visibility:visible";>
Die Sonne tönt<br>
in alter Weise<br>
in Brudersphären Wettgesang<br>
</div>
<div name="karotte" id="karotte" style="visibility:hidden";>
und ihre vorgeschriebene Reise<br>
vollendet sie mit Donnergang<br>
ihr Anblick gibt den Engeln Stärke<br>
</div>
<div name="karotte" id="karotte" style="visibility:hidden";>
Wenn keiner sie ergründen mag<br>
Herr die unendlich hohen Werke<br>
sind herrlich wie am ersten Tag<br>
</div>
<div style="position:absolute;top:120;left:10">
<A href="javascript:void(0)"; onClick=zeigen();>test.
Get this emotion !!!! For free !!!</a>
<div id="position"></div>
</body></html>
Es sei ohne jede weitere Diskussion konzediert,
dass man ein solch einfaches Problem auch einfacher hätte
lösen können, das wäre aber didaktisch nicht
so wertvoll gewesen. Wir sehen also, dass drei divs übereinanderliegen,
von denen zwei via visibility:hidden auf unsichtbar und einer
via visibility:visible auf sichtbar gestellte wurde. Dies
hat zur Konsequenz, dass wir bei Aufruf der Seite die ersten
drei Verse des Gedichtes sehen. Clicken wir auf "test.
Get this emotion !!!! For free !!" dann passiert grob
folgendes. Der div (der eine!) der auf visible stand, wird
auf hidden gestellt und der div, der auf diesen folgt, auf
visible, so dass sich die Verse des Gedichtes hintereinander
einblenden, mit jedem Click der nächste. Im Detail passiert
folgendes. Mit
prolog=new Array();
prolog=document.getElementsByName("karotte");
ermitteln wir die Anzahl der HTML Elemente
mit dem Namen "karotte" (drei an der Zahl). getElementByTagName("div")
wäre weniger günstig gewesen, dann hätten wir
nämlich noch einen erwischt, den letzten, den wir gar
nicht haben wollen. getElementById() gibt überhaupt keinen
Array zurück, weil nach dem DOM Ansatz eine Id einmalig
ist, und folglich gar kein Array existiert. Wir sehen an diesem
Beispiel nochmal, was schon an früherer Stelle beschrieben
wurde. Für die css kann man mehrere id definieren, wie
wir das hier tun. Für das Arbeiten mit dem dom Ansatz
ist dies jedoch sinnlos, da nicht möglich. Prolog ist
jetzt also ein Array mit drei Zeigern auf ein Element Objekt,
genau genommen auf die drei divs, in denen das Gedicht steckt.
Die Objekte, auf die die Zeiger verweisen, haben wiederum
ein Kindobjekt, nämlich style, das wiederum, unter anderen,
auch die Eigenschaft visibility hat. Bei jedem Aufruf der
Funktion zeigen() wird der komplette Array Prolog durchlaufen.
Da wir bei jedem Aufruf der Funktion einen Zähler mitlaufen
lassen (e) wissen wir, welcher div auf visible und welche
auf hidden gestellt werden müssen. So ist es möglich,
den jeweiligen Vers visible zu machen und die anderen visible.
Als Nebenbemerkung sein noch angemerkt, dass, wie bereits
unter Zugriff auf Cascading
Style Sheets mit JavaScript diskutiert, dies nur funktionnieren
kann, wenn wir die Eigenschaft visibility nicht in einer css
Formatierung festlegen sondern als Attribut des Elementes,
was wir hier ja sowieso machen müssen, da ja ein div
sichtbar, die anderen aber unsichtbar sein sollen. Es hätte
bei diesem Beispiel noch eine zweite Methode gegeben.
| Steuerung
der visibibility mit z-index |
|
Man hätte auch den z-Index, der angibt,
wie die Schichten übereinandergelegt sind, manipulieren
können. Das sähe dann so oder ähnlich aus.
<html><head><title>test</title>
<script language=javaScript>
prolog=new Array();
prolog=document.getElementsByName("karotte");
var e=0;
function zeigen()
{
for(e=0;e<=prolog.length-1;e++)
{
if(prolog[e].style.zIndex !=2)
{prolog[e].style.zIndex=prolog[e].style.zIndex+1;}
else
{prolog[e].style.zIndex=0;}
}
}
</script>
<style type=text/css>
#karotte
{
position:absolute;
top:50;
left:10;
width=250;
background-color:yellow
}
</style>
</head>
<body>
Wer den Prolog im Himmel lesen will (Goethes Faust) der muss
unten clicken.<br><br>
<div name="karotte" id="karotte" style="z-index:2";>
Die Sonne tönt<br>
in alter Weise<br>
in Brudersphären Wettgesang<br>
</div>
<div name="karotte" id="karotte" style="z-index:1";>
und ihre vorgeschriebene Reise<br>
vollendet sie mit Donnergang<br>
ihr Anblick gibt den Engeln Stärke<br>
</div>
<div name="karotte" id="karotte" style="z-index:0";>
Wenn keiner sie ergründen mag<br>
Herr die unendlich hohen Werke<br>
sind herrlich wie am ersten Tag<br>
</div>
<div style="position:absolute;top:120;left:10">
<A href="javascript:void(0)"; onClick=zeigen();>test.
Get this emotion !!!! For free !!!</a>
<div id="position"></div>
</body></html>
Wer will, kann es sich anschauen, indem er hier
clickt. Allerdings macht es genau das gleiche, wie das vorhergehende
Programm, wenn es auch technisch anders umgesetzt wurde. Das
Programm selbst ist dann leicht zu verstehen. Die Funktion
zeigen() erhöht bei jedem Aufruf den z-index, allerdings
tut sie das nicht, wenn dieser 2 ist, dann setzt sie ihn auf
0. Dies wiederum bewirkt, dass bei jedem Aufruf das jeweils
nächste div aufgeblendet wird.
Eine der auffälligsten Neuerungen von DHTML
war es, dass es so auf einmal möglich war, bestimmte
Bereiche einer HTML Seite zu bewegen. Auf einmal waren Effekte
wie dieser
möglich. Der Skript, der das produziert, sieht so aus.
<html><head><title>test</title>
<style type="text/css">
#karotte{background:url(meer.jpg) no-repeat;position:absolute;
top:10;left:10;width:400;height:400;}
#ruebe{position:absolute;top:310;left:15;z-index:1;font-family:arial;color:red;font-
size:20px;width:400;height:400;}
#gurke{position:absolute;top:309;left:15;z-index:3;background-color:white;font-family:arial;color=blue;font-
size:25px;text-align:right;width:400;height:400;}
</style>
<script language=javascript>
var text="Was reif in diesen Zeilen steht <br>"+
"was lächeln sinnt und sinnend fleht <br>"+
"das soll kein Kind betören<br>"+
"die Schwermut hat es ausgesät<br>"+
"die Wehmut hat hindurchgeweht<br>"+
"die Sehnsucht hats getrieben<br>"+
"und ist das Feld eins abgemäht<br>"+
"die Sehnsucht durch die Stoppeln geht<br>"+
"sucht Ähren die geblieben<br>"+
"sucht Lieb die für sie aufersteht<br> "+
"sucht Lieb die für untergeht<br>"+
"sucht Lieb die sie kann lieben";
function rin()
{
document.getElementById('ruebe').innerHTML=text;
scrolli();
}
var i=310;
function scrolli()
{
i=i-1;
document.getElementById('ruebe').style.top=i;
ende=setTimeout("scrolli()",40);
if (i ==12)
{
clearTimeout(ende);
document.getElementById('gurke').innerHTML="Clemens Brentano";
}
}
</script>
</head><body onload=rin();>
<div id="karotte"></div>
<div id="ruebe"></div>
<div id="gurke"></div>
</body>
</html>
Die Art, wie es programmiert ist, ist nicht
besonders günstig, genügt aber, um die Zusammenhänge
zu verdeutlichen. In diesem Skript wurden drei div Bereiche
definiert. Der div karotte hat das eigentliche Bild, jenes
berühmte von Caspar David Friedrich, Der Mönch und
das Meer. In den div ruebe wird das das Gedicht von Clemens
Brentano geschossen. Der div ruebe befindet sich zu Beginn
unterhalb des divs ruebe und wird von dem div gurke verdeckt.
Nachdem die Seite geladen wurde, wird die Funktion rin() aufgerufen,
die das Gedicht in den div ruebe schiesst. Die Funktion rin()
ruft dann die Funktion scrolli() auf. Die Funktion scrolli
wiederum zieht den div ruebe nach oben. Sie tut dies, indem
sie mit
document.getElementById('ruebe').style.top=i;
bei jedem Durchlauf den div ruebe vertikal neu
positionniert und sich dann mit
ende=setTimeout("scrolli()",40);
nach 40 Millisekunden neu aufruft. Wenn i den
Wert 12 angenommen hat, ist der div ruebe, der das Gedicht
hält, in der Endposition. Die Funktion scrolli wird dann
mit
clearTimeout(ende);
gestoppt. Ähnliche Effekte kann man mit
der Funktion clip() produzieren, zum Beispiel
so was. Der Skript, der uns das auf den Schirm setzt sieht
so aus.
<html><head><title>test</title>
<style type="text/css">
#karotte{background:url(meer.jpg) no-repeat;position:absolute;
top:10;left:10;width:400;height:400;}
#ruebe{position:absolute;top:10;left:10;z-index:1;font-family:arial;color:red;font-size:20px;}
</style>
<script language=javascript>
var text="Wir sind nur Mund <br>"+
"wer singt das stille Herz <br>"+
"das heil in allen Dingen weilt<br>"+
"sein grosser Schlag ist in uns eingeteilt<br>"+
" in lauter kleine Schläge<br>"+
"sein grosser Schmerz ist, <br>"+
"wie seine grosse Freude,uns zu gross<br>"+
"drum reissen wir uns immer wieder los<br>"+
"und sind nur Mund<br>"+
"doch plötzlich bricht der grosse Herzschlag<br>"+
" in uns ein, so dass wir schreien<br>"+
"und sind dann plötzlich<br> "+
"Wesen, Wandlung und Gestalt<br><br>"+
"Rainer Maria Rilke";
a=25;
function rin()
{
document.getElementById('ruebe').innerHTML=text;
scrolli(a);
}
function scrolli(a)
{
document.getElementById("ruebe").style.clip="rect(0
400"+" "+a+" "+"0)";
a=a+23;
ende=setTimeout("scrolli("+a+")",1000);
if(a>350)
{
clearTimeout(ende);
}
}
</script>
</head><body onload=rin();>
<div id="karotte"></div>
<div id="ruebe" style="clip:rect(0 400 25
0)"></div>
</body>
Auch hier schiesst die Funktion rin() das Gedicht
von Rilke in den div ruebe. Anschliessend ruft die Funktion
rin() die Funktion scrolli() auf. Entscheidend ist nun die
Zeile
document.getElementById("ruebe").style.clip="rect(0
400"+" "+a+" "+"0)";
clip definiert den Bereich einen divs, der sichtbar
ist und zwar als Rechteck. Die Art und Weise allerdings, wie
sie das tut, ist ziemlich ungewöhnlich. Die Paramter
haben folgende Bedeutung. Die ersten zwei Paramter definieren
nicht die linke obere Ecke sondern die rechte obere Ecke.
Die nächsten zwei Parameter definieren nicht die rechte
untere Ecke sondern die linke untere Ecke. Es ist also genau
umgekehrt wie sonst üblich. Die Funktion scrolli() wird
über setTimeout rekursiv augerufen und bei jedem Aufruf
wird a, das heisst der Abstand der linken unteren Ecke zum
Anfang des divs um 23 Punkte, das heisst um eine Zeile, erhöht.
Wenn a einen Wert von größer 350 hat wird das Spiel
beendet. Nach einem ähnlichen Schema läßt
sich auch dieser,
im Netz häufig zu beobachtende Effekt erzielen. Alles
klar ? Der thumbnail der Websites ist zuerst blass und wird
dann farbiger. In dem Moment in dem er farbig ist, ist er
auch clickable. Allerdings muss man bei dieer Variante auf
Zack sein, da man die Website ja nur anclicken kann, wenn
die Farben kräftig sind. Wir werden das unten verbessern.
Der Skript, der uns dieses Kunstwerk auf den Schirm setzt
sieht so aus.
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:400}
#ruebe{position:absolute; top:10;left:10;width:400;height:400}
</style>
<script language=javascript>
function scrolli(a,b)
{
document.getElementById("ruebe").style.clip="rect(0"+"
"+ a+" "+" 72"+" "+ b+")";
a=a+125;
b=b+125;
if(a>=875)
{
a=125;
b=0;
}
ende=setTimeout("scrolli("+a+","+b+")",1000);
}
</script>
</head>
<body onload=scrolli(125,0)>
<div id="karotte"><img src=film2a.jpg></div>
<div id="ruebe"><img src=film1a.jpg usemap="#bild"
border=0></div>
<MAP NAME="bild">
<AREA SHAPE=RECT COORDS="0,0,125,72" HREF="http://www.bodyline-pur.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="125,0,255,72" HREF="http://www.dbo-boettcher.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="250,0,375,72" HREF="http://www.kraftquelle-lebensenergie.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="375,0,500,72" HREF="http://www.hotel-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="500,0,625,72" HREF="http://www.hofladen-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="625,0,750,72" HREF="http://www.bodytune-falkensee.de"
TARGET="_blanc">
</MAP>
</body>
</html>
Das Verfahren ist auch hier relativ simpel. Wir legen zwei
Bilder übereinander, das blasse und farblich kräftigere.
Die beiden Bilder sehen so aus.
Die Variante kräftig
Die Variante blass
Die Variante kräftig wird zu einem
clickable image umfunktionniert. Zu Beginn verdeckt die Variante
blass vollkommen die Variante kräftig, so dass keine
der Website über einen Hyperlink aufgerufen werden kann.
Nachdem die Seite aufgerufen wurde, wird mit onload die Funktion
scrolli() aufgerufen und das erste Bild der Variante kräftig
mit clip sichtbar gemacht. Die Funktion scrolli() erhöht
dann den Wert für a und b und ruft sich nach einer Sekunde
erneut auf, mit der Wirkung, dass die zweite Website aufgeblendet
wird. Nach diesem Schema werden alle Website durchlaufen.
Am Ende angekommen, wird der Wert für a und b auf den
Startwert zurückgesetzt und das Spiel beginnt von vorne.
Nach dem gleichen Schema hätte man auch so
einen Effekt realisieren können. Die Unterschiede
zum vorherigen Beispiel sind minimal.
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:400}
#ruebe{position:absolute; top:10;left:10;width:400;height:400}
</style>
<script language=javascript>
function scrolli(a,b)
{
document.getElementById("ruebe").style.clip="rect(0"+"
"+ a+" "+" 72"+" "+ b+")";
a=a+1;
b=b+1;
if(a>=750)
{
a=125;
b=0;
}
ende=setTimeout("scrolli("+a+","+b+")",10);
}
</script>
</head>
<body onload=scrolli(125,0)>
<div id="karotte"><img src=film2a.jpg></div>
<div id="ruebe"><img src=film1a.jpg usemap="#bild"
border=0></div>
<MAP NAME="bild">
<AREA SHAPE=RECT COORDS="0,0,125,72" HREF="http://www.bodyline-pur.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="125,0,255,72" HREF="http://www.dbo-boettcher.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="250,0,375,72" HREF="http://www.kraftquelle-lebensenergie.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="375,0,500,72" HREF="http://www.hotel-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="500,0,625,72" HREF="http://www.hofladen-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="625,0,750,72" HREF="http://www.bodytune-falkensee.de"
TARGET="_blanc">
</MAP>
</body>
</html>
Wie deutlich zu erkennen, wurde lediglich die
Art und Weise wie hochgezält wird und die Zeitdauer,
die verstreicht, bis sich die Funktion scrolli() wieder selbst
aufruft modifiziert. Schicker wäre es, wenn man mit der
Maus zu der Website fahren könnte, die man aufblenden
will. Gemeint ist ein Effekt dieser
Art. Alles klar ? Das ist so was Ähnliches wie drag
and drop. Wenn wir auf dem Bilderstreifen sind, drücken
wir die Maustaste, die darunter liegende Website wird farbig,
bewegen wir nun mit gedrückter Maustaste die Maus auf
dem Bilderstreifen, wird eine Website nach der anderen farbig.
Wenn wir einen Doppelclick machen, werden wir weitergeleitet
zu dieser Website. Das funktionniert nur mit dem Explorer,
wir werden es nachher nochmal für Netscape 6+ programmieren
und zu guter letzt noch eine Browser compatible Variante zeigen.
Das Browser Chaos erstrahlt hier im übrigen in vollendeter
Pracht und Anmut. Der Skript für den Explorer sieht so
aus
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:400;}
#ruebe{position:absolute; top:10;left:10;width:400;height:400;z-Index=1;}
</style>
<script language=javascript>
document.onmousedown=packmich;
function packmich()
{
start=event.clientX;
objekt = event.srcElement;
document.onmousemove = bewegen;
document.onmouseup = beenden;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
function bewegen()
{
if(objekt)
{
schauen=event.clientX;
a=start+schauen-start;
b=a-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function beenden()
{
objekt=false;
}
</script>
</head>
<body>
<div id="ruebe" style="clip:rect(0 125 72
0)";><img src=film1a.jpg usemap="#bild"
border=0></div>
<div id="karotte"><img src=film2a.jpg></div>
<MAP NAME="bild">
<AREA SHAPE=RECT COORDS="0,0,125,72" HREF="http://www.bodyline-pur.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="125,0,255,72" HREF="http://www.dbo-boettcher.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="250,0,375,72" HREF="http://www.kraftquelle-lebensenergie.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="375,0,500,72" HREF="http://www.hotel-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="500,0,625,72" HREF="http://www.hofladen-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="625,0,750,72" HREF="http://www.bodytune-falkensee.de"
TARGET="_blanc">
</MAP>
</body>
Die Grundidee ist erstmal dieselbe wie in den
vorangegangenen Beispielen. Die zwei Bilderstreifen liegen
übereinander. Bei dem der oben liegt sorgt clip dafür,
dann nur ein Teil sichtbar ist, was dann die Konsequenz hat,
dass der untere durchschimmert. Wir sprechen jetzt den Skript
durch. Wie gesagt, ist das Verfahren bei Netscape vollkommen
anders, darauf kommen wir gleich zurück. Der Skript beginnt
schon seltsam, nämlich mit dieser Zeile.
document.onmousedown=packmich;
Das heisst, egal wo die Maus auf der Seite steht,
wenn der Mauszeiger gedrückt wird, wird die Funktion
packmich() aufgerufen. Erstaunlich ist, dass die Funktion
packmich() ohne die runden Klammern aufgerufen wird, was dann
die Konsequenz hat, dass auch keine Parameter übergeben
werden können. Dass der event handler onmousedown jetzt
nicht als Attribut eines HTML Elementes aufgerufen wird, ist
erstmal schlecht, denn so ist unklar, welches Element ihn
überhaupt aufgerufen hat. Wenn es also keine Vorteile
bringt, stellt sich die Frage, warum man den event handler
nicht wie üblich als Attribut eines Elementes deklariert.
Also etwas in der Art macht.
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:400;}
#ruebe{position:absolute; top:10;left:10;width:400;height:400;z-Index=1;}
</style>
<script language=javascript>
function packmich()
{
start=event.clientX;
objekt = event.srcElement;
document.onmousemove=bewegen;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
function bewegen()
{
if(objekt)
{
schauen=event.clientX;
a=start+schauen-start;
b=a-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function beenden()
{
objekt=false;
}
</script>
</head>
<body>
<div id="ruebe" style="clip:rect(0 125 72
0)"; onmousedown=packmich(); onmouseup=beenden();><img
src=film1a.jpg usemap="#bild" border=0></div>
<div id="karotte" onmousedown=packmich(); onmouseup=beenden();><img
src=film2a.jpg></div>
<MAP NAME="bild">
<AREA SHAPE=RECT COORDS="0,0,125,72" HREF="http://www.bodyline-pur.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="125,0,255,72" HREF="http://www.dbo-boettcher.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="250,0,375,72" HREF="http://www.kraftquelle-lebensenergie.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="375,0,500,72" HREF="http://www.hotel-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="500,0,625,72" HREF="http://www.hofladen-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="625,0,750,72" HREF="http://www.bodytune-falkensee.de"
TARGET="_blanc">
</MAP>
</body>
</html>
Löst man diesen Skript aus, passiert genau
das gleiche, wie man sieht, wenn man hier
clickt. Wie also deutlich zu erkennen, lassen sich die event
handler onmousedown, die die Funktion packmich() aufruft und
onmouseup, die das ganze stoppt, auch als Attribut des HTML
Elementes deklarieren, allerdings müssen diese beiden
Elemente in beide Bereiche integriert werden, da die Maus
ja sowohl auf den unteren wie auf den darüber liegenden
div gesetzt werden kann. Anders verhält es sich mit onmousemouve,
der die Funktion bewegen aufruft, womit dann bewiesen wäre,
dass der Aufruf eines event handlers als Objekt von document
unter Umständen Sinn macht. Die Funktion bewegen() kann
nur richtig arbeiten, wenn das Objekt, das sie bewegen soll,
vorher initialisiert wurde. Man muss also eine Möglichkeit
haben, dafür zu sorgen, dass sie nur aufgerufen wird,
wenn das Objekt bereits initialisiert wurde. Würde man
die Funktion bewegen() via onmousemove als Attribut des HTML
Elementes deklarieren, dann würde sie aufgerufen, sobald
der User die Maus über den Bildstreifen bewegt, also
bevor das Objekt überhaupt initialisiert wurde. Man würde
einen Fehler erhalten. So wie der Skript geschrieben ist,
ruft der event handler onmousedown erstmal die Funktion packmich()
auf, diese initialisiert das Objekt objekt in der Zeile
objekt = event.srcElement;
Leider ist diese Zeile auch schon wieder erklärungsbedürftig.
Ab dem Internet Explorer 4+ wird beim Aufruf eines event handlers
ein Objekt generiert, das folgende Eigenschaften hat.
| event.srcElement |
das Objekt, dass den event
handler aufgerufen hat. Das ist hier erklärungsbedürftig,
da zumindest im vorletzten Skript kein HTML Element
den event handler als Attribut hatte, man sich folglich
fragen kann, woher ein Wert kommen soll. Das Verfahren
ist nun so, dass der Explorer bei jedem event (click,
mousedown, mousemove etc.) prüft, ob entweder für
das Element selbst oder für ein übergeordnetes
Element für dieses event eine Funktion deklariert
wurde. Der Explorer wandert also solange nach oben,
bis er entweder was findet oder eben nicht. Das Element
aber, von dem aus mit der Suche gestartet wurde, wird
aber weitergereicht und kann mit event.srcElement abgefangen
werden
|
event.clientX
event.clientY |
Ermittelt den x bzw. den y
Wert des Mauszeigers zum Zeitpunkt des Auftretens des
events. |
Wie bereits gesagt, interessieren wir uns in
diesem Beispiel weniger für ein konkretes Objekt, den
wir steuern unser div mit getElementById an, als für
die Tatsache, dass ein solches überhaupt existiert. Es
existiert, nachdem mit onmousedown die Funktion packmich aufgerufen
wurde, die ein Objekt generiert. Dieses Objekt existiert bis
mit onmouseup die Funktion beenden() aufgerufen wurde, die
mit
objekt=false; das Objekt löscht. objekt
ist in unserem Beispiel lediglich ein flag, eine Variable,
die zur Programmsteuerung dient. Wir werden weiter unten das
Durchreichen von HTML Elementen nochmal diskutieren. Wie bereits
erwähnt, ist unter Netscape das Verfahren ein anderes.
Wir diskutieren nur den Ansatz von Netscape 6+, in der Hoffnung,
dass sich Netscape 4.XX mit seinem veralteten Modell, welches
auch Netscape 6+ nicht mehr unterstützt, allmählich
vom Markt verabschiedet. Der Skript unten, setzt das
auf den Schirm, also genau das gleiche, was auch die Programme
vorher gemacht haben, allerdings jetzt für und nur Netscape
6+. Das gleiche Programm für Netscape sieht dann so aus.
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:400;}
#ruebe{position:absolute; top:10;left:10;width:400;height:400;z-Index=1;}
</style>
<script language=javascript>
document.onmousedown=packmich;
function packmich(e)
{
start=e.pageX;
objekt =true;
document.onmousemove = bewegen;
document.onmouseup = beenden;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
return false;
}
function bewegen(e)
{
if(objekt)
{
schauen=e.pageX;
a=start+schauen-start;
b=a-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function beenden()
{
objekt=false;
}
</script>
</head>
<body>
<div id="ruebe" style="clip:rect(0 125 72
0);z-Index:1"><img src=film1a.jpg usemap="#bild"
border=0></div>
<div id="karotte"><img src=film2a.jpg></div>
<MAP NAME="bild">
<AREA SHAPE=RECT COORDS="0,0,125,72" HREF="http://www.bodyline-pur.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="125,0,255,72" HREF="http://www.dbo-boettcher.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="250,0,375,72" HREF="http://www.kraftquelle-lebensenergie.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="375,0,500,72" HREF="http://www.hotel-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="500,0,625,72" HREF="http://www.hofladen-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="625,0,750,72" HREF="http://www.bodytune-falkensee.de"
TARGET="_blanc">
</MAP>
</body>
</html>
In beiden Varianten wird also mit Hilfe von
document.onmousedown=packmich;
die Funktion packmich() aufgerufen. Allerdings
ergibt sich jetzt ein Unterschied. Bei Netscape wird bei einem
Aufruf einer Funktion Eigenschaft von Dokument (siehe oben)
ein Objekt mitgeliefert, das einige Informationen enthält,
über die Art, wie dieses event aufgerufen wurde und auch,
was es überhaupt für ein event ist. Wir brauchen
für unser Beispiel nur e.pageX, also den horizontalen
Abstand zur linken Begrenzung des Dokumentes. Der Rest des
Skriptes ist unverändert, bis auf die Tatsache, dass
wir der Variablen Objekt kein Objekt zuweisen sondern nur
den Wert true, den wir unten wieder auf false stellen. Wie
bereits erwähnt, handelt es sich bei dieser Variablen
(in diesem Beispiel) lediglich um einen flag. Um diesen Skript
cross Browser kompatibel zu machen, muss man also lediglich
dafür sorgen, dass für Netscape mit dieser
start=event.clientX;
Zeile gearbeitet wird und für Netscape
6+ mit dieser
start=e.pageX;
Wenn wir den Netscape 4.XX nicht berücksichtigen,
was wir ja tatsächlich nicht tun werden, ist die Lösung
einfach und sieht so aus.
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:400;}
#ruebe{position:absolute; top:10;left:10;width:400;height:400;z-Index=1;}
</style>
<script language=javascript>
document.onmousedown=packmich;
function packmich(e)
{
if(document.all)
{
start=event.clientX;
}
else
{
start=e.pageX;
}
objekt =true;
document.onmousemove = bewegen;
document.onmouseup = beenden;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
return false;
}
function bewegen(e)
{
if(objekt)
{
if(document.all)
{
schauen=event.clientX;
}
else
{
schauen=e.pageX;
}
a=start+schauen-start;
b=a-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function beenden()
{
objekt=false;
}
</script>
</head>
<body>
<div id="ruebe" style="clip:rect(0 125 72
0);z-Index:1"><img src=film1a.jpg usemap="#bild"
border=0></div>
<div id="karotte"><img src=film2a.jpg></div>
<MAP NAME="bild">
<AREA SHAPE=RECT COORDS="0,0,125,72" HREF="http://www.bodyline-pur.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="125,0,255,72" HREF="http://www.dbo-boettcher.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="250,0,375,72" HREF="http://www.kraftquelle-lebensenergie.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="375,0,500,72" HREF="http://www.hotel-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="500,0,625,72" HREF="http://www.hofladen-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="625,0,750,72" HREF="http://www.bodytune-falkensee.de"
TARGET="_blanc">
</MAP>
</body>
</html>
Auch das funktionniert, und zwar mit beiden
Browsern, dem Explorer 4+ und Netscape 6+, wovon wir uns überzeugen
können, wenn wir hier
clicken. Die Vorgehensweise ist simpel. document.all, was
ja wie bekannt durch document.getElementById ersetzt werden
kann, kennt nur der Explorer. Wenn wir also etwas in der Art
schreiben
if(document.all)
{
start=event.clientX;
}
else
{
start=e.pageX;
}
heisst das, dass sich der Explorer die Position
des Mauszeigers (respektive den horizontalen Abstand zum linken
Rand des Dokumentes) in der Eigenschaft clientX des event
Objektes merkt, Netscape hingegen in der Eigenschaft pageX
des e Objektes, wobei e auch umbenannt werden kann. Zwischen
event und e gibt es allerdings einen Unterschied. Während
der Explorer das Objekt event immer produziert, unabhängig
davon, ob das event als als Attribut eines HTML Elementes
ausgelöst wurde oder nicht, ist e nur vorhanden, wenn
das event als Methode von document ausgelöst wurde. In
diesem Fall kann man den Skript auch mit diesem Ansatz cross
browser kompatibel machen.
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:400;}
#ruebe{position:absolute; top:10;left:10;width:400;height:400;z-Index=1;}
</style>
<script language=javascript>
document.onmousedown=packmich;
function packmich(e)
{
event=e;
start=event.clientX;
objekt =true;
document.onmousemove = bewegen;
document.onmouseup = beenden;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
return false;
}
function bewegen(e)
{
event=e;
if(objekt)
{
schauen=event.clientX;
a=start+schauen-start;
b=a-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function beenden()
{
objekt=false;
}
</script>
</head>
<body>
<div id="ruebe" style="clip:rect(0 125 72
0);z-Index:1" onmousedown=packmich() ><img src=film1a.jpg
usemap="#bild" border=0></div>
<div id="karotte"><img src=film2a.jpg></div>
<MAP NAME="bild">
<AREA SHAPE=RECT COORDS="0,0,125,72" HREF="http://www.bodyline-pur.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="125,0,255,72" HREF="http://www.dbo-boettcher.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="250,0,375,72" HREF="http://www.kraftquelle-lebensenergie.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="375,0,500,72" HREF="http://www.hotel-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="500,0,625,72" HREF="http://www.hofladen-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="625,0,750,72" HREF="http://www.bodytune-falkensee.de"
TARGET="_blanc">
</MAP>
</body>
</html>
Wenn man sich den unten stehenden Schnipsel
ansieht, wird deutlich, was gemacht wurde.
document.onmousedown=packmich;
function packmich(e)
{
event=e;
start=event.clientX;
objekt =true;
document.onmousemove = bewegen;
document.onmouseup = beenden;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
return false;
}
e (Netscape) und event (explorer) meinen
dasselbe Objekt, ein Objekt nämlich, dass die Eigenschaften
des events hält. Besonders pfiffig ist nun, dass Netscape
nicht nur e.pageX versteht sondern auch event.clientX versteht.
Da e und event das gleiche ist, können wir der Varianbe
e das event Objekt zuweisen.
| Das
Event an ein HTML Element binden |
|
Unsere Programme hatten bis jetzt einen kleinen
Schönheitsfehler. Es war egal, wo das event mousedown
durchgeführt wurde, es funktionnierte immer. Das kann
man wollen, z.B. bei dem berühmten Beispiel, wo zwei
Augen den Mauszeiger verfolgen. Man kann das aber auch nicht
wollen. Man kann wollen, das ein Aktion nur ausgeführt
wird, wenn der Mauszeiger über einem bestimmten Element
sitzt. Netscape hat für die Lösung dieses Problems
eine neue Funktion, nämlich addEventListener, die allerdings
der Explorer nicht unterstützt. Ob der Explorer sie irgendwann
auch unterstützten wird, oder ob sie wieder verschwindet,
wissen wir nicht. Auf jeden Fall können wir mit dieser
Funktion dafür sorgen, dass das Ereignis nur ausgeführt
wird, das das Ereignis nur ausgeführt wird, wenn der
Mauszeiger über dem Bildstreifen steht. Wir werden nachher
noch eine Lösung vorstellen, die ohne diese Funktion
auskommt.
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:400;}
#ruebe{position:absolute; top:10;left:10;width:400;height:400;}
</style>
<script language=javascript>
document.onmousedown=clear;
function initio()
{
document.getElementsByTagName("img")[1].addEventListener("mousedown",packmich,true);
document.getElementsByTagName("div")[0].firstChild.addEventListener("mousedown",packmich,false);
return false;
}
function clear()
{
return false;
}
function packmich(e)
{
event=e;
start=event.clientX;
objekt =true;
document.onmousemove = bewegen;
document.onmouseup = beenden;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
return false;
}
function bewegen(e)
{
event=e;
if(objekt)
{
schauen=event.clientX;
a=start+schauen-start;
b=a-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function beenden()
{
objekt=false;
}
</script>
</head>
<body onload=initio()>
<div id="karotte"><img src="film2a.jpg"></div>
<div id="ruebe" style="clip:rect(0 125 72
0);z-Index:1"><img src="film1a.jpg"></div>
</body>
</html>
Man kann sich davon überzeugen, dass das
funktionniert, indem man hier
clickt. Allerdings funktionniert es, wie bereits erwähnt,
nur mit Netscape 6+, so
dass wir nur wenig Freude an dieser Erkenntnis haben. Auf
jeden Fall sind die entscheidenden Zeilen diese hier.
document.onmousedown=clear;
function initio()
{
document.getElementsByTagName("img")[1].addEventListener("mousedown",packmich,true);
document.getElementsByTagName("div")[0].firstChild.addEventListener("mousedown",packmich,false);
return false;
}
function clear()
{
return false;
}
Die Funktion initio() wird über
onload aufgerufen. Ein explizites Aufrufen der Funktion addEventListener
ist nötig, da sonst die divs, auf die diese Funktion
zielt, zu dem Zeitpunkt, als sie initialisiert wird, nicht
vorhanden sind. Auch diese Funktion liefert ein Objekt, dass
bestimmte Eigenschaften zum aufgetretenen Event speichert.
Mit
document.getElementsByTagName("img")[1]
teilen wir mit, an welches Element wir den event
listener binden wollen. In diesem Falle also an das zweite
Bild. Wir haben jetzt ein kleines Problem, das darin besteht,
dass wir nur auf nicht abgedeckten Bereichen eine Mausaktion
ausführen können. Ein Teil unseres Filmstreifens
ist aber vom darüberliegenden abgedeckt, so dass wir
die Aktion nicht mehr ausführen können, wenn der
Teilbereich das darüberliegenden Bildes den unteren Bereich
bedeckt. Folglich muss auch für das darüberliegende
Bild ein addeventlistener definiert werden, was wir mit
document.getElementsByTagName("div")[0].firstChild
dann auch tun. Wir haben das aus didaktischen
Gründen etwas komplizierter gemacht, als nötig wäre.
Wir können nicht mit dem div arbeiten, da dieser ja eine
Höhe von 400 Pixel und eine Breite von ebenfalls 400
Pixel hat, was die Konsequenz hätte, dass über der
ganzen zu grossen Fläche die Aktion mousedown wirksam
wäre. Wir wollen also auch hier das Bild haben und das
Bild ist das erste Kind unseres div. Die Funktion clear brauchen
wir, um zu verhindern, dass das Bild bei drücken der
Maustaste und ziehen der Maus markiert wird, was ja das normale
Verhalten von Netscape ist. Bei dem Bild wiederum gibt es
das Problem nicht, dieses ist halt so gross, wie es ist. Der
Rest ist dann wie in den Beispielen vorher. Für den Explorer
isoliert wäre es auch nicht besonders schwierig, das
Beispiel so umzugestalten, dass ein Verschieben der Website
nur möglich ist, wenn direkt auf die Bilderleiste geklickt
wird. Das sähe dann so aus. (Nochmal zur Wiederholung:
Bei Netscape funktionniert das nicht, weil Netscape uns nicht
die Eigenschaften des events liefert, wenn es als Attribut
eines HTML Elementes aufgerufen wird, wir können also
nicht feststellen, wo der Mauszeiger war, als die Maustaste
gedrückt wurde). Für den Explorer lässt sich
das so lösen.
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:74;}
#ruebe{position:absolute; top:10;left:10;width:400;height:74;z-Index=1;}
</style>
<script language=javascript>
function packmich()
{
start=event.clientX;
objekt = event.srcElement;
document.onmousemove=bewegen;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
function bewegen()
{
if(objekt)
{
schauen=event.clientX;
a=start+schauen-start;
b=a-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function beenden()
{
objekt=false;
}
</script>
</head>
<body>
<div id="ruebe" style="clip:rect(0 125 72
0)"; ><img src=film1a.jpg usemap="#bild"
border=0 onmousedown=packmich(); onmouseup=beenden();></div>
<div id="karotte"><img src=film2a.jpg onmousedown=packmich();
onmouseup=beenden();></div>
<MAP NAME="bild">
<AREA SHAPE=RECT COORDS="0,0,125,72" HREF="http://www.bodyline-pur.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="125,0,255,72" HREF="http://www.dbo-boettcher.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="250,0,375,72" HREF="http://www.kraftquelle-lebensenergie.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="375,0,500,72" HREF="http://www.hotel-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="500,0,625,72" HREF="http://www.hofladen-falkensee.de"
TARGET="_blanc">
<AREA SHAPE=RECT COORDS="625,0,750,72" HREF="http://www.bodytune-falkensee.de"
TARGET="_blanc">
</MAP>
</body>
</html>
Wer dem Frieden nicht traut, kann hier
clicken. Wir rufen also als Attribut der Bilder die Funktion
packmich() auf und da das Objekt, dass die Daten zu dem Event
hält ja beim Explorer immer vorhanden ist, haben wir
auch Werte für a und b. Da hier das Event an die Bilder
gebunden ist, tritt es auch nur im Zusammenhang mit diesen
auf. Nun haben wir das Problem für jeden einzelnen Browser
gelöst, stellt sich nur noch die Frage, wie löst
man es für beide zusammen. Ein Skript, der tatsächlich
den Effekt nur produziert, wenn sich die Maus über der
Bildleiste befindet und für beide Browser funktionniert
sieht so aus.
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:74;}
#ruebe{position:absolute; top:10;left:10;width:400;height:74;z-Index=1;}
</style>
<script language=javascript>
if(!document.all)
{
document.onmousedown=clear;
}
function packmich()
{
if(!document.all)
{
document.getElementsByTagName("img")[1].addEventListener("mousedown",packmich2,true);
document.getElementsByTagName("div")[0].firstChild.addEventListener("mousedown",packmich2,true);
}
else
{
document.onmousedown=packmich2;
}
}
function clear()
{
return false;
}
function packmich2(e)
{
if (!document.all){event=e;}
start=event.clientX;
objekt =true;
document.onmousemove=bewegen;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
function bewegen(e)
{
if (!document.all){event=e;}
if(objekt)
{
schauen=event.clientX;
a=start+schauen-start;
b=a-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function beenden()
{
objekt=false;
document.onmousedown=clear;
}
</script>
</head>
<body>
<div id="karotte"><img src=film2a.jpg onmousedown=packmich();
onmouseup=beenden();></div>
<div id="ruebe" style="clip:rect(0 125 72
0)" ><img src=film1a.jpg border=0 onmousedown=packmich();
onmouseup=beenden();></div>
</body>
</html>
Dass das funktionniert kann man überprüfen,
indem man hier
clickt.
| event
handler auf das gesamte Dokument auf ein Objekt begrenzen |
|
Bis jetzt wurden alle Skripte so geschrieben,
dass der event handler an ein bestimmtes, in diesem Falle
ein den img tag, HTML Element gebunden waren. Damit war dann
sicher gestellt, dass die Aktion nur ausgeführt wurde,
wenn der Mauszeiger über diesem Element stand. Man könnte
auch anders vorgehen. Man könnte das event an das gesamte
Dokument binden, aber es nachträglich auf ein HTML Element
beschränken. Das geht relativ einfach mit dem Internet
Exploder und sieht so aus.
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:74;}
#ruebe{position:absolute; top:10;left:10;width:400;height:74;z-Index=1;}
</style>
<script language=javascript>
document.onmousedown=packmich;
document.onmouseup=beenden;
function packmich()
{
objekt=event.srcElement.id;
if(objekt =="himbeere")
{
document.onmousemove=bewegen;
start=event.clientX;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function bewegen()
{
if(objekt)
{
schauen=event.clientX;
a=start+schauen-start;
b=a-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function beenden()
{
objekt=false;
}
</script>
</head>
<body>
<div id="karotte"><img src=film2a.jpg id="himbeere"></div>
<div id="ruebe" style="clip:rect(0 125 72
0)" ><img src=film1a.jpg border=0 id="himbeere"></div>
</body>
</html>
Wie üblich, kann man nachprüfen, ob
das funktionniert, indem man hier
clickt. Das Beispiel funktionniert nur mit dem Internet Explorer.
Wie deutlich zu erkennen, werden die Funktionen nicht über
die HTML Elemente angesteuert. Sie werden gestartet, von even
handlern, die für das gesamte Dokument gültig sind.
document.onmousedown=packmich;
document.onmouseup=beenden;
Enstscheidend ist nun diese Zeile
objekt=event.srcElement.id;
Hier wird abgefangen, als Eigenschaft des event
Objektes, welches alle möglichen Eigenschaften über
das event speichert, wo es aufgetreten ist. In diesem Fall
fangen wir die id ab, die in unserem Falle himbeere heisst.
Damit ist die Sache relativ einfach. Wenn die id Himbeere
ist, heisst das, dass sich die Maus über den Bildstreifen
befand. Ist dies der Fall, lösen wir, schieben wir die
Funktion bewegen an.
objekt=event.srcElement.id;
if(objekt =="himbeere")
{
document.onmousemove=bewegen;
start=event.clientX;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
die Funktion bewegen() ist also solange aktiv,
wie das objekt Himbeere ist. Lässt der User irgendwo
auf der Seite die Maustaste los, stellen wir objekt auf false,
wass dann bewirkt, dass die Funktion bewegen() nichts mehr
tut. Soweit zum Internet Explorer. Wie geht das mit Netscape
? Wohl wissend, dass das keiner glaubt, sind die Konzepte
hier bei Netscape 6+ und Explorer 6+ ähnlich. Mit einer
nur minimalen Änderung, kann man den Skript in beiden
Browsern zum Laufen bringen.
<html><head><title>test</title>
<style type="text/css">
#karotte{position:absolute; top:10;left:10;width:400;height:74;}
#ruebe{position:absolute; top:10;left:10;width:400;height:74;z-Index=1;}
</style>
<script language=javascript>
document.onmousedown=packmich;
document.onmouseup=beenden;
function packmich(e)
{
if(!document.all)
{
event=e;
objekt=e.target.id;
}
else
{
objekt=event.srcElement.id;
}
if(objekt =="himbeere")
{
document.onmousemove=bewegen;
start=event.clientX;
a=start;
b=start-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function bewegen(e)
{
if(objekt)
{
if(!document.all){event=e;}
schauen=event.clientX;
a=start+schauen-start;
b=a-125;
document.getElementById("ruebe").style.clip="rect(0"+"
"+a+" "+"72"+" "+b+")";
}
return false;
}
function beenden()
{
objekt=false;
}
</script>
</head>
<body>
<div id="karotte"><img src=film2a.jpg id="himbeere"></div>
<div id="ruebe" style="clip:rect(0 125 72
0)" ><img src=film1a.jpg border=0 id="himbeere"></div>
</body>
</html>
Dass auch das funktionniert, kann man überprüfen,
indem man hier
clickt. Verändert haben wir lediglich diesen Teil.
if(!document.all)
{
event=e;
objekt=e.target.id;
}
else
{
objekt=event.srcElement.id;
}
Im Gegensatz zum Explorer, der das Objekt unter
dem event mit event.scrElement.id abgreift, macht Netscape
das mit e.target.id. Das ist also das einzige, was wir verändern
müssen.
|
 |