Variablen in Var deklarieren

darkpriest

Mitglied
Hallo ins Forum,

ich möchte für ein Kalkulationsschema Werte aus einem Formular entnehmen. Diese Variante möchte ich nun vereinfachen, leider habe ich dabei folgendes Problem:

Code:
frm=document.form1;

var variablen = new Array("neuwagenlpnettoid"); // hier sollen noch mehr werte rein



for (var i = 0; i < variablen.length; i++) {

var document.forms["form1"].elements[variablen[i]].id = (document.forms["form1"].elements[variablen[i]].value.replace(",", ".")); 

}

In dem Array "Variablen" möchte ich alle Werte reinschreiben, die ausgelesen werden sollen und die Zahlen umgewandelt! Leider bekomme ich immer wieder die Fehlermeldung "Objekt erwartet".

Kann ich diese Zeilen überhaupt so erstellen?

Wäre für jeden Tipp sehr dankbar!

Darkpriest
 
Hi,

anhand deines Codeschnipsels ist nicht zu erkennen, woran der Fehler liegen könnte. Folgendes Konstrukt funktioniert bei mir problemlos:
Code:
<html>
<head>
<meta name="author" content="Quaese">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
	<!--
frm=document.form1;
var variablen = new Array("neuwagenlpnettoid"); // hier sollen noch mehr werte rein

function theFunc(){
  for (var i=0; i < variablen.length; i++) {
    document.forms["form1"].elements[variablen[i]].id = document.forms["form1"].elements[variablen[i]].value.replace(/,/g, ".");
    alert(document.forms["form1"].elements[variablen[i]].id);
  }
}
	//-->
</script>
</head>
<body>
<form name="form1">
	<input type="text" name="neuwagenlpnettoid" value="1,234">
  <button onclick="theFunc()">theFunc()</button>
</form>
</body>
</html>
Ciao
Quaese
 
Hallo,

erstmal danke für deine Antwort!

Leider bringe ich meine Funktion nicht zum Laufen! Wahrscheinlich ist da ein Denkfehler von mir drin!

Zur Erklärung: Ich habe ein größerers Formular, in dem mehrere Berechnungen mit Javascript erfolgen sollen! Ich benötige dazu ca. 30 Felder, die ich in der zuerst aufgerufenen Funktion wie folgt einfüge:

Code:
var neuwagenlpnettoid 				= frm.neuwagenlpnettoid.value.replace(",", ".");

usw.

Dann erfolgen meine Berechnung und dann gebe ich die Werte wieder mit

Code:
frm.neuwagenlpnettoid.value			= (Number(neuwagenlpnettoid)).toFixed(2).replace(".", ",");

zurück an das Formular!

Das oben angeführte Feld kommt aber auch noch in 2 anderen Funktionen vor, die aber erst beim ändern von Feldern aufgerufen werden! Wie und vorallem wo muß ich die Felder definieren?

Meine jetzige Funktion funktioniert zwar, benötigt aber viel sich wiederholenden Quelltext, dies wollte ich mit Hilfe von Arrays vermeiden! Aber irgendwie will es nicht! Ich bekomme entweder die Meldung "Objekt erwartet" oder "document.forms.form1.elements ist Null oder kein Objekt"!

Habe ich einen strukturellen Fehler in meinem Script? Hat jemand einen Vorschlag, wie man das einfacher und sauberer lösen kann, anstatt den selben Quelltext, 30 mal aufzuführen?

Wäre für jede Hilfe sehr dankbar!

Vielen Dank!

Darkpriest
 
Hi.
Das oben angeführte Feld kommt aber auch noch in 2 anderen Funktionen vor, die aber erst beim ändern von Feldern aufgerufen werden! Wie und vorallem wo muß ich die Felder definieren?
Wenn du die Felder in verschiedenen Funktionen brauchst, dann solltest du sie global definieren.
Meine jetzige Funktion funktioniert zwar, benötigt aber viel sich wiederholenden Quelltext, dies wollte ich mit Hilfe von Arrays vermeiden! Aber irgendwie will es nicht! Ich bekomme entweder die Meldung "Objekt erwartet" oder "document.forms.form1.elements ist Null oder kein Objekt"!
Anscheinend gibt es kein Forumular auf deiner Seite mit dem Namen "form1". Kann es sein, das du evtl. diese Funktion schon aufrufst, bevor die Seite vollständig geladen ist?

