js Files und Arrays (Grenzen)
Markus
- javascript
Hallo erstmal,
ich sitze hier gerade an einem kleinen Problem, bzw. an zwei.
Ich gebe in einem Formulartextfeld "K18" ein und möchte, wenn ich das Formular absende (Übergabe über "get", das kann man mit JavaScript ja problemlos auslesen) die Datei K18.js im gleichen Verzeichnis mit einbinden. Also letztlich sollte im Quelltext folgendes stehen:
<script type="text/javascript" src="K18.js"></script>
Wie geht das? Ich habe NUR html und JavaScript zur Verfügung.
Das zweite Problem:
Ich definiere im Kopf folgendes:
var data = new Array();
Nun habe ich verschiedene .js Files in denen etwa immer folgendes steht:
data[0] = new Object();
data[0]["Name"] = "Max";
data[0]["Nachname"] = "Mustermann";
data[1] = new Object();
data[1]["Name"] = "Maxi";
data[1]["Nachname"] = "Mustermann";
Und so weiter. D.h. in jeder der Dateien beginnt das Array ab 0. Würde ich nun zwei oder mehr Dateien einbinden überschreibt die Letzte immer die Vorangehende. Nun habe ich mir überlegt, die Nummer durch alle .js Files fortlaufend zu machen (wäre von meiner Seite aus kein Problem). D.h. eine Datei beginnt wegen mir bei 9 und hört bei 15 auf. Es kann aber auch sein, dass, und das ist der Knackpunkt, 11 und 13 fehlen. Damit hätte die Datei gesamt nur 5 anstelle von 7 Sätzen.
Wie kann ich nun eine Schleife über alle existierenden Datensätze machen? Mit einer Unter- und Obergrenze des Arrays wäre es ja möglich, nicht aber mit .lenght.
Ich hoffe man versteht mein Problem. Wer weiß rat?
Viele Grüße,
Markus
hi,
Ich gebe in einem Formulartextfeld "K18" ein und möchte, wenn ich das Formular absende (Übergabe über "get", das kann man mit JavaScript ja problemlos auslesen) die Datei K18.js im gleichen Verzeichnis mit einbinden. Also letztlich sollte im Quelltext folgendes stehen:
<script type="text/javascript" src="K18.js"></script>
Wie geht das? Ich habe NUR html und JavaScript zur Verfügung.
location.search auswerten, Script-Element dynamisch erstellen bzw. per document.write beim Laden der Seite hineinschreiben.
Und so weiter. D.h. in jeder der Dateien beginnt das Array ab 0. Würde ich nun zwei oder mehr Dateien einbinden überschreibt die Letzte immer die Vorangehende. Nun habe ich mir überlegt, die Nummer durch alle .js Files fortlaufend zu machen (wäre von meiner Seite aus kein Problem). D.h. eine Datei beginnt wegen mir bei 9 und hört bei 15 auf. Es kann aber auch sein, dass, und das ist der Knackpunkt, 11 und 13 fehlen. Damit hätte die Datei gesamt nur 5 anstelle von 7 Sätzen.
Ist die Reihenfolge egal, oder "brauchst" du ggf. die Lücken?
Du könntest auf die Vorgabe des Index verzichten, und stattdessen per push() immer neue Elemente ans Ende des Arrays anfügen (oder auch über den dort genannten Workaround mittels length).
Wie kann ich nun eine Schleife über alle existierenden Datensätze machen? Mit einer Unter- und Obergrenze des Arrays wäre es ja möglich, nicht aber mit .lenght.
Die for in-Schleife würde dir erlauben, über alle Eigenschaften des Objektes "Array" zu iterieren - allerdings bekommst du dann auch Eigenschaften wie length und ggf. weitere mitgeliefert, und müsstest diese erst mal von deinen wirklichen Einträgen unterscheiden.
gruß,
wahsaga
n'abend,
Ich gebe in einem Formulartextfeld "K18" ein und möchte, wenn ich das Formular absende (Übergabe über "get", das kann man mit JavaScript ja problemlos auslesen) die Datei K18.js im gleichen Verzeichnis mit einbinden. Also letztlich sollte im Quelltext folgendes stehen:
<script type="text/javascript" src="K18.js"></script>
/*
* dynamisches nachladen einer javascript datei
*/
// create <script> element
var scriptElem = document.createElement('script');
scriptElem.type = 'text/javascript';
scriptElem.src = 'path/to/javascriptfile.js';
var head = document.getElementsByName('head')[0];
if( head )
head.appendChild( scriptElem );
wäre ein möglicher Ansatz.
Das zweite Problem:
Ich definiere im Kopf folgendes:
var data = new Array();
Nun habe ich verschiedene .js Files in denen etwa immer folgendes steht:
data[0] = new Object();
data[0]["Name"] = "Max";
data[0]["Nachname"] = "Mustermann";data[1] = new Object();
data[1]["Name"] = "Maxi";
data[1]["Nachname"] = "Mustermann";
Und wenn du das ganze etwas "dynamisierst"? Sodass jede deiner Data-Dateien etwa so aussieht:
/*
* schauen wir mal, ob data schon existiert,
* wenn nicht, dann legen wir es neu an.
*/
if( !data ) var data = Array();
/*
* die länge des arrays gibt uns immer den nächsten freien index
* beim ersten mal ist das natürlich 0 ;)
*/
var i; /* i enthält den aktuellen index */
i = data.length;
data[ i ] = new Objekt();
data[ i ]['Name'] = 'Jon Doe 1';
i = data.length;
data[ i ] = new Objekt();
data[ i ]['Name'] = 'Jon Doe 2';
i = data.length;
data[ i ] = new Objekt();
data[ i ]['Name'] = 'Jon Doe 3';
Vielleicht hilft dir das ein wenig weiter.
weiterhin schönen abend...
Hallo,
deine Antwort hilft mir auf jeden Fall schon sehr weiter. Da werde ich morgen bei der Arbeit weiter probieren.
Nur das i = data.length;, das sich ständig wiederholt stört mich, da ich in dem Array am schluss etwa 14.000 Elemente habe und das dann in Sachen Dateigröße ordentlich zu Buche schlägt.
Auf jeden Fall schon einmal vielen Dank.
Viele Grüße,
Markus
n'abend,
Nur das i = data.length;, das sich ständig wiederholt stört mich, da ich in dem Array am schluss etwa 14.000 Elemente habe und das dann in Sachen Dateigröße ordentlich zu Buche schlägt.
das kannst du dir auch nur am Anfang holen, damit du weisst wo du stehst. Nach jedem Datensatz dann ein nettes kleines i++;
und du bist beim nächsten Index.
weiterhin schönen abend...
das kannst du dir auch nur am Anfang holen, damit du weisst wo du stehst. Nach jedem Datensatz dann ein nettes kleines
i++;
und du bist beim nächsten Index.
So habe ich mir das schon eher vorgestellt. Wäre ein Konstrukt nach folgender Art auch denkbar?
data[i++]['Name'] = Mustermann;
Viele Grüße,
Markus
n'abend,
So habe ich mir das schon eher vorgestellt. Wäre ein Konstrukt nach folgender Art auch denkbar?
data[i++]['Name'] = Mustermann;
data[i++]['Name'] = Mustermann;
data[i++]['VerheiratetMit'] = Mustermann;
data[i++]['Kind1'] = Mustermann;
data[i++]['Kind2'] = Mustermann;
wenn du dir das so dachtest, dann NEIN! So funktioniert das nicht. i++; erhöht i um eins - und das bei jedem aufruf. Sprich, warst du vor diesem Datensatz beim Index 0, so bist du danach beim Index 4.
data[i++]['Name'] = Mustermann;
data[i]['VerheiratetMit'] = Mustermann;
data[i]['Kind1'] = Mustermann;
data[i]['Kind2'] = Mustermann;
wäre da schon richtiger.
Aus stilgründen würde ich Freunden, wie "i++;", immer eine eigene Zeile gönnen. Der Code ist sonst kaum lesbar.
weiterhin schönen abend...
hi,
data[i++]['Name'] = Mustermann;
data[i]['VerheiratetMit'] = Mustermann;
data[i]['Kind1'] = Mustermann;
data[i]['Kind2'] = Mustermann;
>
> wäre da schon richtiger.
Vielleicht lohnt es sich an so einer Stelle, gleich ein wenig mehr in Richtung OOP zu gehen - und ein Objekt definieren, welches benötigten Eigenschaften gleich als Parameter für seine Konstruktor-Methode übergeben bekommt.
data[data.length] = new Wasauchimmer( "Mustermann", "Musterfrau", "Musterkind1", "Musterkind2");
gruß,
wahsaga
--
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }
n'abend,
Vielleicht lohnt es sich an so einer Stelle, gleich ein wenig mehr in Richtung OOP zu gehen - und ein Objekt definieren, welches benötigten Eigenschaften gleich als Parameter für seine Konstruktor-Methode übergeben bekommt.
Das lohnt in jedem Fall.
Objektorientiertes Arbeiten ermöglicht hier nicht nur wiederverwendbare und einfachere Strukturen. Dem OP scheint auch die Dateigröße seiner Javascripts wichtig zu sein. Mit deinem Beispiel wird er die Größe nochmal erheblich senken können.
IMHO ist es jedoch nicht so einfach von jetzt auf gleich in diesen Strukturen zu denken. Um den OP nicht zu verwirren war mir die Beantwortung seiner Frage(n) erstmal wichtiger.
weiterhin schönen abend...
Da ich schon länger in anderen Sprachen programmiere habe ich durchaus verstanden, was wahsaga mir mitteilen will. Der Vorschlag ist sogar äußerst praktisch da wirklich jedes kb der Datei zählt.
Dass ich nicht in jeder zeile data[i++] verwenden darf war mir klar. Daher habe ich es auch nur in der ersten eines jeden neuen Objektes getan. Leider funktionierte die Sache dann nicht mehr.
Euch beiden jedenfalls vielen Dank, eure Anregungen helfen mir sehr weiter.
Viele Grüße,
Markus
Dass ich nicht in jeder zeile data[i++] verwenden darf war mir klar. Daher habe ich es auch nur in der ersten eines jeden neuen Objektes getan. Leider funktionierte die Sache dann nicht mehr.
Hätte mich auch gewundert. i++ ist der postinkrementator, d.h in dem Falle i wird nach dem Gebrauch um eins erhöht.
Wenn überhaupt, dann so:
data[++i]['Name'] = Mustermann;
data[i]['VerheiratetMit'] = Mustermann;
data[i]['Kind1'] = Mustermann;
data[i]['Kind2'] = Mustermann;
Dann hat der ganze Datensatz das Gleiche i. Aber aus Gründen der Übersichtlichkeit und der Fehlervermeidung würd ich das nie so machen, ausserdem kannst du hier noch die literale Schreibweise verwenden:
data[i] = {
Name: 'Mustermann',
VerheiratetMit: 'Mustermann',
Kind1: 'Mustermann',
Kind2: 'Mustermann'
};
Wobei Kind eigentlich ein Array wäre.
Das spart aber noch mal ein paar Bytes
Struppi.