• Herzlich Willkommen!

    Nach der Schließung von inDiablo.de wurden die Inhalte und eure Accounts in dieses Forum konvertiert. Ihr könnt euch hier mit eurem alten Account weiterhin einloggen, müsst euch dafür allerdings über die "Passwort vergessen" Funktion ein neues Passwort setzen lassen.

    Solltet ihr keinen Zugriff mehr auf die mit eurem Account verknüpfte Emailadresse haben, so könnt ihr euch unter Angabe eures Accountnamens, eurer alten Emailadresse sowie eurer gewünschten neuen Emailadresse an einen Administrator wenden.

javascript - funktionsaufruf

TitanSeal

Champion
Registriert
5 Juli 2004
Beiträge
7.993
hy :hy:

ich beschäftige mich gerade mit javascript und hätte dazu eine frage bezüglich des aufrufs einer funktion. da ich im internet nicht wirklich fündig geworden bin, frage ich mal hier nach:

wie ruft man eine funktion innerhalb einer anderen funktion auf?
ich habe hier beispielsweise diese funktion:
Code:
function Entf ()
{
  while (document.getElementsByName("liste")[0].hasChildNodes())
  {
    document.getElementsByName("liste")[0].removeChild(document.getElementsByName("liste")[0].firstChild);
  }
}
die folgendermaßen aufgerufen wird:
Code:
<a href="javascript:Entf();">Entfernen</a>
auf diese weise funktioniert alles wunderbar. nun will ich "Entf()" allerdings über eine weitere funktion aufrufen, was laut diversen quellen im netz folgendermaßen gehen sollte:

Code:
function Entfernen ()
{
  function Entf ();
}

function Entf ()
{
  while (document.getElementsByName("liste")[0].hasChildNodes())
  {
    document.getElementsByName("liste")[0].removeChild(document.getElementsByName("liste")[0].firstChild);
  }
}
mit dem aufruf:
Code:
<a href="javascript:Entfernen();">Entfernen</a>
doch nach dieser änderung funktionert das gesammte script nicht mehr. was mache ich hier falsch?

mfg
 
Lass mal das "function" beim Aufruf der Entf-Funktion weg.
 
Jop, da hat drago recht. Noch etwas erläutert: Das function setzt du nur bei Funktionsdeklarationen. Bei Aufrufen generell nicht. Also ist es hier:
Code:
function Entfernen ()
{
  [b]function[/b] Entf ();
}
falsch am Platze. ;)
 
ok, damit ist die sache geklärt ^^
danke :)
(das hätten sie auf SELFHTML.org ruhig erwähnen können, ich verlier da durch die lächerlichsten dinge zeit ^^)

den zuständen mod würde ich noch bitten, diesen thread offen zu lassen, sodass ich für zukünftige javascript-fragen keinen neuen eröffnen muss.
alle anderen würde ich in dem fall bitten, hier nicht zu spämmen und den thread in ruhe absinken zu lassen ;)

mfg
 
ich hab schon wieder einen fehler, den ich absolut nicht verstehe. vielleicht könnt ihr mir ja helfen:

ich hatte einen fehler in einer etwas größeren funktion und habe ihn schrittweise auf einen einzigen befehl eingrenzen können, doch der stellt mich vor ein rätsel. um zu überprüfen, ob mit den richtigen werten gearbeitet wird, lasse ich mir selbige in einem ausgabefeld anzeigen:

Code:
document.myform.feld.value = waffen[document.myform.waffe.value][5];
"document.myform.waffe.value" ist der index des arrays "waffen". dieses array enthält weitere arrays mit 6 einträgen, sodass obige zeile den zuletzt eingetragenen wert der gerade ausgewählten waffe ausgibt.

Code:
document.myform.feld.value = document.myform.zweitwaffe.value;
dies ist dann der index der zweiten waffe und auch der wird richtig ausgegeben.

Code:
document.myform.feld.value = waffen[document.myform.zweitwaffe.value][5];
nun will ich mir den letzten wert auch für die zweitwaffe ausgeben lassen. der index wurde überprüft und stimmt, sodass bloß wie im ersten beispiel der wert aus dem array ausgelesen werden muss. doch dies funktioniert plötzlich nicht mehr und auch alles das nach dieser zeile kommt, wird nicht ausgeführt. kann mir das jemand erklären?

edit: wenn ich "document.myform.zweitwaffe.value" einfach auf "document.myform.zweitwaffe.selectedIndex" umschreibe, funktionert das auslesen aus dem array. nur sind das dann die falschen zahlen.

mfg
 
Gib mal den Code im Zusammenhang und die Fehlermeldung, falls eine kommt. Als grundsätzliche Regel: Dass ein Fehler in einer bestimmten Zeile aufzutauchen scheint, heißt nicht, dass er auch dort begründet ist.
 
