Felder / Steuerelemente mit "individuellen Namen" ansprechen

Jerinca

Erfahrenes Mitglied
Hallo!

Ich möchte in einer JavaScript-Funktion bestimmte Felder/Steuerelemente ansprechen bzw. bearbeiten. Normalerweise funktioniert das ja so: document.formlarname.feldname.[eigenschaft]

Die Felder, die ich ansprechen will, haben aber unterschiedliche Namen bestehend aus einem Teil, der gleich bleibt, und einer individuellen Nummer, die datensatzspezifisch ist (Primärschlüssel). Das könnt Ihr im Code unten sehen.

Das Auslesen dieser Nummer ist gar kein Problem, weil ich sie beim Funktionsaufruf einfach übergeben kann.

Mein Problem ist aber, daß es z.B. das Feld document.form2.erledigt nicht gibt, denn es heißt z.B. document.form2.erledigt11111!
Code:
Funktionsaufruf im HTML-Teil:
<% var intRep =(Recordset.Fields.Item("RE_LfdNummer").Value); 
// jeweiligen Primärschlüssel in einer Variable packen %>

<input <%=((Recordset.Fields.Item("RE_Erledigt").Value == true)?"CHECKED":"")%> 
type="checkbox" name="erledigt<%= intRep %>" 
value="<%=(Recordset.Fields.Item("RE_Erledigt").Value)%>" 
onClick="datum_setzen(event,'<%= intRep %>')">

Funktion:
<script language="JavaScript">
function datum_setzen(e,RepID) {
	var kontrollkaestchen = document.form2.erledigt+RepID;
	var datumsfeld = document.form2.datum+RepID;
	alert("Kontrollkästchen = "+kontrollkaestchen+"\nDatumsfeld = "+datumsfeld);
		/* hier soll dann die eigentliche Bearbeitung folgen */
	}
</script>
Beim alert bekomme ich nur "undefined11111" angezeigt und ich weiß auch, warum: Weil document.form2.erledigt+RepID interpretiert wird als etwas Unbekanntes plus die RepID, die er ja kennt und deshalb korrekt ausgibt.

Meine Frage nun: Wie schaffe ich es, daß erledigt+RepID als Name des Feldes anerkannt wird? Denn das gibt es ja dann!

Ich habe es mit Anführungsstrichen versucht à la: "document.form2.erledigt"+RepID, dann wird es zwar im alert richtig ausgegeben, aber später nicht mehr als Steuerelement erkannt, sondern nur als Text => es ist keine Bearbeitung mehr möglich!

Mit Klammern à la: document.form2.(erledigt+RepID) geht es auch nicht!

Ich hoffe, jemand versteht, was ich meine, und kann mir helfen :suspekt:
 
Hallo Quaese!

Leider klappt das auch nicht (obwohl es wirklich sehr vielversprechend ausgesehen hat ;) )

Ich habe nach Deiner Anleitung nun folgendes geschrieben:
Code:
<script language="JavaScript">
function datum_setzen(e,RepID) {
	var kontrollkaestchen = document.form2.elements["erledigt"+RepID];
	var datumsfeld = document.form2.elements["datum"+RepID];
	alert("Kontrollkästchen = "+kontrollkaestchen+"\nDatumsfeld = "+datumsfeld);
		/* hier soll dann die eigentliche Bearbeitung folgen */
	}
</script>
Und nun bekomme ich beim alert: Kontrollkästchen = [object] Datumsfeld = [object]

Könntest Du nicht noch ein Ass aus dem Ärmel schütteln? Habe gehofft, daß dieses Problem den "Fortgeschrittenen" unter Euch geläufig ist :suspekt:

Bin für JEDEN VORSCHLAG dankbar!
 
Hi,

das [object] zeigt doch an, dass er Datumsfeld und Kontrollkästchen erkannt hat und in den
Variablen datumsfeld und kontrollkaestchen Objekte stehen. Damit kannst Du nun arbeiten.

