Moin zusammen,
entschuldigt, wenn ich ein wenig insistiere - ich möchte einfach
nicht glauben, daß das so schwierig zu verstehen ist, es sind doch
lediglich ein paar Schleifchen und ein flag. Ich mach' mal noch einen
Versuch:
In einem Menu gibt's beliebig viele tags, die jeweils zwo images
enthalten, die beim mouseovern ausgetauscht werden sollen, und beim
mousouten wieder zurück.
Desweiteren sollen beim clicken die ausgetauschten Bilder stehenbleiben
und alle andern wieder in die Normalstellung zurückkehren.
Also:
<irgendeintag><img><img></irgendeintag>
Um die tags, die's betrifft, zu kennzeichnen, ordnen wir denen eine
class zu:
<irgendeintag class=m><img><img></irgendeintag>
und auch den betreffenden images:
<irgendeintag class=m><img class=o><img class=o></irgendeintag>
ach ja, und die srcs:
<irgendeintag class=m><img class=o src=../bilder/bild_1_1.jpg><img class=o src=../bilder/bild_1_2.jpg></irgendeintag>
Der Ordner bilder enthält nun zwo Dateien:
bild_1_1.jpg
bild_1_2.jpg
und weil wir jeweils noch ein Bild zum Austauschen brauchen, tun wir die auch noch dazu:
bild_1_1_o.jpg
bild_1_2_o.jpg
macht summa summarum für jeden tag, der zwo images enthält, deren srcs ausgetauscht werden sollen, Stücker vier.
Ordner Bilder enthält jetzt:
bild_1_1.jpg
bild_1_2.jpg
bild_1_1_o.jpg
bild_1_2_o.jpg
Ein html-text mit rudimentärem Menu könnte zB. so aussehen:
<html>
<head>
<title>menu</title>
<style>
.m{ display:block;
width:200px;
}
img.o{ width:40px;
height:40px;
}
</style>
<script>
</script>
</head>
<body>
<div class=m>
<img class=o src=../bilder/bild_1_1.jpg>
<img class=o src=../bilder/bild_1_2.jpg>
</div>
<a class=m href=#>
<img class=o src=../bilder/bild_2_1.jpg>
<img class=o src=../bilder/bild_2_2.jpg>
</a>
<i class=m>
<img class=o src=../bilder/bild_3_1.jpg>
<img class=o src=../bilder/bild_3_2.jpg>
</i>
<tt class=m>
<img class=o src=../bilder/bild_4_1.jpg>
<img class=o src=../bilder/bild_4_2.jpg>
</tt>
</body>
</html>
Damit wir nicht alles und jedes x-mal in diesen Quelltext reinschreiben müssen,
weisen wir beim Laden der Seite ( also onload ) allen tags alle Eigenschaften zu,
die wir uns von ihnen wünschen.
Wir notieren also im script-tag munter:
onload = function() {
}
Praktischerweise sind alle html-tags einer Datei im javascript-Array
document.getElementsByTagName('*')
abgebildet.
Um aus dieser Menge alle die rauszufischen, deren className == 'm' ist, und sie
von allen anderen zu separieren, sagt man
for( var i in T = document.getElementsByTagName('*') )
if( T[i].className == 'm' ) M.push( T[i] )
Selbstverständlich haben wir uns, pfiffig, wie wir sind, vorher eine temporäre
Variable T (die hat wirklich ausschließlich den Daseinszweck, temporär zu sein,
und sonst gar nichts), sowie ein Array M angelegt, also:
onload = function() { var T, M = []
for( var i in T = document.getElementsByTagName('*') )
if( T[i].className == 'm' ) M.push( T[i] )
}
Das Array M enthält nach dem Laden der Datei alle tags, deren className == 'm' ist.
Ähnlich verhält es sich mit den images einer Datei.
Die sind nämlich allesamt im javascript-Array
document.images
abgebildet.
Wir weisen jetzertle allen images, deren className == 'o' ist, zwo Eigenschaften zu,
nämlich die src des Normalzustandes, und die src zum Austauschen:
var e = '.jpg'
for( var i in T = document.images )
if( T[i].className == 'o' ) { T[i].n = T[i].src
T[i].o = T[i].src.replace(e, '_o' + e) }
Weil wir es so eingerichtet haben, daß die beiden srcs sich lediglich durch das
angehängte _o unmittelbar vor dem Namen des Dateityps unterscheiden, brauchen
wir nur die Dateiendung ( hier: .jpg ) durch _o.jpg zu ersetzen.
Jedes image hat jetzt eine Eigenschaft n (zB. '..bilder/bild_1_1.jpg') und eine
Eigenschaft o (zB. '..bilder/bild_1_1_o.jpg')
Also :
<script>
var e = '.jpg'
onload = function() { var T, M = []
for( var i in T = document.getElementsByTagName('*') )
if( T[i].className == 'm' ) M.push( T[i] )
for( var i in T = document.images )
if( T[i].className == 'o' ) { T[i].n = T[i].src
T[i].o = T[i].src.replace(e, '_o' + e) }
}
</script>
Zu guter Lechz sagen wir den tags mit dem className == 'm', die sich ja alle im Array M
zusammengefunden haben, wie sie sich zu benehmen haben:
for( var i in M )
{ M[i].onmouseover = function(){ }
M[i].onmouseout = function(){ }
M[i].onclick = function(){ }
}
Jedes tag mit dem className == 'm' hat sogenannte childNodes, von denen uns aber
ausschließlich diejenigen interessieren, deren className == 'o' ist, das sind die
images, deren srcs ausgetauscht werden sollen. Wir schreiben eine kleine Hilfsfunction,
die uns diese childNodes herauspickt und ihnen eine src zuweist, von der wir ja noch
wissen, daß diese eine Eigenschaft eben jener childNode ist, nämlich 'n' oder 'o':
S = function (s, ss){ for ( var i in s = s.childNodes )
if( s[i].className == 'o' ) s[i].src = s[i][ss] }
um nun zB. beim mouseover die srcs zu tauschen, rufen wir diese Hilfsfunction:
M[i].onmouseover = function(){ S( this, 'o') }
Das this bezieht sich auf M[i], also den tag mit dem className == 'm', der die
zwei images umschließt, und deren srcs werden nun deren Eigenschaften o zugewiesen,
die wiederum auf die Dateien mit den Austauschbildern verweisen.
Genauso beim mouseout:
M[i].onmouseout = function(){ S( this, 'n') }
Wir haben also bisher:
<script>
var e = '.jpg'
onload = function() { var T, M = [],
S = function (s, ss){ for ( var i in s = s.childNodes )
if( s[i].className == 'o' ) s[i].src = s[i][ss] }
for( var i in T = document.getElementsByTagName('*') )
if( T[i].className == 'm' ) M.push( T[i] )
for( var i in T = document.images )
if( T[i].className == 'o' ) { T[i].n = T[i].src
T[i].o = T[i].src.replace(e, '_o' + e) }
for( var i in M )
{ M[i].onmouseover = function(){ S( this, 'o') }
M[i].onmouseout = function(){ S( this, 'n') }
M[i].onclick = function(){ }
}
}
</script>
Nun sollen bei einem onclick die Bilder stehen bleiben, d.h., sie sollen
beim mouseout nicht wieder zurückgetauscht werden.
Wir geben zur Lösung dieser Aufgabe jedem tag mit dem className == 'm' eine
Eigenschaft mit dem Namen act, in der gespeichert werden kann, ob er denn nun
angeclickt wurde oder eben nicht.
Zu Anfang wurde nichts angeclickt, also wird die Eigenschaft act für alle
tags mit dem className == 'm' auf den Wert 1 gesetzt.
M[i].act = 1
Solange dieser Wert 1 bleibt, geht das mouseovern und das mouseouten ganz normal
vonstatten.
Sobald aber ein tag mit dem className == 'm' angeclickt wird, ändert sich
seine Eigenschaft act, sie wird auf 0 gesetzt, und beim mouseovern und -outen
findet gar nichts statt.
Das sieht scripttechnisch dann so aus:
<script>
var e = '.jpg'
onload = function() { var T, M = [],
S = function (s, ss){ for ( var i in s = s.childNodes )
if( s[i].className == 'o' ) s[i].src = s[i][ss] }
for( var i in T = document.getElementsByTagName('*') )
if( T[i].className == 'm' ) M.push( T[i] )
for( var i in T = document.images )
if( T[i].className == 'o' ) { T[i].n = T[i].src
T[i].o = T[i].src.replace(e, '_o' + e) }
for( var i in M )
{ M[i].act = 1
M[i].onmouseover = function(){ if( this.act ) S( this, 'o') }
M[i].onmouseout = function(){ if( this.act ) S( this, 'n') }
M[i].onclick = function(){ if( this.act ) this.act = 0 }
}
}
</script>
Wenn ein tag mit dem className == 'm' angeclickt wurde, hat seine Eigenschaft act den
Wert 0.
Danach wird vielleicht ein andrer tag mit dem className == 'm' angeclickt werden. Nun
soll dessen Eigenschaft act 0 sein, die des ersteren aber wieder auf 1 gesetzt werden,
und auch die images dieses ersteren sollen wieder in den Normalzustand zurückgesetzt
werden. Wir müssen der function M[i].onclick also noch ein bissel hinzufügen:
M[i].onclick = function(){ if( this.act ) { for( var i in M )
if ( !M[i].act ) { M[i].act = 1
S( M[i], 'n') }
this.act = 0
}
!M[i].act
bedeutet:
M[i].act hat den Wert 0 oder zB. false, auf gut Deutsch: M[i].act ist nicht.
for( var i in M )
if ( !M[i].act ){ }
bedeutet:
Suche aus der Menge aller tags mit dem className == 'm' denjenigen, dessen Eigenschaft act == 0 ist.
Und
for( var i in M )
if ( !M[i].act ) { M[i].act = 1
S( M[i], 'n') }
bedeutet:
Wenn Du das Ding gefunden hast, dann setze dessen Eigenschaft act wieder auf 1 und tausche
die srcs seiner images wieder auf normal ( das macht wieder mal die Hilfsfunction S() )
Wir fügen noch ein blurmiges
if( this.blur ) this.blur()
ein. Das hat mit der eigentlichen Funktionalität nichts am Hut, beseitigt aber zB. im IE
die blöden gestrichelten Rahmen, die beim anclicken eines links entstehen, also - tutti frutti- :
<html>
<head>
<title>menu</title>
<style>
.m{ display:block;
width:200px;
}
img.o{ width:40px;
height:40px;
}
</style>
<script>
var e = '.jpg'
onload = function(){ var T, M = [],
S = function (s, ss){ for ( var i in s = s.childNodes )
if( s[i].className == 'o' ) s[i].src = s[i][ss] }
for( var i in T = document.getElementsByTagName('*') )
if( T[i].className == 'm' ) M.push( T[i] )
for( var i in T = document.images )
if( T[i].className == 'o' ) { T[i].n = T[i].src
T[i].o = T[i].src.replace(e, '_o' + e) }
for( var i in M )
{ M[i].act = 1;
M[i].onmouseover = function(){ if( this.act ) S( this, 'o') }
M[i].onmouseout = function(){ if( this.act ) S( this, 'n') }
M[i].onclick = function(){ if( this.act ) { for( var i in M )
if ( !M[i].act ) { M[i].act = 1
S( M[i], 'n') }
this.act = 0
if( this.blur ) this.blur() } } } }
</script>
</head>
<body>
<div class=m>
<img class=o src=../bilder/bild_1_1.jpg>
<img class=o src=../bilder/bild_1_2.jpg>
</div>
<a class=m href=#>
<img class=o src=../bilder/bild_2_1.jpg>
<img class=o src=../bilder/bild_2_2.jpg>
</a>
<i class=m>
<img class=o src=../bilder/bild_3_1.jpg>
<img class=o src=../bilder/bild_3_2.jpg>
</i>
<tt class=m>
<img class=o src=../bilder/bild_4_1.jpg>
<img class=o src=../bilder/bild_4_2.jpg>
</tt>
</body>
</html>
Das war's dann auch schon.
Ist das tatsächlich so schwierig ?
gruß
matho