Schleife wird nur einmalig ausgeführt
Enrico
- javascript
Hallo,
ich kann ein - für mich nicht nachvollziehbares - Verhalten bei der Ausführung einer JavaScript-Schleife nicht nachvollziehen.
Ich habe folgendes (hier gekürztes) Array definiert...
Hauptmenue = new Array ("Startseite", "Wir über uns", "Rüstzeug", "Waffen", "Gewandung", "Schmuck");
...und arbeite es mittels folgender Schleife ab:
for (i = 0, l = Hauptmenue.length; i < l; i++)
{
Sidebar += '<div class="Button">' + Hauptmenue[i] + '</div>';
Arrayname = TextBereinigen(Hauptmenue[i]);
alert(Arrayname);
}
function TextBereinigen(Text)
{
if (Text.indexOf(" ") !== -1)
{
Worter = Text.split(" ");
Text = "";
for (i = 0, l = Worter.length; i < l; i++)
{
Worter[i] = Worter[i].substr(0, 1).toUpperCase() + Worter[i].substr(1);
Text = Text.concat(Worter[i]);
}
}
Text = Text.str_replace(["Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "/"], ["Ae", "ae", "Oe", "oe", "Ue", "ue", "ss", ""]);
return Text;
}
In dieser Konstellation wird mir die Schleife nur einmalig ausgeführt.
Lasse ich hingegen den Aufruf der Textbereinigungsfunktion weg und ersetze im alert-Befehl "Arrayname" gegen "Hauptmenue[i]", so werden mir alle Elemente ausgegeben.
Woran liegt dies?
Vielen Dank für eure Hilfe und Gruß,
Enrico
Hi,
Lasse ich hingegen den Aufruf der Textbereinigungsfunktion weg und ersetze im alert-Befehl "Arrayname" gegen "Hauptmenue[i]", so werden mir alle Elemente ausgegeben.
Woran liegt dies?
verfluchte globale Variablen aber auch!
Deine Laufvariable i wird in beiden Programmteilen verwendet - und beidesmal dieselbe, weil die global ist.
Das ist gar nicht schön.
Ciao,
Martin
Hallo Enrico,
Ich kann meine Tipps nur wiederholen:
»Jedenfalls rate ich dir, dich genauer mit JavaScript zu beschäftigen. Z.B. in dem du ein gutes Buch durcharbeitest.«
»Code sollte bestenfalls in wiederverwendbaren Funktionen strukturiert werden, welche lokale anstatt globale Variablen verwenden. Du verwendest überall globale Variablen ohne »var«. Variablen sollten auch mit Kleinbuchstaben beginnen, das ist eine sinnvolle Konvention, um sie von Konstruktoren zu unterscheiden.«
»[…] entspricht new Array(…), allerdings ist es schneller, einfacher zu schreiben und eindeutig.«
Ich habe diese Tipps gegeben, weil ich denke, dass sie dir das Programmieren vereinfachen und sie helfen, Fehler zu vermeiden. Lokale Variablen z.B. sind enorm wichtig. Das ist eine JavaScript-Grundlage, die ein gutes Buch vermittelt.
Text = Text.str_replace(["Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "/"], ["Ae", "ae", "Oe", "oe", "Ue", "ue", "ss", ""]);
String-Objekte haben keine str_replace-Methode (das hört sich stark nach PHP an). Hast du den STring-Prototype entsprechend erweitert oder wo kommt diese Funktion her?
Es gibt in JavaScript die http://de.selfhtml.org/javascript/objekte/string.htm#replace@title=replace-Methode. Diese erwartet als ersten Parameter einen String oder einen RegExp und als zweiten Parameter einen String.
Mehrere Ersetzungen lassen sich mit einer Schleife vornehmen. Man sollte auch nicht vergessen, den global-Flag (g) zu benutzen, sonst wird immer nur das erste Vorkommen ersetzt. Beispiel:
var search = ['a', 'b', 'c'];
var replace = ['x', 'y', 'z'];
var text = 'abc';
for (var i = 0, l = ; i < l; i++) {
// Erzeuge neuen regulären Ausdruck
// Die Eingabe muss ggf. escaped werden
var regexp = new RegExp(search[i], 'g'); // g bedeutet: Ersetze alle Vorkommen
text = text.replace(regexp, replace[i]);
}
Mathias
Hallo molily und Martin,
jetzt ist dieser Groschen gefallen :-)
Verwende ich in jeder Funktion vor einer Variable "var", dann wird nichts überschrieben und es funktioniert :-)
Danke euch beiden! :-)
Gruß,
Enrico