Code:
function waffe()
{
  while (document.myform.waffe.length > 0) document.myform.waffe.options[0] = null;
  for (i=0; i < waffen.length; i++)
  {
    if ((waffen[i][3] < 0) || (waffen[i][3] == document.myform.char.value))
    {
      if ((document.myform.char.value < 7) || ((document.myform.char.value == 7) && (waffen[i][2] == 7)) || ((document.myform.char.value == 8) && ((waffen[i][4] == 8) || (waffen[i][4] == 2))) || ((document.myform.char.value == 9) && (waffen[i][4] == 9)))
      {
        neuElement = new Option(waffen[i][0],i);
        document.myform.waffe.options[document.myform.waffe.length] = neuElement;
      }
    }
  }
}
hier wird in abhängigkeit des gewählten chars die waffenlistegeneriert, sodass nur jene waffen aufgelistet werden, die der char tatsächlch tragen kann.

Code:
function zweitwaffe()
{
  while (document.myform.zweitwaffe.length > 0) document.myform.zweitwaffe.options[0] = null;
  switch (document.myform.char.value)
  {
    case "1":
      if (waffen[document.myform.waffe.value][2] == 1)
      {
        for (i=0; i < waffen.length; i++)
        {
          if ((waffen[i][3] == 1) || (waffen[i][2] == 0))
          {
            neuElement = new Option(waffen[i][0],i);
            document.myform.zweitwaffe.options[document.myform.zweitwaffe.length] = neuElement;
          }
        }
      }
      else
      {
        neuElement = new Option("-","-1");
        document.myform.zweitwaffe.options[document.myform.zweitwaffe.length] = neuElement; 
      }
      break;

    case "2":
      if ((waffen[document.myform.waffe.value][2] == 2) || (waffen[document.myform.waffe.value][2] == 4) || ((waffen[document.myform.waffe.value][2] == 3) && (document.myform.barbschwert.value == 1)))
      {
        for (i=0; i < waffen.length; i++)
        {
          if ((waffen[i][2] == 0) || (waffen[i][2] == 3) || (((waffen[i][2] == 2) || (waffen[i][2] == 4)) && (waffen[i][3] == -1)))
          {
            neuElement = new Option(waffen[i][0],i);
            document.myform.zweitwaffe.options[document.myform.zweitwaffe.length] = neuElement;
          }
        }
      }
      else
      {
        neuElement = new Option("-","-1");
        document.myform.zweitwaffe.options[document.myform.zweitwaffe.length] = neuElement; 
      }
      break;

    default:
      neuElement = new Option("-","-1");
      document.myform.zweitwaffe.options[document.myform.zweitwaffe.length] = neuElement;
      break;
  }
}
hier wird die zweite waffenliste generiert.