Gruß
 
Hallo,

danke für deine Antwort!

Ich rufe die Funktion auf, bevor das eigentliche Formular geladen wird. Dies habe ich darum gemacht, damit immer sofort alles berechnet wird!

Wie kann ich denn dieses Problem umgehen bzw. wie macht man das dann?

Vielen Dank!

Darkpriest
 
Hi.
Ich rufe die Funktion auf, bevor das eigentliche Formular geladen wird. Dies habe ich darum gemacht, damit immer sofort alles berechnet wird!

Wie kann ich denn dieses Problem umgehen bzw. wie macht man das dann?
Man würde die Funktion erst aufrufen wenn die Seite und somit auch die form geladen ist, also in der window.onload Funktion.

Zeig doch mal den kompletten HTML Code deiner Seite, sonst ist das mehr oder weniger ein Herumraten.

Gruß
 
Hallo,

ich mache folgenden Aufruf:

Code:
</head>

<body onLoad="formular(<?php echo $formular; ?>); gw(<?php echo $gwhereinin; ?>); doLiveRes(<?php echo $kalkschema; ?>); ausgabe()"  >

Der Javascript Funktion doLiveRes muß ich einen PHP-Paramter übergeben. Ich habe dieses Event verwendet, damit beim Öffnen die Berechnung sofort durchgeführt wird.

Das Formular:

Code:
<form style="width:800px;" action=" <?php print $_SERVER['PHP_SELF'] . "?" . "id=" . $id; ?>" method="post" id="Verwaltungsunterlage" name="form1" >

Code:
<label id="neuwagenlpnettobez" for="name" class="info" >Neuwagen Listenpreis netto</label><input type="text" id="neuwagenlpnettoid" name="kalk[neuwagenlpnettoin]" value="0,00" class="infofield" tabindex="" onBlur="doLiveRes(); leave(this)" onFocus="enter(this)"  ></input>

Meine Javascript - Datei schaut nun so aus:

Code:
var provsys;
var kalk;
var systemnw;
var systemgw;
var frm=document.form1;


function donachlass(test){

frm=document.form1;

neuwagenlpnettoid 							= frm.neuwagenlpnettoid.value.replace(",", ".");
nachlassinprozentid 						= frm.nachlassinprozentid.value.replace(",", ".");
nachlassid									= frm.nachlassid.value.replace(",", ".");

nachlassid 									= neuwagenlpnettoid / 100 * nachlassinprozentid;

frm.nachlassid.value 						= nachlassid.toFixed(2).replace(".", ",");

doLiveRes()

}

function zuschuss(wert){

sonderpraemieid = frm.sonderpraemieid.value.replace(",", ".");

if (sonderpraemieid <= 10) {

frm=document.form1;


neuwagenlpnettoid = frm.neuwagenlpnettoid.value.replace(",", ".");


sonderpraemieid = neuwagenlpnettoid / 100 * sonderpraemieid;

frm.sonderpraemieid.value = sonderpraemieid.toFixed(2).replace(".", ",");

doLiveRes()

}

}



function doprozent(test){

frm=document.form1;

neuwagenlpnettoid = frm.neuwagenlpnettoid.value.replace(",", ".");
nachlassinprozentid = frm.nachlassinprozentid.value.replace(",", ".");
nachlassid = frm.nachlassid.value.replace(",", ".");


nachlassinprozentid = nachlassid*100 / neuwagenlpnettoid;

frm.nachlassinprozentid.value = nachlassinprozentid.toFixed(3).replace(".", ",");

doLiveRes()

}


