Dynamischer Zugriff
Michael Schulz
- javascript
Hallo Forum,
um meine Texte bei unterschiedlichen Sprachen zu ändern gehe ich aus Platzgründen folgenden Weg:
Im HTML:
xxx<span id="ba_1"></span>xxx
xxx<span id="ba_2"></span>xxx
Durch Javascript werden hier nun die Texte eingefügt:
function Disp(mID,mText)
{
if (document.getElementById(mID))
document.getElementById(mID).innerHTML = mText;
}
kekse1 = new Array("Eng1","Deu1");
kekse2 = new Array("Eng2","Deu2");
kekse3 = new Array("Eng3","Deu3");
kekse4 = new Array("Eng4","Deu4");
kekse5 = new Array("Eng5","Deu5");
function TexteRein(Sprache)
{
Disp("ba_1",kekse1[Sprache]);
Disp("ba_2",kekse2[Sprache]);
Disp("ba_3",kekse3[Sprache]);
etc..
}
Das ganze Funktioniert auch hervorragend. Es ist Platzsparend (was EXTREM wichtig ist). Ich kann innerhalb kürzester Zeit andere Sprachen zufügen. Also, die Lösung.
Nun möchte ich das ganze jedoch etwas verfeinern:
Die Funktion Disp(...) wird ja mit fortlaufenden Daten aufgerufen.
Die erste Variable ist dabei auch Problemlos dynamisch erstellbar:
var i=0;
for (i=1;i<AnzArray;i++)
{
Disp("ba_" + i, ja und hier geht es nimmer!!??
}
oder gibbet einen Weg, wie ich hier auch den zugriff auf das spezifische Array dynamisch angelegt bekomme, bzw. die zuweisung dynamisch wird??
In C und konsorten ist dies kein Problem, aber gibt es hierfür in Javascript eine Lösung?
Danke,
Michael
Hi Michael!
Ich bin nicht sicher, ob ich richtig verstanden habe, was du möchtest, aber ich versuchs mal:
(...)
statt:
kekse1 = new Array("Eng1","Deu1");
kekse2 = new Array("Eng2","Deu2");
kekse3 = new Array("Eng3","Deu3");
kekse4 = new Array("Eng4","Deu4");
kekse5 = new Array("Eng5","Deu5");
kekse = new Array();
kekse.push(new Array("Eng1","Deu1"));
kekse.push(new Array("Eng2","Deu2"));
kekse.push(new Array("Eng3","Deu3"));
kekse.push(new Array("Eng4","Deu4"));
kekse.push(new Array("Eng5","Deu5"));
var i=0;
for (i=0;i<kekse.length;i++)
{
Disp("ba_" + i +1, kekse[count][sprachselector])
}
mit sprachselector: 0 => Eng[i+1]; 1=> Deu[i+1]
Ich hoffe das war, was du wolltest.
Grüsse,
Richard
Hallo Richard,
Ich bin nicht sicher, ob ich richtig verstanden habe, was du möchtest, aber ich versuchs mal:
Du hast es richtig verstanden, trotzdem setze ich Struppis Lösung um, da diese in der Deklaration nochmal kleiner ist als die Deinige.
kekse = [
["20char","20char"], /*20 Char ist so der Schnitt
...
]
ist zu
kekse = new Array();
kekse.push(new Array("20char","20char"));
...
ca 50% kleiner. Variante 1 sind 48 Zeichen, Variante 2 sind 70 Zeichen
Danke, für die Idee,
Michael
Hallo,
Durch Javascript werden hier nun die Texte eingefügt: ... Das ganze Funktioniert auch hervorragend. Es ist Platzsparend (was EXTREM wichtig ist).
Abhängig von deiner Anwendung (viel Fließtext?) kannst du noch mehr Bytes sparen, wenn du den Javascript- Code minimierst und nicht jeder zu tauschende Begriff eingebettet ist in <span id="ba_1"></span>
Und bei ausgeschaltetem Javascript kommt zumindest die default-Sprache:
<style type='text/css'>
#deu {display:block}
#eng {display:none}
#spa {display:none}
</style>
<script type='text/javascript'>
function switchTo( lg )
{
document.getElementById( 'deu' ).style.display = 'none'; // wegblenden
document.getElementById( 'eng' ).style.display = 'none';
document.getElementById( 'spa' ).style.display = 'none';
document.getElementById( lg ).style.display = 'block'; // einblenden
}
</script>
<div id=deu>
<a href="javascript:switchTo('eng')">english</a> <a href="javascript:switchTo('spa')">español</a> <br>
xxx Deu1 xxx
xxx Deu2 xxx
</div>
<div id=eng>
<a href="javascript:switchTo('deu')">deutsch</a> <a href="javascript:switchTo('spa')">español</a> <br>
xxx Eng1 xxx
xxx Eng2 xxx
</div>
<div id=spa>
<a href="javascript:switchTo('deu')">deutsch</a> <a href="javascript:switchTo('eng')">english</a> <br>
xxx Spa1 xxx
xxx Spa2 xxx
</div>
Lieben Gruß, Kalle
Hallo Kalle,
Abhängig von deiner Anwendung (viel Fließtext?) kannst du noch mehr Bytes sparen, wenn du den Javascript- Code minimierst und nicht jeder zu tauschende Begriff eingebettet ist in
Fast kein Fliesstext, sondern eine Art Konfiguration zugänglich für viele Sprachen.
Und bei ausgeschaltetem Javascript kommt zumindest die default-Sprache:
Java ist für diese Anwendung zwingend Nötig. Sonst kommt fast nur eine leere Seite.
Ich habe gehoft, das es irgendwie in der Art machbar wäre, wie Struppi es beschrieben hat.
Vielen Dank für die überlegungsMühen, aber ich befürchte, das bei meiner Realen Anwendung die Grösse bei Deinem Weg steigen würde, obwohl er der Qualitativ richtigste wäre.
Viele Grüsse,
Michael
um meine Texte bei unterschiedlichen Sprachen zu ändern gehe ich aus Platzgründen folgenden Weg:
Was für Platzgründe?
Im HTML:
xxx<span id="ba_1"></span>xxx
xxx<span id="ba_2"></span>xxx
sowie ich das sehe bläht das den code eigentlich erst auf.
kekse1 = new Array("Eng1","Deu1");
kekse2 = new Array("Eng2","Deu2");
kekse3 = new Array("Eng3","Deu3");
kekse4 = new Array("Eng4","Deu4");
kekse5 = new Array("Eng5","Deu5");
die Zahlen im Namen deuten schon daraufhin, dass du eigentlich ein Array willst. Und aus Platzgründen kann man das auch einfacher in der literalen Notation schreiben
kekse = [
[ "Eng1","Deu1" ],
[ "Eng2","Deu2" ],
[ "Eng3","Deu3" ],
[ "Eng4","Deu4" ],
[ "Eng5","Deu5" ]
];
function TexteRein(Sprache)
{
Disp("ba_1",kekse1[Sprache]);
Disp("ba_2",kekse2[Sprache]);
Disp("ba_3",kekse3[Sprache]);
etc..
}
Disp("ba_1",kekse[1][Sprache]);
Disp("ba_2",kekse[2][Sprache]);
Disp("ba_3",kekse[3][Sprache]);
Es ginge noch einfacher, aber dazu müßte man die tasächliche Struktur kennen.
Das ganze Funktioniert auch hervorragend. Es ist Platzsparend (was EXTREM wichtig ist). Ich kann innerhalb kürzester Zeit andere Sprachen zufügen. Also, die Lösung.
Ob das wirklich Platzsparend ist ist die Frage.
Nun möchte ich das ganze jedoch etwas verfeinern:
Die Funktion Disp(...) wird ja mit fortlaufenden Daten aufgerufen.
Die erste Variable ist dabei auch Problemlos dynamisch erstellbar:
var i=0;
for (i=1;i<AnzArray;i++)
{
Disp("ba_" + i, ja und hier geht es nimmer!!??
}
Du könntest auch in Disp die entsprechenden werte zusammenbauen.
function Disp(mID,lang)
{
var id = 'ba_' + mID;
var text = kekse[mId][lang];
var obj = document.getElementById(id);
if (obj)obj.innerHTML = text;
}
var EN = 0;
var DE = 1;
Disp(1, DE);
Disp(2, DE);
usw.
Deine 'ba_X' IDs müssen dann aber mit Null anfangen.
Struppi.
Hallo Struppi,
die Nummer:
kekse = [
[ "Eng1","Deu1" ],
[ "Eng2","Deu2" ],
[ "Eng3","Deu3" ],
[ "Eng4","Deu4" ],
[ "Eng5","Deu5" ]
];[/code]
»»
function TextModData()
{
var i; var j;
for (i=0,j=0;i<kekse .length;i++,j++)
{
Disp("si_"+j, kekse[i][ActLanguage]);
}
}
Funktioniert HERVORRAGEND!!!
Ob das wirklich Platzsparend ist ist die Frage.
Ja, ist es. Habe durch die gesammte Massnahme meinen Kode von 269K auf 230 K reduziert. Hab insgesamt nur Platz für 320K Code ;(.
Danke Struppi. Nach http://de.selfhtml.org/javascript/objekte/array.htm#allgemeines
hätte ich nicht gewusst, wie... und geglaubt das...
Viele Grüsse,
Michael