Code:
function skill()
{
  while (document.getElementsByName("skill")[0].hasChildNodes()) document.getElementsByName("skill")[0].removeChild(document.getElementsByName("skill")[0].firstChild);
  var optgroup1 = document.createElement("optgroup");
  var optgroup2 = document.createElement("optgroup");
  optgroup1.label = "native Angriffe";
  optgroup2.label = "Fremdfertigkeiten";

  switch (document.myform.char.value)
  {
    case "1":
      neuElement = new Option(fertigkeiten[0][0],fertigkeiten[0][1]);
      optgroup1.appendChild(neuElement);
      if (document.myform.charform.value == 0)
      {
        if ((waffen[document.myform.waffe.value][4] == 2) || (waffen[document.myform.waffe.value][4] == 3))
        {
          neuElement = new Option(fertigkeiten[1][0],fertigkeiten[1][1]);
          optgroup1.appendChild(neuElement);
        }
        neuElement = new Option(fertigkeiten[15][0],fertigkeiten[15][1]);
        optgroup1.appendChild(neuElement);
        if (waffen[document.myform.waffe.value][4] != 1)
        {
          neuElement = new Option(fertigkeiten[6][0],fertigkeiten[6][1]);
          optgroup1.appendChild(neuElement);
          neuElement = new Option(fertigkeiten[7][0],fertigkeiten[7][1]);
          optgroup1.appendChild(neuElement);
          neuElement = new Option(fertigkeiten[8][0],fertigkeiten[8][1]);
          optgroup1.appendChild(neuElement);
        }
        if (waffen[document.myform.waffe.value][2] == 1)
        {
          neuElement = new Option(fertigkeiten[9][0],fertigkeiten[9][1]);
          optgroup1.appendChild(neuElement);
          neuElement = new Option(fertigkeiten[10][0],fertigkeiten[10][1]);
          optgroup1.appendChild(neuElement);
          neuElement = new Option(fertigkeiten[11][0],fertigkeiten[11][1]);
          optgroup1.appendChild(neuElement);
        }
        if ((waffen[document.myform.waffe.value][2] == 1) && (waffen[document.myform.zweitwaffe.value][2] == 1))
        {
          neuElement = new Option(fertigkeiten[12][0],fertigkeiten[12][1]);
          optgroup1.appendChild(neuElement);
        }
        neuElement = new Option(fertigkeiten[13][0],fertigkeiten[13][1]);
        optgroup1.appendChild(neuElement);
        neuElement = new Option(fertigkeiten[14][0],fertigkeiten[14][1]);
        optgroup1.appendChild(neuElement);
        document.myform.skill.appendChild(optgroup1);

        if (waffen[document.myform.waffe.value][5] == 1)
        {
          neuElement = new Option(fertigkeiten[24][0],fertigkeiten[24][1]);
          optgroup2.appendChild(neuElement);
        }
        if (waffen[document.myform.waffe.value][2] == 1)
        {
          neuElement = new Option(fertigkeiten[19][0],fertigkeiten[19][1]);
          optgroup2.appendChild(neuElement);
        }
        if ((waffen[document.myform.waffe.value][5] == 1) || (waffen[document.myform.waffe.value][2] == 1)) document.myform.skill.appendChild(optgroup2);
      }
      if (document.myform.charform.value > 0) document.myform.skill.appendChild(optgroup1);
      break;

    case "2":
      neuElement = new Option(fertigkeiten[0][0],fertigkeiten[0][1]);
      optgroup1.appendChild(neuElement);
      if (document.myform.charform.value == 0)
      {
        if ((waffen[document.myform.waffe.value][4] == 2) || (waffen[document.myform.waffe.value][4] == 3))
        {
          neuElement = new Option(fertigkeiten[1][0],fertigkeiten[1][1]);
          optgroup1.appendChild(neuElement);
        }
        if (document.myform.zweitwaffe.value > 0)
        {
          neuElement = new Option(fertigkeiten[16][0],fertigkeiten[16][1]);
          optgroup1.appendChild(neuElement);
          neuElement = new Option(fertigkeiten[17][0],fertigkeiten[17][1]);
          optgroup1.appendChild(neuElement);
        }
        if (((waffen[document.myform.waffe.value][4] == 2) || (waffen[document.myform.waffe.value][4] == 3)) && ((waffen[document.myform.zweitwaffe.value][4] == 2) || (waffen[document.myform.zweitwaffe.value][4] == 3)))
        {
          neuElement = new Option(fertigkeiten[18][0],fertigkeiten[18][1]);
          optgroup1.appendChild(neuElement);
        }
        if (waffen[document.myform.waffe.value][4] != 1)
        {
          neuElement = new Option(fertigkeiten[19][0],fertigkeiten[19][1]);
          optgroup1.appendChild(neuElement);
          neuElement = new Option(fertigkeiten[20][0],fertigkeiten[20][1]);
          optgroup1.appendChild(neuElement);
          neuElement = new Option(fertigkeiten[21][0],fertigkeiten[21][1]);
          optgroup1.appendChild(neuElement);
          neuElement = new Option(fertigkeiten[22][0],fertigkeiten[22][1]);
          optgroup1.appendChild(neuElement);
          neuElement = new Option(fertigkeiten[23][0],fertigkeiten[23][1]);
          optgroup1.appendChild(neuElement);
        }
        document.myform.skill.appendChild(optgroup1);

        [color=silver]if (waffen[document.myform.zweitwaffe.value][5] == 1)
        {
          neuElement = new Option(fertigkeiten[24][0],fertigkeiten[24][1]);
          optgroup2.appendChild(neuElement);
          document.myform.skill.appendChild(optgroup2);
        }[/color]
      }
      if (document.myform.charform.value == 2)
      {
        neuElement = new Option(fertigkeiten[26][0],fertigkeiten[26][1]);
        optgroup1.appendChild(neuElement);
      }
      if (document.myform.charform.value > 0) document.myform.skill.appendChild(optgroup1);
      break;
in abhängigkeit von char und waffenklasse werden die skills in form einer verschachtelten auswahlliste dargestellt. wenn ich den silber markierten teil entferne, tritt der fehler (siehe unten) nicht mehr auf.

Code:
function sIAS()
{
  if (statisch == true)
  {
    statisch = false;
    while (document.myform.fana.length > 0) document.myform.fana.options[0] = null;
    for (i=0; i <= 50; i++)
    {
      neuElement = new Option(i,i);
      document.myform.fana.options[document.myform.fana.length] = neuElement;
    }
  }

  while (document.myform.frenzy.length > 0) document.myform.frenzy.options[0] = null;
  if (document.myform.char.value == 2)
  {
    for (i=0; i <= 50; i++)
    {
      neuElement = new Option(i,i);
      document.myform.frenzy.options[document.myform.frenzy.length] = neuElement;
    }
  }
  else
  {
    neuElement = new Option("-",-1);
    document.myform.frenzy.options[document.myform.frenzy.length] = neuElement;
  }

  while (document.myform.wolf.length > 0) document.myform.wolf.options[0] = null;
  if ((document.myform.char.value == 2) || (document.myform.char.value == 3))
  {
    for (i=0; i <= 50; i++)
    {
      neuElement = new Option(i,i);
      document.myform.wolf.options[document.myform.wolf.length] = neuElement;
    }
  }
  else
  {
    neuElement = new Option("-",-1);
    document.myform.wolf.options[document.myform.wolf.length] = neuElement;
  }

  while (document.myform.tempo.length > 0) document.myform.tempo.options[0] = null;
  if (document.myform.char.value == 1)
  {
    for (i=0; i <= 50; i++)
    {
      neuElement = new Option(i,i);
      document.myform.tempo.options[document.myform.tempo.length] = neuElement;
    }
  }
  else
  {
    neuElement = new Option("-",-1);
    document.myform.tempo.options[document.myform.tempo.length] = neuElement;
  }
}
hier werden für die vier skills mit SIAS die auswahllisten generiert. abgesehen von fanatismus sind alle listen vom char abhängig.
wenn ich nun mit diesem code den in meiner auswahlliste den barbar ( <option value="2">Barbar</option>) wähle, so wird die liste für frenzy nicht aktiv bzw andere nicht benötigte auswahlisten werden nicht deaktiviert. der wert den mir die char-auswahl liefert wird nach dem wechseln auf den barb selbst nicht verändert, bei allen anderen charklassen ändert er sich wie erwartet. wen ich allerdings den silber markierten text entferne (bzw die if-schleife verändere, sodass nicht mehr auf document.myform.zweitwaffe.value zugegriffen wird) ändern sich alle werte wie gewohnt.

mfg
 
Mal dazwischenfrag :>

TitanSeal schrieb:
[...]die folgendermaßen aufgerufen wird:
Code:
<a href="javascript:Entf();">Entfernen</a>
Das ist erstmal sehr falsch das so aufzurufen :> javascript:wasauchimmer kann keine Zielreferenz sein, sauberer wäre <a href="#" onclick="Entf();">

Aber warum machst du solche nun doch etwas größeren Dinge in JS?
 
die zeile stammt eigentlich nicht von mir, die hab ich aus einer quelle im internet übernommen als ich die knotenstruktur nachgelesen habe. ist aber trotzdem gut zu wissen, danke.

abgesehen davon, dass ich javascript ja lernen möchte, wüsste ich nicht, worin ich das programm sonst schreiben sollte. aber ich finde es auch nicht alzu groß, es sind onehin immer die gleichen befehle (zB 70 mal new Option () ).

mfg
 
C++, wenn du schon so webvernarrt bist PHP :)

In meinen Augen gibt es über Javascript nur eines zu lernen: Benutz es nicht :D
 
Bin ja kein Javaskript-Experte, daher muss ich ein bisschen raten/fragen.
Was heißt denn inhaltlich case 1 und case 2? Einhändig/zweihändig? Dann wundert mich das Vorkommen von Zweitwaffe unter case 1

Was mir auffällt ist, dass du da grundsätzlich bei optgroup1 hochzählst, in dem silbernen Teil aber optgroup2, dort aber mit dem fortlaufenden Index von ortgroup1, wenn ich das auf die Schnelle richtig erfasst habe. Die anderen Felder von ortgroup2 sind dann aber leer, oder?

Generelle Anmerkungen zum Programmierstil (willst ja was lernen)
- Funktionsnamen sollten ausdrücken, was die Funktion tut. Die Funktion Waffe sollte also eher heißen "generierePrimaerwaffe" oder so. Waffe wäre eher der Name für eine Klasse, die Objekte repräsentiert.
- du solltest auch um einzeilige Schleifenkörper die Klammern {} machen. Erleichtert das Lesen und birgt nicht die Gefahr, sie bei Änderungen zu vergessen.
- Wenn man mit sprechenden Namen agieren kann, sollte man das tun. Du hast anscheinend Nummern für die verschiedenen Chars, Waffen, Fertigkeiten etc. vergeben, für das Lesen des Sourcecodes wäre es besser, da stünde die Charklasse und nicht 2 oder 5. Die Zeile " if ((document.myform.char.value < 7) || ((document.myform.char.value == 7) && (waffen[2] == 7)) || ((document.myform.char.value == 8) && ((waffen[4] == 8) || (waffen[4] == 2))) || ((document.myform.char.value == 9) && (waffen[4] == 9)))" vestehst du in 4 Wochen selbst nicht mehr. Alternative: Kommentieren.
- Anderes Beispiel für sprechende Namen und auch für bessere Performance: Wenn du den Wert von "document.myform.waffe.value" vorher einer Variable "aktWaffe" zuweist, liest sich das zum einen besser und du greifst nicht immer wieder über den Index auf ein Array zu, sondern lediglich auf den Wert einer Variable. Solange diese sich nicht ändert, ist das deutlich besser. Statt 1/0 wäre true/false ebenfalls besser.
- in den else-Zweigen wiederholen sich viele Sachen. Wenn man solche Zweizeiler hat, die immer wieder kommen, schreibt man diese besser in eine kleine Hilfsfunktion mit einem schönen sprechenden Namen, z.B. "createDefaultEntry"
und ruft diese dann auf.


Soviel mal von mir dazu, muss jetzt erst mal weg
 
die case-anweisungen beziehen sich auf document.myform.char.value, sprich auf den ausgewählten charakter. die nummerierung ist alphabetisch bei 0 beginnend, "1" ist daher die assassine und "2" der barbar.

optgroup1 enthält alle nativen angriffe, optgroup2 alle fremdfertigkeiten. der barber kann nur eifer als fremdfertigkeit erhalten, daher bekommt optgroup2 nur einen eintrag.
der index bezieht sich nur auf das array, in dem die skill-namen stehen und spielt damit keine rolle.

Code:
if ((document.myform.char.value < 7) || ((document.myform.char.value == 7) && (waffen[i][2] == 7)) || ((document.myform.char.value == 8) && ((waffen[i][4] == 8) || (waffen[i][4] == 2))) || ((document.myform.char.value == 9) && (waffen[i][4] == 9)))
0-6 sind die chars in alphabetischer reihung und 7,8,9 sind die söldner. die zeile legt also fest, welche waffen die söldner tragen können.

Statt 1/0 wäre true/false ebenfalls besser.
das war mir bei 292 variablen zu mühsam und ich wollte mir auch die möglichkeit offen lassen, noch andere markierungen in der spalte unterzubringen.

schonmal danke für deine hilfe und die tips.


edit: das problem ist gelöst :)
war ein dummer fehler, das hätte ich früher sehen sollen. aber ich hätte nicht gedacht, dass das solche seltsamen folgen haben kann.
nochmals danke für die hilfe drago :)