function doLiveRes(){

frm=document.form1;


var neuwagenlpnettoid 				= frm.neuwagenlpnettoid.value.replace(",", ".");
//alert(neuwagenlpnettoid);

var verkaufspreisid					= frm.verkaufspreisid.value.replace(",", ".");	
var nachlassinprozentid 			= frm.nachlassinprozentid.value.replace(",", ".");
var nachlassid 						= frm.nachlassid.value.replace(",", ".");
var verkaufspreisid					= frm.verkaufspreisid.value.replace(",", ".");
var mindestverkaufspreisid			= frm.mindestverkaufspreisid.value.replace(",", ".");
var bankid							= frm.bankid.value.replace(",", ".");

var inzpraemieid					=frm.inzpraemieid.value.replace(",", ".");
var retpraemieid					=frm.retpraemieid.value.replace(",", ".");
var erpraemieid						=frm.erpraemieid.value.replace(",", ".");
var loypraemieid					=frm.loypraemieid.value.replace(",", ".");
var zulpraemieid					=frm.zulpraemieid.value.replace(",", ".");

var sonderpraemieid					=frm.sonderpraemieid.value.replace(",", ".");
var geschrepkostenid				=frm.geschrepkostenid.value.replace(",", ".");
var sonstigesid						=frm.sonstigesid.value.replace(",", ".");
var zubehoerid						=frm.zubehoerid.value.replace(",", ".");
var naturalrabattid					=frm.naturalrabattid.value.replace(",", ".");
var vermittlungsprovisionid			=frm.vermittlungsprovisionid.value.replace(",", ".");

var ekarenaid						=frm.ekarenaid.value.replace(",", ".");
var ekbetriebid						=frm.ekbetriebid.value.replace(",", ".");
var gukdid							=frm.gukdid.value.replace(",", ".");
var rlszid							=frm.rlszid.value.replace(",", ".");
var verssumid						=frm.verssumid.value.replace(",", ".");
var voraussichtlichekostenid 		=frm.voraussichtlichekostenid.value.replace(",", ".");
var praemiegeshisid					=frm.praemiegeshisid.value.replace(",", ".");

praemiegesid = Number(inzpraemieid)+Number(retpraemieid)+Number(erpraemieid)+Number(loypraemieid)+Number(zulpraemieid);



if(schema == 10) {

nachlassgwid = Number(ekbetriebid)-Number(gukdid)-Number(rlszid)-Number(ekarenaid);

gesamtnachlassid = Number(nachlassid)+Number(nachlassgwid)+Number(bankid)-praemiegesid-Number(sonderpraemieid)+Number(sonstigesid)+Number(zubehoerid)+Number(naturalrabattid)+Number(vermittlungsprovisionid);

frm.gesamtnachlassid.value =  gesamtnachlassid.toFixed(2).replace(".", ",");


frm.gesamtnachlass1id.value =  frm.gesamtnachlassid.value;

nachlassp1 = (Math.round((gesamtnachlassid*100/neuwagenlpnettoid)*1000))/1000;

nachlassp1 = nachlassp1 *1000;

nachlassp1 = Math.round(nachlassp1);

nachlassp1 = nachlassp1 / 1000;


frm.gesamtnachlassinprozentid.value = nachlassp1.toFixed(3).replace(".",",");

if (frm.gesamtnachlassinprozentid.value == "NaN") frm.gesamtnachlassinprozentid.value = "0,000";

frm.gesamtprozentid.value 			= frm.gesamtnachlassinprozentid.value;

frm.neuwagenlpnettoid.value			= (Number(neuwagenlpnettoid)).toFixed(2).replace(".", ",");
frm.nachlassinprozentid.value		= (Number(nachlassinprozentid)).toFixed(3).replace(".", ",");
frm.nachlassid.value				= (Number(nachlassid)).toFixed(2).replace(".",",");
frm.nachlassgwid.value				= (Number(nachlassgwid)).toFixed(2).replace(".", ",");

frm.nachlassgweid.value				= frm.nachlassgwid.value;
//frm.nachgwid.value						= frm.nachlassgweinid.value;


frm.bankid.value					= (Number(bankid)).toFixed(2).replace(".", ",");

frm.inzpraemieid.value				=(Number(inzpraemieid)).toFixed(2).replace(".", ",");
frm.retpraemieid.value				=(Number(retpraemieid)).toFixed(2).replace(".", ",");
frm.erpraemieid.value				=(Number(erpraemieid)).toFixed(2).replace(".", ",");
frm.loypraemieid.value				=(Number(loypraemieid)).toFixed(2).replace(".", ",");
frm.zulpraemieid.value				=(Number(zulpraemieid)).toFixed(2).replace(".", ",");

frm.praemiegesid.value				=(Number(praemiegesid)).toFixed(2).replace(".", ",");
frm.praemiegeshisid.value			=(Number(praemiegeshisid)).toFixed(2).replace(".", ",");

frm.praemiegesamtid.value 			= frm.praemiegesid.value;

frm.sonderpraemieid.value			= (Number(sonderpraemieid)).toFixed(2).replace(".", ",");
frm.sonstigesid.value				= (Number(sonstigesid)).toFixed(2).replace(".", ",");
frm.zubehoerid.value				= (Number(zubehoerid)).toFixed(2).replace(".", ",");
frm.naturalrabattid.value			= (Number(naturalrabattid)).toFixed(2).replace(".", ",");
frm.vermittlungsprovisionid.value	= (Number(vermittlungsprovisionid)).toFixed(2).replace(".", ",");



frm.ekbetriebid.value				= (Number(ekbetriebid)).toFixed(2).replace(".", ",");
frm.ekarenaid.value					= (Number(ekarenaid)).toFixed(2).replace(".", ",");
frm.rlszid.value					= (Number(rlszid)).toFixed(2).replace(".", ",");
frm.gukdid.value					= (Number(gukdid)).toFixed(2).replace(".", ",");
frm.voraussichtlichekostenid.value	= (Number(voraussichtlichekostenid)).toFixed(2).replace(".", ",");
frm.verssumid.value					= (Number(verssumid)).toFixed(2).replace(".", ",");


}

if(schema == 20) {
	

nachlassgwid = Number(ekbetriebid)-Number(gukdid)-Number(rlszid)-Number(ekarenaid);

vergleichzumindestvkid = Number(verkaufspreisid)-Number(mindestverkaufspreisid)-Number(nachlassgwid)-Number(bankid)-Number(geschrepkostenid)-Number(sonstigesid)-Number(zubehoerid)-Number(naturalrabattid)-Number(vermittlungsprovisionid)+praemiegesid;

frm.verkaufspreisid.value				= (Number(verkaufspreisid)).toFixed(2).replace(".", ",");
frm.mindestverkaufspreisid.value		= (Number(mindestverkaufspreisid)).toFixed(2).replace(".", ",");
frm.nachlassgwid.value					= (Number(nachlassgwid)).toFixed(2).replace(".", ",");
frm.nachlassgweid.value					= frm.nachlassgwid.value;
frm.bankid.value						= (Number(bankid)).toFixed(2).replace(".", ",");

frm.inzpraemieid.value					=(Number(inzpraemieid)).toFixed(2).replace(".", ",");
frm.retpraemieid.value					=(Number(retpraemieid)).toFixed(2).replace(".", ",");
frm.erpraemieid.value					=(Number(erpraemieid)).toFixed(2).replace(".", ",");
frm.loypraemieid.value					=(Number(loypraemieid)).toFixed(2).replace(".", ",");
frm.zulpraemieid.value					=(Number(zulpraemieid)).toFixed(2).replace(".", ",");

frm.praemiegesid.value					=(Number(praemiegesid)).toFixed(2).replace(".", ",");

frm.praemiegesamtid.value 				= frm.praemiegesid.value;
frm.praemiegeshisid.value				=(Number(praemiegeshisid)).toFixed(2).replace(".", ",");

frm.mindestverkaufspreisid.value		= (Number(mindestverkaufspreisid)).toFixed(2).replace(".", ",");
frm.sonstigesid.value					= (Number(sonstigesid)).toFixed(2).replace(".", ",");
frm.zubehoerid.value					= (Number(zubehoerid)).toFixed(2).replace(".", ",");
frm.naturalrabattid.value				= (Number(naturalrabattid)).toFixed(2).replace(".", ",");
frm.vermittlungsprovisionid.value		= (Number(vermittlungsprovisionid)).toFixed(2).replace(".", ",");
frm.geschrepkostenid.value				= (Number(geschrepkostenid)).toFixed(2).replace(".", ",");

frm.vergleichzumindestvkid.value		= (Number(vergleichzumindestvkid)).toFixed(2).replace(".", ",");
frm.vergleichzumindestvk1id.value		= frm.vergleichzumindestvkid.value;

frm.ekbetriebid.value					= (Number(ekbetriebid)).toFixed(2).replace(".", ",");
frm.ekarenaid.value						= (Number(ekarenaid)).toFixed(2).replace(".", ",");
frm.rlszid.value						= (Number(rlszid)).toFixed(2).replace(".", ",");
frm.gukdid.value						= (Number(gukdid)).toFixed(2).replace(".", ",");
frm.voraussichtlichekostenid.value		= (Number(voraussichtlichekostenid)).toFixed(2).replace(".", ",");
frm.verssumid.value						= (Number(verssumid)).toFixed(2).replace(".", ",");


}



Prov()

}


