JavaScript: Glob. Variable läßt sich nicht ändern

Hallo Profis,

im HTML-Frame steht bei mir ein Funktionsaufruf „ChangeLanguage(‚en‘);“. Die Funktion ist in einer separaten .js-Datei (im Head eingebunden) und sieht etwa so aus:

var smLang;

function ChangeLanguage(smLangOver) {
smLang = smLangOver;
parent.frames['Hauptframe'].document.getElementsByName("BildKasten")[i].innerHTML = smMsg[smLang]["Picture"]; //fügt eine Bezeichnung in jeweiliger Sprache ein.
}

Das Funktioniert auch (smLang ist innerhalb der Funktion tatsächlich ‚en‘. Wenn ich nun aber eine andere Funktion (in derselben .js-Datei) oder auch im HTML-Frame aufrufe, dann ist die Variable smLang immer noch auf dem alten Wert, nicht auf ‚en‘. Sie wird durch folgende Funktionsaufrufe nicht mehr geändert.

Das Verrückte ist: Solange ich die Funktion nicht aufrufe, ist die globale Variable leer (logisch), nach dem ersten Aufruf mit „ChangeLanguage(‚de‘);“ ist sie ‚de‘ (auch logisch). Beim nächsten Funktions-Aufruf (z. B. mit „ChangeLanguage(‚it‘);“) ändert sie sich nicht mehr und bleibt auf dem ersten zugewiesenen Wert ‚de‘. Ich habe schon an allen möglichen Stellen versucht, diese globale Variable zu ändern, aber es geht einfach nur beim ersten mal.

Was läuft hier schief? Sind globale Variablen Einweg-Produkte?

Vielen Dank für Eure Hilfe
JayKay

Hallo Jens,

wird der Script angehalten, weil hier


parent.frames[‚Hauptframe‘].document.getElementsByName(„BildKasten“)[i].innerHTML = smMsg[smLang][„Picture“];

ein Fehler steckt? Was sagt die Fehlerkonsole?

Wenn Du diesen Teil mal rausnimmst, wird smLang wahrscheinlich auch beim 2. mal geändern.

Welchen Wert hat eigentlich i bei

("BildKasten")[i]

und statt

parent.frames['Hauptframe'].document.

doch besser

parent.Hauptframe.document.

schreiben.

Gruß
Klaus

Element oder Variable

Hallo Profis,

bin ich leider nicht

im HTML-Frame steht bei mir ein Funktionsaufruf

Ist die Variable und die Funktion im selbe Frame?

parent.frames[‚H-f‘].document.getElementsByName(„B-k“)[i].innerHTML

innerHTML ist unsauberer Code und du wolltest doch eine Variable ansprechen, nimmst aber ein Formularelement.

Ich habe schon an allen möglichen
Stellen versucht, diese globale Variable zu ändern, aber es
geht einfach nur beim ersten mal.

Was läuft hier schief? Sind globale Variablen Einweg-Produkte?

Was nennst du global? Und was ist dein Hauptframe?
Auf Variable in der HTML-Datei mit den Frameset-Definitionen kannst du mit parent.var zugreifen.
in einen anderen Frame mit parent.frames[0].var

parent[‚Framename‘].VariablenName funktioniert
Hallo jott053,

Ist die Variable und die Funktion im selbe Frame?

Naja, die smLang wird in einem Nebenframe (derselben Seite) aufgerufen und wirkt sich auf alle Frames aus (sie fügt diverse Texte in einer anderen Sprache ein).

Aber ich habe jetzt mal testweise die Funktion aus dem Hauptframe aufgerufen: Danach war smLang tatsächlich aktualisiert!!!

innerHTML ist unsauberer Code und du wolltest doch eine
Variable ansprechen, nimmst aber ein Formularelement.

Wenn Du mir da einen Tipp geben könntest: Wie mach’ ichs richtig? Ich muß in s, s oder s den Inhalt überschreiben.

Was läuft hier schief? Sind globale Variablen Einweg-Produkte?

Was nennst du global?

Nun, was nach lehrbüchern eben als globale Variable gilt: Eine Variable, die außerhalb einer Funktion deklariert wird (also am Anfang der eingebundenen .js-Datei mit „var SmLang;“.

Und was ist dein Hauptframe?

Mein „Hauptframe“ ist einer von vier Frames einer HTML-Seite. In allen vier Frames befinden sich Texte, die ich nach Wahl einer neuen Sprache ändern möchte (z. B. steht irgendwo „Einstellungen“, „Bilderliste“, nach Klick auf die Britische Flagge ändere ich diese und andere Texte in „Settings“, „List of Pictures“, indem ich dort ein Array mit Sprachversions-Texten zuweise).

Auf Variable in der HTML-Datei mit den Frameset-Definitionen
kannst du mit parent.var zugreifen.
in einen anderen Frame mit parent.frames[0].var

Kraß! Damit klappts. Ich habe nun zusätzlich eingegeben

parent.frames['Hauptframe'].smLang 'en';

, dann klappts auch mit dem Nachbar(-frame).

Bleibt immer noch das Mysterium, warum smLang sich ein erstes mal auch ohne Frame-Angabe global (für jeden Zugriff aus jedem Frame) ändern läßt und danach nicht mehr, und das zweite Mysterium, warum globale Variablen nicht global sind. Denn einerseits läßt sich die Variable in allen Frames und Skripten verwenden, obwohl sie nur an einer Stelle deklariert wurde, andererseits aber läßt sie sich (egal wo man das macht) nicht für alle Frames ändern. In den diversen Tutorien (und ich habe neben dem überalterten SelfHTML auch drei Bücher konsultiert) sollte diese eingeschränkte Globalität globaler Variablen doch mal erwähnt werden!

Dir jedenfalls schon mal besten Dank. Es funktioniert nun, auch wenn ich nicht weiß, warum :smile:

JayKay

Script läuft ohne Fehlermeldungen
Hallo Klaus,

wird der Script angehalten, weil hier


parent.frames[‚Hauptframe‘].document.getElementsByName(„BildKasten“)[i].innerHTML
= smMsg[smLang][„Picture“];

ein Fehler steckt? Was sagt die Fehlerkonsole?

Nein, es läuft immer ohne Fehler durch. Es funktioniert ja auch beim ersten Aufruf alles Wunschgemäß. Auch bei folgenden Aufrufen läuft die Funktion durch und ändert alle Texte in die neue Sprache, ohne Fehlermeldung, nur eben daß nach der zweiten Änderung smLang beim Aufruf anderer Funktionen nicht mehr auf die neue Sprache geändert wird.

Mit jott053s Tipp hats ja jetzt geklappt: smLang ist in der Funktion in Wirklichkeit lokal (da Funktioniert ja wie gesagt alles). Wenn ich will, daß smLang auch beim Aufruf einer anderen Funktion den neuen Wert enthält, muß ich erst das smLang des Hauptframes ändern mit

parent.frames['Hauptframe'].smLang = 'de'

Aber diese Regionalität angeblich globaler (Haha!) Variablen ist wirklich nirgends dokumentiert. Unfaßbares Geheimwissen…

Wenn Du diesen Teil mal rausnimmst, wird smLang
wahrscheinlich auch beim 2. mal geändern.

Habe ich probiert, geht nicht :frowning:

Welchen Wert hat eigentlich i
bei

(„BildKasten“)[i]

Es gibt einige Elemente mit gleichem Text, die werden mit einer for-Schleife abgearbeitet (funktioniert alles).

und statt

parent.frames[‚Hauptframe‘].document.

doch besser

parent.Hauptframe.document.

schreiben.

Ich bin da immer verunsichert: Ist das wirklich die sauberere Art zu Programmieren? Ich dachte, wann immer Array-typische Notation möglich ist, sollte man sie anwenden.

Danke Dir
JayKay

Hallo JayKay,

diese Regionalität angeblich globaler (Haha!) Variablen ist
wirklich nirgends dokumentiert. Unfaßbares Geheimwissen…

eine variable ist ein window-object
ein frame hat ein eigenes window-object

Ich bin da immer verunsichert: Ist das wirklich die sauberere
Art zu Programmieren? Ich dachte, wann immer Array-typische
Notation möglich ist, sollte man sie anwenden.

parent.frames[‚Hauptfenster‘] = per id
parent.Hauptfenster = per name
parent.frames[x] = x. element im frames-array

sauber?
über frames-array insofern „sicherer“, falls id oder name vergessen wird :smile:)

Gruß
Klaus

1 Like

Okay, ich werde es mal versuchen. Vielen Dank für die viele Hilfe.
Vielleicht weiß ich ja auch mal was, dann bin ich da :smile:

JayKay