Hallo Frank.
Wie Brand schon sagte klappt es wirklich mit einer Variablen im "onClick-Event". Ich habe zufällig vor ein paar Tagen genau das gleiche Problem gehabt und folgende Lösung gefunden:
(Ist bei mir zwar mit Layern gelöst, aber das Prinzip müßte auch mit einem 'normalrn' mouseOver-Effekt funktionieren.)
Folgende Variablen mußt du am Anfang initialisieren, sonst geht das alles nicht... von wegen der Globalität und so *smiles* Ich setze mal voraus, daß du dich mit der Handhabung von Variablen und warum sie manchmal Initialisiert werden müssen auskennst.
// "layeralt" speichert den überfahrenen layer, der beim überfahren verschwindet
// Du kannst diese Variable später auch mit Arrayelementen füllen.
var layeralt;
// "altlayer" brauchst du nur, falls du deine zu tauschenden Elemente über Arrays ansprichst.
// Du benutzt sie, um "layeralt" einen Startwert zu verpassen.
// Dann aber erst, wenn das Array schon mit Elementen gefüllt ist.
// (Z.B. in einer Initialisierungsfunktion, die du über "onLoad" im Body-Tag aufrufst.)
// So setzt du sie dann ein: layeralt = layer_[altlayer];
// Für "Startwert" schreibst du eine echte Zahl,
// eben den den Index des Arrayelements des ersten angezeigten Layers
// Natürlich kannst du dir diese Variable auch sparen,
// indem du deinen Startwert direkt in die eckigen Klammern schreibst.
// Also so: layeralt = layer_[Startwert];
// Die Variable "altlayer" macht aber Sinn, wenn du sie mehr als einmal in deinem Script benötigst.
// (Z.B. nochmal in einer Funktion, wo du alles auf den Ausgangszustand zurücksetzt.
var altlayer = Startwert;
// Jetzt folgen drei Funktionen, die den Effekt steuern.
// Sie sind sowohl im Internetexplorer (ie),
// wie auch im Netscape (ns) zu verwenden.
// Die Funktion "wechsel" rufst du über das "onMouseover" Event auf.
// Sie tauscht den überfahrenen Layer, gegen den, den du als "layerindex" übergibst.
// Z.B. wenn du deine zu tauschenden Elemente in einem Array gespeichert hast:
// onMouseover = "wechsel (layer_[21]);
// oder wenn du ein Element direkt über seinen Namen ansprechen willst:
// onMouseover = "wechsel (Elementname);
function wechsel (layerindex)
{
if (ns) layeralt.visibility = "hide";
if (ie) layeralt.visibility = "hidden";
if (ns) layerindex.visibility = "show";
if (ie) layerindex.visibility = "visible";
}
// Die Funktion "check" rufst du über das "onMouseout" Event auf.
// Sie prüft, ob du mit der Maus über einem anderen Layer, als dem zuletzt angezeigten warst
// und wechselt gegebenenfalls wieder auf den Layer, der angezeigt wurde,
// bevor die Maus über den neuen Layer bewegt wurde.
// Damit die Funktion den Vergleich ausführen kann, wird ihr der aktuell überfahrene Layer übergeben.
// So rufst du die Funktion auf:
// Z.B. bei Verwendung eines Array: onMouseout = "check (layer_[21])";
// Z.B. direkt über den Namen des Elements: onMouseout = "check (Elementname)";
function check (layerjetzt)
{
if(layeralt != layerjetzt)
{
if (ns) layerjetzt.visibility = "hide";
if (ie) layerjetzt.visibility = "hidden";
if (ns) layeralt.visibility = "show";
if (ie) layeralt.visibility = "visible";
}
}
// Die Funktion "festsetzen" löst dein eigentliches Problem.
// Sie speichert den angeklickten Layer in der Variablen "layeralt"
// Dadurch wird verhindert, daß die Funktion "check" ausgeführt wird,
// da in der if-Abfrage, der Funktion "check", die beiden zu vergleichenden Variablen jetzt gleich sind.
// (Warum das so ist, erkläre ich dir nach dieser Funktion in einem weiteren Text.)
// Du verwendest die Funktion "festsetzen" im Zusammenhang mit "onClick"
// Z.B. bei Verwendung eines Array: onClick = "festsetzen (layer_[21])";
// Z.B. direkt über den Namen des Elements: onClick = "festsetzen (Elementname)";
// Die if-Abfrage für den IE sieht zwar Sinnlos aus, aber ich habe dieses Script für eine Imagemap eingesetzt,
// und ich wollte, daß die Grafik neu gezeichnet wird, weil der IE angeklickte Links mit einem Rahmen versieht.
// Durch Neuzeichnen der Grafik verschwindet der aktuell angezeigte Rahmen wieder.
function festsetzen (layerklick)
{
if(ie)
{
if (ns) layerklick.visibility = "hide";
if (ie) layerklick.visibility = "hidden";
if (ns) layerklick.visibility = "show";
if (ie) layerklick.visibility = "visible";
}
layerealt = layerklick;
}
So, jetzt noch die Erklärung. Anfangs hat es bei mir auch nicht funktioniert, weil ich die Festklickvariable über komplizierte if-Abfragen in die Wechselfunktion eingebaut hatte. Nachdem es einfach nicht klappen wollte, habe ich mir den Eintritt der Ereignisse "onMouseover" und "onMouseout" über ein "alert" ausgeben lassen. Und siehe da... Beide treten beim Überfahren eines Elementes zweimal auf!!!
Das erste mal, wenn du drauf fährst, und das zweite mal, wenn der erste Layer gegen den zweiten durch die Wechselfunktion ausgetauscht wurde. Die Maus verläßt den Layer nämlich, wenn er ausgeblendet und der neue eingeblendet wird, und im Gleichen Moment tritt auch ein erneuter "onMouseover" für das neu angezeigte Element ein. Durch diesen zweiten Aufruf wird jedoch die gesammte if-Abfrage sinnlos, denn die Variablen für den Vergleich habe immer den gleichen Wert. Also bleibt nur das Auslagern in eine weitere Funktion; und das ist die Checkfunktion :-)
Ich hoffe du kannst meine Erklärungen und die Funktionen verstehen, und ich hoffe, ich habe bei der Anpassung des Scriptes zur Erklärung keine Fehler eingebaut.
Sven