function formular(ja,di,lt,sly,provsystemnw,provsystemgw) {
	

	
provsys			= sly; 
kalk			= ja;
systemnw 		= provsystemnw;
systemgw 		= provsystemgw;
schema 			= ja;

	
	if ((ja == 20) || (ja == 30))  {	
						
							document.getElementById("mitte").style.display="block";
				
							document.getElementById("nw_1").style.display="none";
							document.getElementById("nw_2").style.display="none";
							document.getElementById("nw_3").style.display="none";
							document.getElementById("nw_4").style.display="none";
							
							document.getElementById("gw_1").style.display="block";
							document.getElementById("gw_2").style.display="block";
							document.getElementById("gw_3").style.display="block";
							document.getElementById("gw_4").style.display="block";
							 
			praemien(ja)
			
 		 } 
  					else 
  		{

	if(ja == 10) {
	
							document.getElementById("mitte").style.display="block";
							document.getElementById("gw-daten").style.display="none";
							
			
							document.getElementById("nw_1").style.display="block";
							document.getElementById("nw_2").style.display="block";
							document.getElementById("nw_3").style.display="block";
							document.getElementById("nw_4").style.display="block";
							
							
							document.getElementById("gw_1").style.display="none";
							document.getElementById("gw_2").style.display="none";
							document.getElementById("gw_3").style.display="none";
							document.getElementById("gw_4").style.display="none";
							
							


	praemien(ja)
	
	
	} 
	}
	}