mfg
 
Wieso benutzt Du für so etwas nicht eine Datenbank? Dafür wurden sie erfunden und die handeln das sowohl eleganter als auch wesentlich schneller als javascript.

Und wie shyeah schon andeutete sehe ich es auch. Nahezu jede Alternative ist besser als javascript. Das sollte man bestenfalls zum Ausschmücken einer Webseite benutzen unter der Prämisse, daß die Webseite auch ohne Javascript funktioniert.

Z.B. PHP oder perl mit/ohne Datenbank oder gleich C, C++ oder eine andere Programmiersprache.

Falls Dir keine Webserver zur Verfügung stehet, lies Dir mal das hier durch, ein Webserver mit php und mysql auf dem eigenen Desktop.
 
Hackt doch nicht so auf JavaScript rum, das ist genau die richtige Sprache um kleine Calcs zu basteln die laufen dann auch problemlos im Browser ohne dass man binaries verschicken muss, ohne das es ruckelt (java^^) ohne dass man ständig "reloaden" muss (PHP) und Datenbanken sind so wie ich das hier sehe Kanonen auf Spatzen...
In zeiten von web2.0 (*wohooo melodramatisch werd*) ist Javascript imho eines der wichtigsten werkzeuge.
Aber Hey ICH würds in Flash programmieren :hammer:

