Hi,
»» if(document.getElementsByName('PF')[i] != '')
Was willst du denn mit dieser Abfrage bezwecken?
Ein Formularfeld wird nie einem Leerstring entsprechen.auch nicht bei allerersten Aufruf? Dann ist doch die Textarea leer?
Dann ist das value-Attribut vielleicht leer, ja - aber auf dieses greifst du hier ja nicht zu.
Übergebe beim Aufruf deiner Funktion die Referenz auf das Objekt, auf dem diese aufgerufen wird, als Parameter - das geht in diesem Kontext ganz einfach mittels this
Was genau übergebe ich mit "this"? Ich hab gesucht und geforscht, bin aber so unbeholfen in JS, dass ich nur herausgefunden habe, dass ich eine Referenz übergebe. Und das hast Du schon in Deinem Post geschrieben. Ein Alert bringt nur "Object" als Ergebnis. Und ich weiß nichts damit anzufangen.
Eine Referenz ist etwas, das - nun ja, irgendworauf "referenziert" :-)
Also eine Art "Zeiger".
document.getElementsByName('PF')[i] - das liefert dir eine Referenz auf das (i+1)-te Formulerfeld mit Namen "PF".
Wenn du dich direkt "am" Formularfeld befindest - und das tust du mit dem im textarea-Tag notierten Eventhandler - dann liefert this ebenso eine Referenz auf eben dieses textarea-Element.
Die Referenz dient einfach dazu, von JavaScript aus HTML-Elemente anzusprechen.
(Und du nutzt ja auch schon Referenzen, wenn auch ohne es zu wissen - an der Stelle, wo du schreibst
document.getElementsByName('PF')[i].disabled = true;
- document.getElementsByName('PF')[i] referenziert eine der Textareas, und indem du an diese Referenz mit einem Punkt noch disabled anhängst, kannst du dann auf die disabled-Eigenschaft eben dieser Textarea zugreifen.)
Und beim alert bekommst du nur "[object]" oder sowas ähnliches (Browser wie FireFox oder Opera würden dir sowas wie [object HTMLFormElement] o.ä. liefern) - weil ein textarea-Element nun mal etwas "abstraktes" ist, dass sich nicht als Textstring (und nur solche gibt alert ja aus) darstellen lässt.
Und in deiner Funktion (deren Kopf du natürlich so erweiterst, dass sie diesen Parameter auch entgegen nimmt)
Hab ich gemacht. Weiß es aber nicht auszuwerten :-(
document.getElementsByName('PF')[i] liefert dir eine Referenz auf eine der Textareas, und wenn du this als Parameter übergeben hättest, dann würde dieser Parameter auch eine Referenz auf eine der Textareas darstellen.
Du müsstest also nur noch feststellen, ob beide Referenzen sich auf das gleiche Objekt beziehen - das geht mit einem ganz normalen Vergleich mittels des == Operators, bzw. negiert mit !=
Dennoch war Dein Post absolut zielführend. Ich hab es im Prinzip genau so gemacht, wie Du vorschlägst. Nur etwas anders umgesetzt.
So geht es natürlich auch.
Es gibt selten eine "ideale" Lösung, es führen immer viele Wege nach Rom.
Und an einer Lösung, die du mit ein paar Hinweisen selbst erarbeitet hast, lernst du ja auch mehr :-)
Trotzdem hätte ich gerne mal die Originallösung gehabt. Kannst Du mir sie mal geben, damit ich weiterlerne? Ist ja keine Faulheit oder so. Denn meine Lösung funktioniert ja dank Deiner Hilfe perfekt.
Das wäre so in etwa die Umsetzung dessen, was ich im Sinne hatte:
function disable_textareas(textareaAufDerIchAufgerufenWurde) {
for(var i = 0, l = document.getElementsByName('PF').length; i < l; i++) {
var aktuelleTextarea = document.getElementsByName('PF')[i];
if(aktuelleTextarea != textareaAufDerIchAufgerufenWurde) {
aktuelleTextarea.disabled = true;
}
}
}
Und Aufruf dann wie gesagt über
<textarea name="PF" onchange="disable_textareas(this)" ></textarea>
(Beachte hier noch, dass ich den Parameter an der Stelle, wo ich die Funktion *definiere*, nicht this genannt habe - this ist ein "reserviertes Wort" mit bestimmter Bedeutung, und würde innerhalb der FUnktion ggf. etwas anderes meinen, wenn ich es dort verwenden würde. Also nenne ich den Parameter hier textareaAufDerIchAufgerufenWurde - und beim *Aufruf* der Funktion schreibe ich dann this in die Klammern, um an dieser Stelle den Inhalt von this an die Funktion zu übergeben.)
MfG ChrisB
Light travels faster than sound - that's why most people appear bright until you hear them speak.