function praemien(ja) { }


function gw(ja) {
	
	

	if (ja ==100 ) {	
	
			document.getElementById("gw-daten").style.display="block";
			
			//document.getElementById("gwtypid").focus();

	
  } 
  else 
{			// Inhalt des Formulars GW leeren
			
			document.getElementById("gwtypid").value="";
			document.getElementById("fahrgestellnummerid").value="";
			document.getElementById("kmstandid").value="";
			document.getElementById("bjid").value="";
			
			document.form1.ankaufvonid.selectedIndex = 0;
			document.form1.mwstausweisbarid.selectedIndex = 0;
			document.form1.ruecknahmeverpflichtungid.selectedIndex = 0;
			
			document.getElementById("ekbetriebid").value="";
			document.getElementById("ekarenaid").value="";
			document.getElementById("bewertungnrschwackeid").value="";
			document.getElementById("vertragsnummerid").value="";  
			document.getElementById("rlszid").value=""; 
			document.getElementById("rgankdid").value=""; 
			document.getElementById("gukdid").value=""; 
			document.getElementById("fahrzeugmaengelid").value=""; 
			document.getElementById("voraussichtlichekostenid").value=""; 

			document.getElementById("gw-daten").style.display="none";

			doLiveRes()


}
}
function num(id) {

var sa = document.getElementById(id).value.replace(",", ".");

document.getElementById(id).value	= (Number(sa)).toFixed(2).replace(".", ",");

}

function daten(err) {


	
	if(err != undefined) {
		
	
	frm=document.form1;
	
	var betragnachin1				=  frm.betragnachid1.value.replace(",", ".");
	var betragnachin2				=  frm.betragnachid2.value.replace(",", ".");
	var betragnachin3				=  frm.betragnachid3.value.replace(",", ".");
	var betragnachin4				=  frm.betragnachid4.value.replace(",", ".");
	var betragnachin5				=  frm.betragnachid5.value.replace(",", ".");

	gesamt = Number(betragnachin1) + Number(betragnachin2) + Number(betragnachin3) + Number(betragnachin4) + Number(betragnachin5);
	
	form1.zubehoerid.value =  gesamt;
	


	}
}

Ich hoffe das war jetzt nicht zuviel! So funktioniert auch alles! Nur ich möchte den Code vereinfachen und werte über Arrays verwalten!

Danke für deine Mühe!

Darkpriest
 
Hi.

Ja, es ist doch etwas viel und ein wenig unübersichtlich. Man kann sich das nicht zufällig "live" ansehen?