:hy:
 
ph.0.nix schrieb:
Hackt doch nicht so auf JavaScript rum, das ist genau die richtige Sprache um kleine Calcs zu basteln die laufen dann auch problemlos im Browser ohne dass man binaries verschicken muss, ohne das es ruckelt (java^^) ohne dass man ständig "reloaden" muss (PHP) und Datenbanken sind so wie ich das hier sehe Kanonen auf Spatzen...

Das mit dem problemlos ist auch so eine hartnäckige urban legend :-) Und was heißt hier mit Kanonen auf Spatzen schießen? Ich halte hier eher das ganze Objektgedudel bei so einer einfachen Aufgabenstellung für Overdrive, wo es ein einzelner, sauber formulierter Query besser und schneller erledigt und die Datenpflege dann auch um einiges einfacher wird.
Ausserdem ist Javascript zum Daraufherumhacken da! :cool:

In zeiten von web2.0 (*wohooo melodramatisch werd*) ist Javascript imho eines der wichtigsten werkzeuge.

In Zeiten von Web 2.0 führt der überdimensionierte Einsatz von Javascripts zu ganz anderen Nebeneffekten die alle ungewollt sind ( ich erinnere nur mal an die großen Suchmaschinen und ihren Umgang mit "aktiven Inhalten":D ), nur damit ein paar Buttons nicht geklickt werden müssen oder irgendetwas auf nervende Weise blinkt, wackelt oder zappelt.
Lästigstes und überflüssigstes Übel des Webs wäre in meinen Augen die passenste Beschreibung für Javascript. Von Sicherheitsproblemen ganz zu schweigen.

Aber Hey ICH würds in Flash programmieren :hammer:
:hy:

Gott, Flash, wie kannst Du dieses pöse Wort auch nur in den Mund nehmen? Verspürst Du denn gar keine Scham mehr? :autsch:
 
Calcs sind so ein Sonderfall, wo ich zähneknirschend JavaScript einsehe, wenn auch unter anderen Rahmenbedingungen. Dort ist JavaScript praktisch, um Traffic zu sparen, was vorraussetzt, dass das nötig ist :)

Mit JavaScript lernst du allerhöchstens das DOM, von "programmieren" kann in diesem Rahmen keine Rede sein. Und wenn ich an deinem Code sehe, wie du dir da einen abbrichst... Du machst es dir wirklich sowas von unnötig schwer mit einer Programmiersprache, die formal gesehen keine ist.

Übrigens bin ich nicht der Meinung, dass man mit einer DB jemals "mit Kanonen auf Spatzen schießen" könnte. Auch bei einer sehr kleinen Datenbasis überwiegen in meinen Augen die Vorteile erheblich. Manche gehen so weit, eine Tabelle zu erstellen in der die Konfiguration von was-weiß-ich-was steht, also eine Tabelle mit nur einem Datensatz.

Für mich gibt es bei Programmierung nur zwei Vorschläge:

PHP: Sehr einsteigerfreundlich, keine kapitalen Systemfehler möglich (Programmabstürze etc.) und du lernst dabei gleich wie man Webseiten dynamisch erzeugen kann.

C++: Nur die Harten komm' in Garten. Das ist OOP, nirgendwo hast du mehr Möglichkeiten, sowohl was dein Programm angeht als auch seine Fehler :D

