Michael Schulz: Dynamischer Zugriff

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

  1. 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

    1. 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

  2. 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&ntilde;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&ntilde;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

    1. 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

  3. 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.

    1. 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