Hallo,
ich habe folgende javascriptfunktion. Leider funktionier sie nicht. Ich weiss, dass was am syntax falsch ist, weiss aber leider nicht wie ich es richtig mache, wäre nett wenn mir jemand helfen könnte.
mfg dani
Hier die Funktion:
function setfocus(formname, fieldname)
{
document.formname.fieldname.focus();
}
Da hast du etwas missverstanden.
Der Code document.formname spricht ein Unterobjekt des Objekts document an, welches den Namen »formname« trägt. Das ist immer so. Bei einem fiktiven Objekt namens objekt würde z.B. objekt.unterobjekt ein Unterobjekt namens unterobjekt ansprechen und so weiter. Ob eine Variable namens »unterobjekt« existiert, ist unerheblich (solange diese nicht eine Eigenschaft von objekt ist).
formname ist hier eine Variable des Typs String (also ein String-Objekt). Darin steht wohl der Name des Objektes, das du ansprechen willst. (Und dieser Objektname entspricht dem name-Attribut des Formularelements. Das weißt du selbstverständlich, ich will nur die Begriffe klären. Und was du mit dem Objekt ansprichst, ist der zum Formularelement gehörige DOM-Knoten, um genau zu sein.) Der Name des Objekts ist nicht »formname« selbst, sondern dieser steht in der Variable formname (z.B. »formular1« wegen name="formular1").
document.formname schaut *nicht* nach einer String-Variable namens formname und nutzt ihren Inhalt als Objektname. Um das zu erreichen, ist diese Notation ungeeignet. Der Objektname selbst soll nämlich variabel sein, je nachdem, was im Funktionsparameter formname steht.
Dasselbe, was objekt.unterobjekt leistet, kann auch mit objekt['unterobjekt'] ausgedrückt werden. Der Vorteil dieser Schreibweise objekt[...] ist, dass der Objektname wie ein normaler String notiert werden kann - wie bei var meinstring='abc'; alert('abc'); usw.
Anstelle eines direkt notierten Strings kann hier ebenso eine String-Variable treten - wie bei var meinstring=andererstring; alert(meinstring); usw.
Somit kann man objekt[meinstring] schreiben. Das bedeutet, dass ein Unterobjekt angesprochen wird, dessen Name mit dem Inhalt der Stringvariable identisch ist. Wenn man also z.B. var meinstring='abc'; hat und objekt[meinstring] notiert, wird meinstring durch den Inhalt ebendieser Variable ersetzt: objekt['abc'] (das ist wiederum äquivalent zu objekt.abc).
In dieser String-Variable kann nun alles mögliche stehen und dementsprechend würden Objekte mit anderem Namen angesprochen. Diesen Effekt machen wir uns zunutze, um in der Funktion Objekte mit verschiedenen Namen anzusprechen, je nachdem, was im Parameter formname steht.
Die Schreibweise document.formname.fieldname ist eigentlich eine Abkürzung der Schreibweise document.forms.formname.elements.fieldname (http://de.selfhtml.org/javascript/objekte/forms.htm, http://de.selfhtml.org/javascript/objekte/elements.htm). Sowohl formname als auch fieldname sind Namen für String-Variablen, deren Inhalt als Unterobjektnamen gebraucht werden sollen (nicht deren Namen selbst, wie es momentan der Fall ist). Zweimal wird also die obige Methode angewandt, und heraus kommt: document.forms[formname].elements[fieldname]. Du suchst also document.forms[formname].elements[fieldname].focus();. Wenn in der Variablen formname der Text »formular1« steht und in fieldname »feld1«, käme logischerweise document.forms['formular1'].elements['feld1'] heraus usw., was wie gesagt dasselbe bewirkt wie document.forms.formular1.elements.feld1 und document.formular1.feld1.
Die lange Schreibweise wird benutzt, damit nicht document[formname][fieldname] geschrieben werden muss. Dies wäre zwar eine gültige äquivalente Schreibweise, aber das mehrfache Verwenden von [] hintereinander ist schwerer lesbar als die Version mit .forms und .elements.
Mathias