Z.B. dem Datumsfeld ein Datum zuweisen:
Code:
datumsfeld.value = "22.12.2004";
Oder einen Wert auslesen:
Code:
alert(datumsfeld.value);
Ciao
Quaese
 
Hallo nochmal!

Vielen Dank, Quaese, daß Du mich mal mit der Nase reingetunkt hast!

Ich hab' bis jetzt immer gedacht, wenn da steht [object], dann weiß er nicht, was gemeint ist :p

Aber durch das alert() hab' ich festgesetllt, daß dem gar nicht so ist!

Also vielen, vielen Dank für Deine Hilfe! Und so schnell ;)
 
Hallo wieder!

Ich habe mittlerweile meine neu erworbenen Fähigkeiten in einer anderen .asp-Datei integrieren wollen, aber irgendwas läuft da schief, dabei sieht's für mich super aus ;-)

Ich habe da eine Funktion, die bei body onLoad aufgerufen werden soll (eine 1 wird übergeben als ID) und dann soll in einer for-Schleife für jeden Datensatz überprüft werden, ob in einem bestimmten Feld ("erledigt") true oder false steht und demensprechend soll dann die Schriftfarbe eines anderen Feldes dieses Datensatzes gesetzt werden:
Code:
function change_color(ID) {
var maschinenindex = document.getElementsByName("maschinenindex");
for (ID = 1; ID < maschinenindex.length; ID++) {
	var erledigt = document.form1b.elements["erledigt"+ID];
	var SN = document.form1b.elements["SN"+ID];
	if(erledigt.value == true) {
		SN.fontcolor("#FF0000");
		}
	else {
		SN.fontcolor("#008000");
		}
}
Nun, mal abgesehen von dem Teil, wo die Schriftfarbe bestimmt werden soll (konnte ich noch nicht testen, aber es sieht mal nicht koscher aus meines Erachtens), bekomme ich bereits bei der ersten Anweisung in der for-Schleife die Fehlermeldung: "document.form1b.elements ist Null oder kein Objekt"

Dabei bin ich doch genau so vorgegangen, wie bei dem Problem, das ich vorher beschrieben habe. Das einzige, was fehlt, ist das event, aber da ich ja event.srcElement.name diesmal nicht gebraucht wird (denn es geht in der Funktion ja nicht darum, welches Element die Funktion aufgerufen hat), dachte ich mir, es muß auch ohne event gehen:
Code:
<% var maschinenindex = 1; // Variable, die zum Hochzählen der einzelnen Maschinen in der Liste gebraucht wird %> 
<% while ((Repeat__numRows-- != 0) && (!Recordset.EOF)) { %>
<form id="form1b" name="form1b" method="post" action="">
.
.
.
<td width="10%"><%=(maschinenindex)%>
  <input type="text" name="maschinenindex" value="<%=(maschinenindex)%>">
</td>
<td width="10%"><%=((Recordset.Fields.Item("EndeLack").Value == true)?"ja":"")%>
  <input type="text" name="erledigt<%= maschinenindex %>" value="<%=(Recordset.Fields.Item("EndeLack").Value)%>">
</td>
<td id="seriennummer" width="30%">
  <input type="text" name="SN<%= maschinenindex %>" value="<%=(Recordset.Fields.Item("Seriennummer").Value)%>">
</td>
.
.
.
</form>
    <%
  Repeat__index++;
  Recordset.MoveNext();
  maschinenindex++;
}
%>
.
.
.
Mit alerts habe ich auch schon herausbekommen, daß die relevanten Felder die richtigen Namen haben (also datensatzanzahlabhängig hochgezählt z.B. "erledigt3" und "SN3").

Woran kann es denn dann liegen, daß ich gesagt bekomme: "document.form1b.elements ist Null oder kein Objekt", wenn ich probiere, auf document.form1b.elements["erledigt"+ID] zuzugreifen :confused:

Ich hoffe, Ihr wißt Rat, denn ich weiß nicht, wie ich ohne diesen Zugriff an meinem Projekt weitermachen soll :(

Vielen Dank schonmal im Voraus für Eure Zeit und Mühe!

Gruß, Jerinca

P.S.: Ich habe es nun auch mit dem event versucht (also Aufruf über onClick="change_color(event,1)" bei einem Steuerelement, das einen Namen hat, und dann Funktionsanfang: function change_color(e,ID)...) Aber ich bekomme immer noch dieselbe Fehlermeldung; es kann also nicht am event liegen...
 
Zuletzt bearbeitet:
Poste bitte den Code, wie du ihn im Browser unter "Quelltext anzeigen" erhältst.
Bei clientseitigem JS ist dein ASP-Code recht bedeutungslos bei der Diagnose.
 
Hallo nochmal!

Okay, bin nun selbst dahinter gekommen, daß die Fehlermeldung "document.form1b.elements ist Null oder kein Objekt" deshalb kommt, weil das Formular ja erst nach dem body geladen wird, aber bei body wird ja über onLoad schon die Funktion aufgerufen, die auf das Formular bzw. auf dessen Elemente zugreifen will...

Aber wenn das des Rätsels Lösung ist, wie schaffe ich es dann sonst, beim Laden der ASP-Site die Schriftfarbe zu setzen bzw. anzupassen?

Es soll ja für jeden Datansatz geschaut werden, ob im Feld "erledigt" ein true oder ein false steht und je nach dem dann die dazugehörige Seriennummer rot oder grün schreiben...

Weiß da jemand Rat?

Danke schonmal, Jerinca
 
Das mit dem "onload" kann nicht das Problem sein... dieser Event feuert, wenn das Dokument fertiggeladen ist(also auch die Formulare)... nicht während des Ladens.

Es soll ja für jeden Datansatz geschaut werden, ob im Feld "erledigt" ein true oder ein false steht und je nach dem dann die dazugehörige Seriennummer rot oder grün schreiben...

Das kannst du doch gleich mit ASP erledigen. Ich hab da(wie schonmal erwähnt 0 Ahnung von:), aber irgendwie so müsste es da wohl aussehen sollen)
Code:
<td id="seriennummer" width="30%">
  <input type="text" style="color:#<%=((Recordset.Fields.Item("EndeLack").Value == true)?"FF0000":"008000")%>"name="SN<%= maschinenindex %>" value="<%=(Recordset.Fields.Item("Seriennummer").Value)%>">
</td>
 
Oh Mist :mad:

Einmal gedacht, ich wäre so clever, selbst auf die Ursache für mein Problem zu kommen - und gleich eine Bauchlandung :offtopic:

Aber auf Deinen Rat hin habe ich mir nun den Quelltext angeschaut, wie ihn der Client bekommt, und bemerkt, daß meine while-Schleife für's Wiederholen der Datensätze um das Formular namens "form1b" herum liegt und deswegen gibt es *natürlich* viele Formulare mit dem selben Namen und deswegen weiß die Funktion *natürlich* nicht mehr, welches Formular "form1b" sie ansprechen soll :rolleyes:

Das wird wohl das Problem sein, also fange ich gleich an, dem Formular einen eindeutigen Namen zuzuweisen und dann schauen wir mal weiter...

Hui, glücklicherweise habe ich Dein nächstes Posting auch noch gelesen vorm Abschicken meiner Antwort und diese ASP-seitige Variante wäre natürlich noch viel effizienter! Werde ich als erstes gleich ausprobieren (hab' mich auch schon gefragt, ob das wirklich so ein Mega-Aufwand sein muß, nur, um ein paar Farben dynamisch anzupassen :rolleyes: )

Ich melde mich wieder...

Gruß, Jerinca
 
Zurück