Flash war noch nie eine Option um irgendetwas außer kleine Spielchen oder Dekografiken mit Sound (ekelhaft, aber der Vollständigkeit halber) zu bauen.

Und Web 2.0 gab es nie aber das nur am Rande :D
 
danke für eure hinweise, aber ich habe schon zu lange daran geschrieben um noch auf eine andere sprache zu wechseln ^^
für das nächste projekt werd ich dann eure möglichkeiten ausprobieren.

und um wieder auf javascript zurück zu kommen, hätte ich mal eben noch eine frage. ich habe vier auswahllisten, je eine für das slvl von fana, frenzy, werwolf und BoS. erzeugt werden sie durch folgenden code:

Code:
  while (document.myform.wolf.length > 0) document.myform.wolf.options[0] = null;
  if ((document.myform.char.value == 2) || (document.myform.char.value == 3))
  {
    for (i=0; i <= 50; i++)
    {
      neuElement = new Option(i,Math.floor(Math.floor((110*i)/(6+i))*(80-10)/100)+10);
      document.myform.wolf.options[document.myform.wolf.length] = neuElement;
    }
  }
  else
  {
    neuElement = new Option("-",0);
    document.myform.wolf.options[document.myform.wolf.length] = neuElement;
  }
der teil gilt für jetzt für den skill werwolf. die anderen drei schauen so ähnlich aus, ist nicht nötig alle zu posten.

dann will ich die so eingestellten werte alle addieren:

Code:
function berechneSIAS()
{
  var fana = document.myform.fana.value;
  var frenzy = document.myform.frenzy.value;
  var wolf = document.myform.wolf.value;
  var tempo = document.myform.tempo.value;
  var SIAS = fana + frenzy + wolf + tempo;

  document.myform.feld1.value = SIAS;
}
im ausgabefeld werden nun allerdings nicht die werte addiert, sondern einfach aneinandergereiht. muss ich irgendwas bestimmtes machen, um die variablen als numerische werte und nicht als zeichenketten zu definieren? ich habe auch die funktion eval() probiert (SELFHTML: "Diese Funktionalität ist sehr praktisch, um als Zeichenketten notierte Rechenausdrücke mit einem einzigen Befehl errechnen zu lassen."). allerdings werden auch hier die werte nicht addiert, wovon ich aufgrund obigen zitats eigentlich ausgegangen bin. wie macht man dies also richtig?

mfg
 
JavaScript interpretiert deine Felder offensichtlich als Strings. Da die Sprache keine Typdeklaration kennt, interpretiert sie Variablen so, wie sie das gerade für wahrscheinlich hält bzw. nach den Werten, die zugewiesen werden. a=123 erzeugt eine Integer-Variable.

In deinem Fall interpretiert JS die Felder also als Strings und die Addition von Strings entspricht der Konkatenation, also Aneinanderreihung.

Entweder gibt es eine Möglichkeit, deine Felder als numerische Felder zu deklarieren (dann dürfen da aber nur Zahlen drin stehen) oder du musst die Werte "konvertieen", was in der Form in JavaSkript gar nicht möglich ist. Vielmehr kennt JS Funktionen, die zum Beispiel den Integer-Wert eines Strings ermitteln (parseInt())

Dort steht es ausführlich beschrieben.

Du bist somit gerade über einen wesentlichen Nachteil impliziter Typdeklaration gestoßen.
 
wie üblich herzlichen dank für link und erklärung :)
ich hätte nochmals eine frage, welche damit hoffentlich auch die letzte sein wird :)

es geht um folgenden code:

