Der Martin: Preisberechnung mit JavaScript (dynamisches Formular)

Beitrag lesen

Hi,

eine Bitte vorab: Du stellst selbst schon fest, dass dein Problem in erster Linie ein Javascript-Problem ist. Warum machst du es potentiellen Helfern dann komplizierter als nötig, indem du den PHP-Code postest, der das JS erzeugt?
--> Damit wollte ich den gesamten Code posten, um z.B. Probleme zu erkennen wie, dass ich das gar nicht in ein Array schreibe...

ja, gut gedacht; besser wäre trotzdem gewesen, den Quellcode so zu zeigen, wie er im Browser ankommt.

Diese Funktion wird durch den Eventhandler des input-Elements aufgerufen. Was repräsentiert "this" also in diesem Kontext? - Genau, das input-Elementobjekt selbst.
--> das this. habe ich eingefügt, um die Felder in dem Formular auf dieser Seite anzusprechen - aber ich merk schon, das ist vermutlich sinnlos und ich kann es weglassen^^ :-)

Neineinein, weglassen nicht. Es ist ja durchaus praktisch zu verwenden. Wie gesagt, this ist hier eine Referenz auf das Formularelement selbst, in dessen Kontext es aufgerufen wird. Ein Formularelement hat aber seinerseits wieder eine Eigenschaft namens form, die auf das übergeordnete Formular verweist. Damit kommt man dann an die restlichen Formularelemente dran.

Außerdem lässt du dich verleiten, die Javascript-Objekte, die den input-Elementen entsprechen, als Arrays anzusprechen, nur weil du ihnen Namen gegeben hast, die eckige Klammern enthalten. Das ist falsch. Dein input-Element hat beispielsweise den Namen "preis[3]", das ist kein Array, in dem du das Element mit dem Index 3 adressieren kannst!
--> wie kann ich dann arrays erzeugen? ich will ja dann das Formualar absenden und die Daten wiederrum dynamisch, je nach dem wie viele Zeilen es sind, in eine Datenbank schreiben...

Du bist in der unangenehmen Situation, dass du die Daten einmal mit Javascript und einmal mit PHP auswerten willst, und die beiden Sprachen verhalten sich da unterschiedlich. Betrachten wir ein Beispiel.

<form name="colorselect" method="get" action="">  
 <input type="checkbox" name="color[]" value="red"   /> Rot  
 <input type="checkbox" name="color[]" value="green" /> Grün  
 <input type="checkbox" name="color[]" value="blue"  /> Blau  
 <input type="submit" value="Absenden" />  
</form>

Wird dieses Formular abgesendet und zur Auswertung an ein PHP-Script übergeben, dann erzeugt PHP aufgrund der Array-Klammern an den Feldnamen automatisch ein Array mit dem Namen color und bis zu drei Elementen.

Mit Javascript greifen wir "normalerweise" über formularreferenz.feldname auf eines der Felder zu. Da der Feldname hier aber Sonderzeichen enthält, die als Name einer Eigenschaft in einem JS-Obkekt nicht erlaubt sind, müssen wir eine alternative Form der Adressierung verwenden, nämlich formularreferenz.elements["feldname"].
Wenn mehrere Elemente mit dem gleichen Namen in einem Formular vorkommen, macht Javascript sogar automatisch ein Array daraus, so dass wir die drei Checkbox-Elementobjekte hier mit
 document.forms.colorsel.elements["color[]"][n]
ansprechen können, wobei n der Index (0,1,2) des Feldes ist.

Wenn wir jetzt noch das Pseudoojekt this wieder ins Spiel bringen, können wir das Formular selbst etwas einfacher adressieren. Angenommen, die Checkbox-Felder hätten noch einen onclick-Handler, dann wäre innerhalb der Eventhandler-Funktion this wieder ein Alias für das Checkbox-Objekt selbst, und mit
 this.form.elements["color[]"][n]
können wir die Nachbarelemente adressieren.

So, das war jetzt viel auf einmal. Aber das sollte erstmal genug Material sein, mit dem du deine Struktur mal etwas "auf Vordermann" bringen kannst.

--> Die Funktion steht im Kopf der PHP Seite, d.h. im HTML-Header-Tag, und wird ja von dem einzigen Formular auf dieser Seite aufgerufen.

Du meinst nicht Header, sondern head, und im head-Tag steht sie ganz gewiss nicht, höchstens im head-Element. Aber das ist nicht relevant, deswegen fragte ich ganz bewusst: Wie und in welchem Element-Kontext wird sie aufgerufen?

Eine weitere Frage noch: Stimmt es, dass disabled-Felder auch von JS nicht geändert werden können?

Nein.

So long,
 Martin

--
Schon gewusst, dass Aftershave trotz des Namens eigentlich eher fürs Gesicht gedacht ist?
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(