Zuerst mal ist der Zugriff auf form1 über "document.form1" nicht zulässig. Siehe http://de.selfhtml.org/javascript/objekte/forms.htm#allgemeines

Auf die Elemente einer form muss auch anders zugegriffen werden (http://de.selfhtml.org/javascript/objekte/elements.htm#allgemeines).

Beim label hast du für das Attribut for den Wert "name" angegeben. Dort sollte die ID des Elements stehen für das das Label verantwortlich ist, also in dem Fall "neuwagenlpnettoid".

Der Wert eines name Attributes sollte ausschließlich Buchstaben oder Ziffern, Unterstriche aber keien Leerzeichen, Umlaute oder sonstige Sonderzeichen enthalten.

Dann hast du jetzt den funktionierenden Code gepostet. Das nützt ja nun aber nicht viel um den Fehler im neuen Code zu finden, oder?! Und könntest du bitte wirklich den HTML Code posten und nicht den PHP Code?

Gruß
 
Hallo,

leider kann man das nicht live ansehen! Läuft hier lokal im Intranet! Das Projekt ist leider sehr umfangreich u. der HTML-Code wird über PHP-Funktionen erstellt.

Ich verstehe das mit dem Zugriff auf die Felder nicht, warum darf ich so nicht zugreifen! Es funktioniert doch! Oder liegt genau hier der Fehler?

Ich möchte eigentlich nur den Code der Funktionen vereinfachen!

Code:
//var variablen = new Array("neuwagenlpnettoid", "Feld2", "Feld3");

Diese Felder möchte ich nun innerhalb der Funktion "doliveRes" deklarieren!

Code:
var part1 ="frm.";
var part3 =".value";

for (var i = 0; i < variablen.length; i++) 

		{ 
			
			var document.forms["form1"].elements[variablen[i]].id = (document.forms["form1"].elements[variablen[i]].value.replace(",", ".")); 
			alert(neuwagenlpnettoid);
			
		}

Bei dieser Anweisung bleibt er aber schon als fehlerhaft hängen und meldet "Objekt erwartet".

Wenn ich aber die Variablen aber einzeln deklariere, bsp.

var neuwagenlpnettoid = frm.neuwagenlpnettoid.value.replace(",", ".");

funktioniert es, obwohl ich vom Ablauf in der selben Funktion bin!

Danke!

Darkpriest
 
Ich verstehe das mit dem Zugriff auf die Felder nicht, warum darf ich so nicht zugreifen! Es funktioniert doch! Oder liegt genau hier der Fehler?
Grundsätzlich ist es eine schlechte Idee eine Zugriffs-Methode zu verwenden die laut Standard gar nicht existiert. Für einfachen Code mag es noch funktionieren wenn der Browser sich noch "denken kann" was gemeint ist. Sonst ist es eine unnötige Fehlerquelle und einfach qualitativ minderwertiger Code.
Code:
//var variablen = new Array("neuwagenlpnettoid", "Feld2", "Feld3");

Diese Felder möchte ich nun innerhalb der Funktion "doliveRes" deklarieren!

Code:
var part1 ="frm.";
var part3 =".value";

for (var i = 0; i < variablen.length; i++) 

		{ 
			
			var document.forms["form1"].elements[variablen[i]].id = (document.forms["form1"].elements[variablen[i]].value.replace(",", ".")); 
			alert(neuwagenlpnettoid);
			
		}

Bei dieser Anweisung bleibt er aber schon als fehlerhaft hängen und meldet "Objekt erwartet".
Wenn du auf ein Element namens "neuwagenlpnettoid" zugreifen willst, dann muss das Element aber auch diesen Namen haben. Dein Element heißt aber nicht "neuwagenlpnettoid" sondern "kalk[neuwagenlpnettoin]" (wobei name keine Leerzeichen und Umlaute enthalten sollte, erstes Zeichen ein Buchstabe, sonst auch Ziffern, Unterstrich (_), Bindestrich (-), Doppelpunkt :)) oder Punkt (.) bestehen sollte)

Wenn jedes Element eine eindeutige ID hat, kannst du natürlich auch über die ID darauf zugreifen:
Javascript:
document.getElementById(variablen[i]).value = ...;

Gruß
 
Zurück