Code:
    var breakpoints = new Array();
    var breakpoints1 = new Array();
    var breakpoints2 = new Array();

    while (breakpoints1.length > 0) { breakpoints.pop(); }
    while (breakpoints2.length > 0) { breakpoints.pop(); }
    while (breakpoints.length > 0) { breakpoints.pop(); }
    [color=gold]arrays löschen[/color]
    var temp3 = 0;

    if ((fertigkeiten[document.myform.skill.value][2] == 1) && (document.myform.zweitwaffe.value > 0))
    [color=gold]ausführen bei standartangriff bei verwendung von zwei waffen[/color]
    {
      for (i=100+SIAS-WSMprimär; i <= 175; i++)
      {
        frames = waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][0];
        [color=gold]in abhängigkeit von waffe und char benötigte frames auslesen[/color]
        ergebnis = berechneFPA(frames,i,0);
        [color=gold]frames in angriffsdauer umrechnen[/color]
        frames = waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][1];
        [color=gold]frames der dazugehörigen A2 animation ermitteln[/color]
        ergebnis2 = berechneFPA(frames,i,0);
        [color=gold]angriffsdauer errechnen[/color]
        ergebnis = (ergebnis + ergebnis2)/2;
        [color=gold]mittelwertbildung beider angriffe da abwechselnd eingesetzt[/color]
        if (temp3 != ergebnis)
        {
          breakpoints1.push([Math.ceil(120*(i-100-SIAS+WSMprimär)/(120-(i-100-SIAS+WSMprimär)))-IASprimär,ergebnis]);
          temp3 = ergebnis;
        }
        [color=gold]bei änderung der angriffsdauer mit steigendem i die zahl der ticks und das benötigtes IAS als array im array breakpoints1 speichern[/color]
        if ((breakpoints1.length > 0) && (breakpoints1[0][0] < 0) && (ergebnis > (berechneFPA(waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][0],175,0) + berechneFPA(waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][1],175,0))/2)) { breakpoints1.pop(); }
        if ((breakpoints1.length > 0) && (breakpoints1[0][0] < 0) && (ergebnis == (berechneFPA(waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][0],175,0) + berechneFPA(waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][1],175,0))/2)) { breakpoints1[0][0] = 0; }
        [color=gold]wenn ermittelter IAS-wert negativ, eintrag löschen. sollte es der letzte eintrag sein (weil die geschwindigkeit gleich der maximalgeschwindigkeit ist) und der IAS-wert ist negativ, so wird er auf 0 gesetzt[/color]
      }
      while (breakpoints2.length > 0) { breakpoints2.pop(); }
      temp3 = 0;
      [color=gold]temp3 für zweite hälte des angriffes wieder auf 0 setzen[/color]

      for (i=100+SIAS-WSMsekundär; i <= 175; i++)
      {
        ergebnis = berechneFPA(12,i,0);
        if (temp3 != ergebnis)
        {
          breakpoints2.push([Math.ceil(120*(i-100-SIAS+WSMsekundär)/(120-(i-100-SIAS+WSMsekundär)))-IASsekundär,ergebnis]);
          temp3 = ergebnis;
        }
        [color=gold]berechne breakpoints für zweite hälte des angriffes, diesmal fixe anzahl an frames[/color]
        if ((breakpoints2.length > 0) && (breakpoints2[0][0] < 0) && (ergebnis > berechneFPA(12,175,0))) { breakpoints2.pop(); }
        if ((breakpoints2.length > 0) && (breakpoints2[0][0] < 0) && (ergebnis == berechneFPA(12,175,0))) { breakpoints2[0][0] = 0; }
      }
      [color=gold]arrays mit negativem IAS-wert erneut löschen[/color]


[color=gold](bis hierhin arbeitet das programm noch, in gewisser hinsicht zumindest.
die arrays werden gelöscht, richtig mit den errechneten breakpoints beschrieben
und jene breakpoints mit einem IAS-wert unter null werden gelöscht.
allerdings funktioniert es bloß einmalig. wenn ich die funktion nochmals aufrufen
will, erhalte ich die fehlermeldung "ein skript auf dieser seite
ist momenten beschäftigt oder es antwortet nicht mehr. sie können das skript
jetzt stoppen oder fortsetzen, um zu sehen, ob das skript fertig wird.)[/color]


      for (i=0; i <= Math.max(breakpoints1[breakpoints1.length-1][0],breakpoints2[breakpoints2.length-1][0]); i++)
      [color=gold]anzahl der schleifendurchläufe entspricht dem größten IAS-wert aus breakpoints1 bzw breakpoints2. hier scheint kein fehler zu stecken, da ich den langen ausdruck auch gegen eine zahl eintauschen kann und die funktion trotzdem nicht arbeitet.[/color]
      {
        if (breakpoints1[0][0] == i)
        {
          breakpoints.push(breakpoints1[0]);
          breakpoints1.shift();
        }
        [color=gold]wenn erster IAS-wert in breakpoints1 gleich i ist, kopiere den ersten eintrag von breakpoints1 in breakpoints und lösche ersten eintrag in breakpoints1[/color]
        if (breakpoints2[0][0] == i)
        {
          breakpoints.push(breakpoints2[0]);
          breakpoints2.shift();
        }
        [color=gold]wenn erster IAS-wert in breakpoints2 gleich i ist, kopiere den ersten eintrag von breakpoints2 in breakpoints und lösche ersten eintrag in breakpoints2[/color]

[color=gold](da array.shift() immer das erste element eines arrays löscht
und alle nachfolgenden eine stelle vorrücken, muss ich in beiden fällen
bloß immer das erste element abfragen und löschen.)[/color]

        if (breakpoints[breakpoints.length-1][0] == breakpoints[breakpoints.length-2][0])
        {
          breakpoints[breakpoints.length-2].value = [i,(breakpoints[breakpoints.length-2][1] + breakpoints[breakpoints.length-1][1])/2]
          breakpoints.pop();
        }
[color=gold]sollten zu einem IAS-wert (i) beide hälften des angriffes einen breakpoint haben,
dann stehen beide bereits in breakpoints drinnen. daher vergleiche ich die IAS-werte
des letzten (length-1) und vorletzen (length-2) eintrages. stimmen sie überein,
ändere ich den wert der angriffsdauer des vorletzen eintrages auf den mittelwert
der angriffsdauern der letzten beiden einträge und lösche im anschluss
mit breakpoints.pop() den letzten, nun unbenötigten eintrag aus breakpoints.[/color]
      }
    }

hier nochmal der code ohne kommentare, falls diese beim durchsehen stören sollten:

