Weiterverwendung eines übergebenen Wertes
Peter Knaak
- javascript
0 Gunther0 Salokin
Hallo Leute!
Kurzbeschreibung des Problems:
Mit window.name übergebe ich einen Wert an ein nachfolgendes Fenster, das diesen Wert sofort (onLoad) ausliest und in einer Funktion verwendet. Eigentlich ganz einfach. Das klappt mit Mozilla, jedoch mit IE5 nur bedingt, d.h. der Wert wird zwar übergeben, aber offenbar nicht korrekt an die nächste Funktion weitergeleitet.
Im Einzelnen:
Mittels Buttons soll man auf meiner neugestalteten Homepage zwischen verschiedenen Darstellungsarten per StyleSheet auswählen können, siehe hier: http://www.peterknaak.de/. Dazu verwende ich diese Funktion:
function swapStyle(n)
{
var StyleLinks = document.getElementsByTagName('link');
for ( var i = 0; i < StyleLinks.length; i++ )
{
if (i == n)
{
StyleLinks[i].disabled = false;
}
else
{
StyleLinks[i].disabled = true;
}
}
}
... das bezieht sich auf die im Header angegebenen StyleSheets:
<link rel="stylesheet" title="default" type="text/css" href="format0.css">
<link rel="alternate stylesheet" title="alternative" href="format1.css" type="text/css">
<link rel="alternate stylesheet" title="alternative2" href="format2.css" type="text/css">
onLoad wird immer swapStyle(1) ausgeführt, um das "default"-StyleSheet zu aktivieren. Die entsprechenden Buttons übergeben den Wert n für das jeweilige .css an die Funktion. Z.B.
<button value="default" onClick="swapStyle(2)">Alternative</button>
Das klappt auf diese Weise auch ganz wunderbar mit Mozilla und IE5.
Jetzt soll aber der eingestellte Style nicht vergessen werden, wenn auf den Link zu einer weiteren Seite geklickt wird. Überall, wo ich soetwas gefunden habe, wird das per Cookie geregelt. Aber nicht jeder läßt Cookies zu, deswegen habe ich mich nach einer anderen Lösung umgesehen.
Bei SELFHtml habe ich die recht elegante Methode gefunden, window.name zum Zwischenspeichern von Werten zu benutzen.
Also habe ich folgende Funktion geschrieben:
function start()
{
if (window.name != "")
{
swapStyle(parseInt(window.name.slice(2,3)));
}
else
{
self.name="PK1";
swapStyle(parseInt(window.name.slice(2,3)));
}
// alert("Fenstername: "+window.name+"\nNr: "+window.name.slice(2,3));
}
Dazu wird nun den Buttons ein onClick="self.name='PK1'" (oder '2' etc.) mitgegeben, z.B.:
<button value="default" onClick="swapStyle(1);self.name='PK1'">Default</button>
Mein Problem ist nun, daß diese Funktion, onLoad ausgeführt, mit Mozilla den gewünschten Effekt hat, die Folgeseiten übernehmen brav den vorher eingestellten Style. In IE5 funktioniert es nicht, obwohl offenbar der Wert (besser gesagt: der Fenstername) tatsächlich übergeben wird (habe ich mit dem alert getestet), aber swapStyle wird falsch ausgeführt - nur mit dem Wert 0, also gar kein StyleSheet, außer wenn window.name=="PK1".
Zur Demonstration hier die Startseite http://www.peterknaak.de/test/index.htm zusammen mit der Seite "Musik" zum Testen des Wechselns.
Wo liegt der Fehler? Oder ist das ein Problem des IE5?
Gruß
Peter Knaak
Hallo Peter!
In IE5 funktioniert es nicht,...
im MSIE 6 auch nicht. Und was ist, wenn ich den Zurück-Button im Browser benutze?
Gruß Gunther
Hi,
die Idee ist gut. Ich arbeite auch mit Vorliebe mit dem Fensternamen.
Ich habe etwas herumprobiert. Der IE reagiert völlig unberechenbar. (Auch die Buttons verarbeitet er nach Zufallslaune richtig oder falsch.) Das liegt aber an der Nichtausführung von ...disabled=true/false.
Ich würde einen anderen Weg gehen. Das mit den Buttons kann man noch so lassen. Es funktioniert fast immer. Aber beim Laden würde ich erst den Fensternamen auslesen und dann mit Javascript die <link>-Elemente in den <HEAD> schreiben, mit "alternate" oder ohne, je nachdem.
Anmerkung: Wenn Du den Fensternamen verwendest, solltest Du damit rechnen, dass das auch andere tun. Darum wäre es "nett", wenn Du Deine Informationen an den vorhandenen Fensternamen anfügst, anstatt zu überschreiben.
Meine oben angegebene Seite speichert auch so allerlei im Fensternamen, sodass man zwischendurch andere Seiten besuchen oder ein Reload machen kann und hinterher alles wieder wie vorher vorfindet. Nur Deine Seite würde das sprengen. In dem Fall springen allerdings die Cookies ein, sofern zugelassen.
Salokin
Hallo Salokin!
Vielen Dank für die Antwort.
Muß zugeben, daß ich noch nicht so viel Erfahrung mit JS habe, deswegen noch eine Frage: Wie schreibe ich die link-Elemente gezielt in die Datei, ohne alles andere zu überschreiben (document.write ist es ja wohl nicht)?
Also habe ich das richtig verstanden: man schreibt jedesmal alle Style-Links, nur das gewünschte erhält kein "alternate"? (Denn die Möglichkeit, über das Mozilla-Menu Ansicht den Style auszuwählen, soll ja erhalten bleiben.)
Die Nichtausführung von ...disabled... kann man nicht beeinflussen? Habe schon versucht, die ganze Prozedur in start() einzubauen - nützt auch nichts.
Das mit dem Anfügen des Fensternamens statt Überschreiben ist wohl kein Problem - ich nehme an, bei onUnload restauriert man wieder den ursprünglichen Namen.
Gruß
Peter
(Das Konzept Deiner Seite finde ich sehr originell.)
Hi
(document.write ist es ja wohl nicht)?
doch, das meinte ich. Etwa so:
<script type="text/javascript">
var a = window.name.indexOf("PK")
if (a!=-1) {
a=Number(window.name.substr(a+2,1)
if(a=="NaN")
a=-1
for (var i=0;i<4;i++)
document.write("<link " + (i==a?"":"alternate ") + "src="..." ...>")
</script>
Also habe ich das richtig verstanden: man schreibt jedesmal alle Style-Links, nur das gewünschte erhält kein "alternate"? (Denn die Möglichkeit, über das Mozilla-Menu Ansicht den Style auszuwählen, soll ja erhalten bleiben.)
Ja.
Die Nichtausführung von ...disabled... kann man nicht beeinflussen? Habe schon versucht, die ganze Prozedur in start() einzubauen - nützt auch nichts.
Ich habe auch versucht, einen Timeout zwischenzuschieben, um das Klicken auf einen der Buttons zu imitieren. Letzteres funktioniert, ersteres dennoch nicht. Wie gesagt, mir schien das völlig willkürlich, bugbehaftet zu sein. Also Finger weg (im IE).
Das mit dem Anfügen des Fensternamens statt Überschreiben ist wohl kein Problem - ich nehme an, bei onUnload restauriert man wieder den ursprünglichen Namen.
Das gibt ein Problem: Woher weiß beispielsweise die Startseite, dass sie gerade zum ersten Mal aufgerufen wird (window.name überschreiben) oder als Reload nach Besuch der Musikseite (window.name auslesen)? Und woher weiß sie beim Unload, ob ein Wechsel zur Musikseite oder zu einer externen stattfindet?
(Das Konzept Deiner Seite finde ich sehr originell.)
Danke, sowas hört man gerne!
Salokin
Aha, so geht das! Danke erstmal, werde mich da nochmal in Ruhe dransetzen. Vorerst bekommen dann eben nur Mozillauser die Buttons.
Gruß
Peter