Code:
    var breakpoints = new Array();
    var breakpoints1 = new Array();
    var breakpoints2 = new Array();

    while (breakpoints1.length > 0) { breakpoints.pop(); }
    while (breakpoints2.length > 0) { breakpoints.pop(); }
    while (breakpoints.length > 0) { breakpoints.pop(); }
    var temp3 = 0;

    if ((fertigkeiten[document.myform.skill.value][2] == 1) && (document.myform.zweitwaffe.value > 0))
    {
      for (i=100+SIAS-WSMprimär; i <= 175; i++)
      {
        frames = waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][0];
        ergebnis = berechneFPA(frames,i,0);
        frames = waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][1];
        ergebnis2 = berechneFPA(frames,i,0);
        ergebnis = (ergebnis + ergebnis2)/2;
        if (temp3 != ergebnis)
        {
          breakpoints1.push([Math.ceil(120*(i-100-SIAS+WSMprimär)/(120-(i-100-SIAS+WSMprimär)))-IASprimär,ergebnis]);
          temp3 = ergebnis;
        }
        if ((breakpoints1.length > 0) && (breakpoints1[0][0] < 0) && (ergebnis > (berechneFPA(waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][0],175,0) + berechneFPA(waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][1],175,0))/2)) { breakpoints1.pop(); }
        if ((breakpoints1.length > 0) && (breakpoints1[0][0] < 0) && (ergebnis == (berechneFPA(waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][0],175,0) + berechneFPA(waffengattung[waffen[document.myform.waffe.value][2]][document.myform.char.value][1],175,0))/2)) { breakpoints1[0][0] = 0; }
      }
      while (breakpoints2.length > 0) { breakpoints2.pop(); }
      temp3 = 0;

      for (i=100+SIAS-WSMsekundär; i <= 175; i++)
      {
        ergebnis = berechneFPA(12,i,0);
        if (temp3 != ergebnis)
        {
          breakpoints2.push([Math.ceil(120*(i-100-SIAS+WSMsekundär)/(120-(i-100-SIAS+WSMsekundär)))-IASsekundär,ergebnis]);
          temp3 = ergebnis;
        }
        if ((breakpoints2.length > 0) && (breakpoints2[0][0] < 0) && (ergebnis > berechneFPA(12,175,0))) { breakpoints2.pop(); }
        if ((breakpoints2.length > 0) && (breakpoints2[0][0] < 0) && (ergebnis == berechneFPA(12,175,0))) { breakpoints2[0][0] = 0; }
      }

      for (i=0; i <= Math.max(breakpoints1[breakpoints1.length-1][0],breakpoints2[breakpoints2.length-1][0]); i++)
      {
        if (breakpoints1[0][0] == i)
        {
          breakpoints.push(breakpoints1[0]);
          breakpoints1.shift();
        }
        if (breakpoints2[0][0] == i)
        {
          breakpoints.push(breakpoints2[0]);
          breakpoints2.shift();
        }
        if (breakpoints[breakpoints.length-1][0] == breakpoints[breakpoints.length-2][0])
        {
          breakpoints[breakpoints.length-2].value = [i,(breakpoints[breakpoints.length-2][1] + breakpoints[breakpoints.length-1][1])/2]
          breakpoints.pop();
        }
      }
    }
ich hoffe jemand kann mir dabei helfen.

mfg
 
man verzeihe mir den doppelpost, aber ich sehe ich habe vergessen den zweiten fehler zu erwähnen :wand: und will nicht, dass dies dann vieleicht überlesen wird.

der zweite fehler bezieht sich auf den zweiten programmteil, der beide arrays zu einem einzigem zusammenfassen soll (hier nochmal der code):

Code:
for (i=0; i <= Math.max(breakpoints1[breakpoints1.length-1][0],breakpoints2[breakpoints2.length-1][0]); i++)
      {
        if (breakpoints1[0][0] == i)
        {
          breakpoints.push(breakpoints1[0]);
          breakpoints1.shift();
        }
        if (breakpoints2[0][0] == i)
        {
          breakpoints.push(breakpoints2[0]);
          breakpoints2.shift();
        }
        if (breakpoints[breakpoints.length-1][0] == breakpoints[breakpoints.length-2][0])
        {
          breakpoints[breakpoints.length-2].value = [i,(breakpoints[breakpoints.length-2][1] + breakpoints[breakpoints.length-1][1])/2]
          breakpoints.pop();
        }
      }

durch das aufwärstzählen von i (entspricht dem IAS), dem abfragen der ersten elemente und dem löschen aller kopierten elemente sollten alle IAS-werte ins array breakpoints geschriben werden. die schleife wird auch öfters durchlaufen, dass habe ich schon getestet. wenn ich mir nun allerdings das array breakpoints ausgeben lasse, stehen nicht alle breakpoints drinnen, sondern nur die ersten beiden, welche 0 IAS benötigen.

den fehler bezüglich des zweitmaligen aufrufs hab ich übrigens schon gelöst, ich hab mich wieder mal beim copy und paste vertan (ersten drei zeilen, ich lösche immer das gleiche anstatt allen arrays...).

tut mir leid wegen dem doppelpost und der unnötigen arbeit, die sich jemand möglicherweise bereits gemacht hat und hoffentlich kann mir jemand den zweiten fehler erklären.

mfg
 
Zurück
Oben