Das Objekt, das keines war...
Graphity
- javascript
0 Thomas Meinike0 Graphity
0 Michael N.0 Frank Bergermann0 Graphity
0 Graphity
Hallo mal wieder
Habe da (wer hätte das gedacht) eine Problemchen mit meiner PHP/JavaScript "Solution" *lach*.
Also, hier erstmal der Quelltext
<snip>
function ButtonAktivieren()
{
var ArztNummer = 0;
for(ArztNummer=1;ArztNummer<37;ArztNummer++)
{
var Feld = parent.Formular.document.forms["ETPFormular"].elements["arzt" + ArztNummer];
if(Feld.value != "")
{
for(ArztName=0;ArztName<100;ArztName++)
{
var NameButton = document.forms[0].elements[ArztName];
if(Feld.value == NameButton.value)
{
NameButton.disabled = "disabled";
}
else
{
NameButton.disabled = "";
}
}
}
}
}
<snip>
Die Objekt gibt es, das ist gesichert. Aber, und das ist das komische, die Objekte gibt es irgendwie nicht wirklich...
Will sagen, dieses script liefert mir einen JS-Fehler: "value" ist Null oder kein Objekt, wenn ich aber ein paar alert reinschreibe bekomme ich positive Ergebnisse.
Also, wenn ich zum Beispiel nach "var NameButton = ..." ein "alert(NameButton);" reinhaue, schreibt mir alert ein "[Object]" auf den Bildschirm. Schreibe ich an die gleiche Stelle ein "alert(NameButton.value);", schreibt es mir den Wert des aktuellen Buttons.
Aber die if-Funktion wird nicht ausgeführt, nur was unter else steht.
Wenn ich in den alerts "Feld" anstatt "NameButton" schreibe, passiert das gleiche...
Kann mir jemand helfen?
thx
Graphity
Hi Graphity,
NameButton.disabled = "disabled";
}
else
{
NameButton.disabled = "";
}
Setze disabled auf true bzw. false.
MfG, Thomas
Negativ, egal was ich hinschreibe, sobald disabled einen Wert hat, egal welchen, ist es eingeschaltet...
Hat mein Prob zwar nicht beseitigt, trotzdem danke...
Negativ, egal was ich hinschreibe, sobald disabled einen Wert hat, egal welchen, ist es eingeschaltet...
Nun, das kann zwar nicht jeder Browser, aber schau mal hier vorbei: http://www.styleassistant.de/tips/tip53.htm.
Hat mein Prob zwar nicht beseitigt, trotzdem danke...
Dann stelle mal besser ein Testdokument bereit.
MfG, Thomas
Negativ, egal was ich hinschreibe, sobald disabled einen Wert hat, egal welchen, ist es eingeschaltet...
Nun, das kann zwar nicht jeder Browser, aber schau mal hier vorbei: http://www.styleassistant.de/tips/tip53.htm.
Hmm.. war wohl wirklich nicht gut gestellt, die Frage. Ich disable Buttons, nicht Text-felder
Hat mein Prob zwar nicht beseitigt, trotzdem danke...
Dann stelle mal besser ein Testdokument bereit.
MfG, Thomas
Habe die HoPa unten angegeben. Bis zugriff erlaubt ist, kann a weng dauern, da ich ne Firewall laufen lasse...
Peinlich...
Also auf der zweiten Seite auf "Aktuellen Einteilungsplan erstellen (Passwort benötigt)" klicken (es wird kein Passwort benötigt). Und dann im rechten Frame auf "Namen anzeigen" klicken. Dort ist mein Problem...
cu
Graphity
Grüssi,
Also auf der zweiten Seite auf "Aktuellen Einteilungsplan erstellen (Passwort benötigt)" klicken (es wird kein Passwort benötigt). Und dann im rechten Frame auf "Namen anzeigen" klicken. Dort ist mein Problem...
Vielleicht liegts ja daran, dass du deine Zeilen ausgerechnet vor dem schliessenden " deiner Attributwerte umbrichst ;-)
<snip>
" onClick="InFeldEinfuegen(this)"></td></tr><tr><td align="right"> <input type="button" name="Agoura
" value="Agoura
" onClick="InFeldEinfuegen(this)"></td></tr><tr><td align="right"> <input type="button" name="Albert
" value="Albert
<snap>
Abgesehen davon funktionierts bei mir im IE 6 + Mozilla! NS 4.7 und Opera 5 steigen aus :-(
BTW:
NameButton.disabled = "true"; ist falsch, da du nur einen String zuweist
NameButton.disabled = true; ist richtig, da du hier einen Wert des "Datentyps" Boolean zuweist.
hth,
regenfeld
Grüssi,
Hallöchen
Also auf der zweiten Seite auf "Aktuellen Einteilungsplan erstellen (Passwort benötigt)" klicken (es wird kein Passwort benötigt). Und dann im rechten Frame auf "Namen anzeigen" klicken. Dort ist mein Problem...
Vielleicht liegts ja daran, dass du deine Zeilen ausgerechnet vor dem schliessenden " deiner Attributwerte umbrichst ;-)
<snip>
" onClick="InFeldEinfuegen(this)"></td></tr><tr><td align="right"> <input type="button" name="Agoura
" value="Agoura
" onClick="InFeldEinfuegen(this)"></td></tr><tr><td align="right"> <input type="button" name="Albert
" value="Albert
<snap>
Äh, nein. Das passiert durch das PHP, keine Ahnung wie ich das ändern kann...
Abgesehen davon funktionierts bei mir im IE 6 + Mozilla! NS 4.7 und Opera 5 steigen aus :-(
Ich benutze auch den MSIE 6... komisch. Vielleicht hast Du die Funktion garnicht ausgeführt? Hast Du ein paar Namen durch einen Klick auf einen Button eingefügt und dann durch einen Klick auf Test hat sich nichts verändert?? Eigentlich müsste er, wenn man einen Namen von dem Text-Feld wieder löscht, den Button mit diesem Namen nach einem Klick auf Test wieder freigeben...
BTW:
NameButton.disabled = "true"; ist falsch, da du nur einen String zuweist
NameButton.disabled = true; ist richtig, da du hier einen Wert des "Datentyps" Boolean zuweist.
korräääkt. Muß das gleich mal korrigieren
hth,
regenfeld
hth?
graphity
Grüssi,
Hallöchen
Also auf der zweiten Seite auf "Aktuellen Einteilungsplan erstellen (Passwort benötigt)" klicken (es wird kein Passwort benötigt). Und dann im rechten Frame auf "Namen anzeigen" klicken. Dort ist mein Problem...
Vielleicht liegts ja daran, dass du deine Zeilen ausgerechnet vor dem schliessenden " deiner Attributwerte umbrichst ;-)
<snip>
" onClick="InFeldEinfuegen(this)"></td></tr><tr><td align="right"> <input type="button" name="Agoura
" value="Agoura
" onClick="InFeldEinfuegen(this)"></td></tr><tr><td align="right"> <input type="button" name="Albert
" value="Albert
<snap>
Äh, nein. Das passiert durch das PHP, keine Ahnung wie ich das ändern kann...
Du schreibst Strings, die auch einen Zeilenumbruch enthalten. Aus diesem Grunde erscheint in den Input-Feldern ein "Knödel" hinter dem Namen. Du solltest mit chop() diese Reste entfernen, bevor du sie in die HTML-Seite packst. Kann sonst zu den seltsamsten Effekten führen.
Abgesehen davon funktionierts bei mir im IE 6 + Mozilla! NS 4.7 und Opera 5 steigen aus :-(
Bei mir steigt Opera nicht sofort aus, sondern nur ganz am Ende einer langen Klickorgie (Bestätigen von [Object HTMLInputElement]) erscheint "undefined" und dann:
Error:
name: TypeError
message: Value on left hand side of '.' is not convertible to Object: NameButton
Könnte sein, daß deine Schleife gerade ein Element zuviel zählt.
Ich benutze auch den MSIE 6... komisch. Vielleicht hast Du die Funktion garnicht ausgeführt? Hast Du ein paar Namen durch einen Klick auf einen Button eingefügt und dann durch einen Klick auf Test hat sich nichts verändert?? Eigentlich müsste er, wenn man einen Namen von dem Text-Feld wieder löscht, den Button mit diesem Namen nach einem Klick auf Test wieder freigeben...
BTW:
NameButton.disabled = "true"; ist falsch, da du nur einen String zuweist
NameButton.disabled = true; ist richtig, da du hier einen Wert des "Datentyps" Boolean zuweist.
korräääkt. Muß das gleich mal korrigieren
hth,
regenfeld
hth?
graphity
Ansonste sehe ich dein Problem noch nicht! Was soll gemacht werden, und was wird (nur) gemacht?
- Sven Rautenberg
Ansonste sehe ich dein Problem noch nicht! Was soll gemacht werden, und was wird (nur) gemacht?
- Sven Rautenberg
Ok, habe jetzt das chop eingefügt, die umbrüche sind weg, danke. Aber es ist jetzt völlig unlesbar... Wie kann ich denn einen PHP-Zeilenumbruch erzwingen, also kein <br>, sondern daß er im Quelltext eine neue Zweile beginnt.
Mein Problem:
In das Formular links werden Namen durch einen Klick auf einen Button rechts eingefügt, das funzt. Die Namen werden in das oberste leere Textfeld eingefügt. Nach einem Klick, wird der Button ghosted. So wird verhindert, daß ein Name zweimal eingefügt werden kann...
Wenn man sich verklick hat, soll man nun den Namen im Text-Feld löschen können, dann auf Test klicken. Da werden alle Text-Felder geprüft und die Buttons wieder eingeschaltet, deren value nicht in den Text-Feldern vorkommt. Zumindest in der Theorie...
Es läuft insofern nicht, daß ein alert(NameButton.value); mir den Wert anzeigt, aber eine Fehlermeldung behauptet NameButton has no properties (NC4.7?) bzw. "Value is NULL oder kein Objekt" (MSIE 6).
Ist das Problem jetzt klar?
Danke
Graphity
Ansonste sehe ich dein Problem noch nicht! Was soll gemacht werden, und was wird (nur) gemacht?
- Sven Rautenberg
Ok, habe jetzt das chop eingefügt, die umbrüche sind weg, danke. Aber es ist jetzt völlig unlesbar... Wie kann ich denn einen PHP-Zeilenumbruch erzwingen, also kein <br>, sondern daß er im Quelltext eine neue Zweile beginnt.
Entweder im HTML-Modus eine neue Zeile beginnen, oder bei echo, print etc. "\n" ausgeben lassen (das ist das Zeichen für "newline" - neue Zeile).
Mein Problem:
In das Formular links werden Namen durch einen Klick auf einen Button rechts eingefügt, das funzt. Die Namen werden in das oberste leere Textfeld eingefügt. Nach einem Klick, wird der Button ghosted. So wird verhindert, daß ein Name zweimal eingefügt werden kann...
Wenn man sich verklick hat, soll man nun den Namen im Text-Feld löschen können, dann auf Test klicken. Da werden alle Text-Felder geprüft und die Buttons wieder eingeschaltet, deren value nicht in den Text-Feldern vorkommt. Zumindest in der Theorie...
Es läuft insofern nicht, daß ein alert(NameButton.value); mir den Wert anzeigt, aber eine Fehlermeldung behauptet NameButton has no properties (NC4.7?) bzw. "Value is NULL oder kein Objekt" (MSIE 6).
Ist das Problem jetzt klar?
Ja, jetzt ist es klar. Glasklar sogar.
Das Problem kann einfach sein, daß es die Eigenschaft "disabled" garnicht gibt. Davon steht jedenfalls nichts in SelfHTML.
Workaround: Mache eine lange Select-Liste. Bei der kannst du aktiv Elemente entfernen und hinzufügen.
Danke
Graphity
Bitte.
Ist das Problem jetzt klar?
Ja, jetzt ist es klar. Glasklar sogar.
Das Problem kann einfach sein, daß es die Eigenschaft "disabled" garnicht gibt. Davon steht jedenfalls nichts in SelfHTML.
Aber die Eigenschaft value muß es doch geben... *schnief*
Workaround: Mache eine lange Select-Liste. Bei der kannst du aktiv Elemente entfernen und hinzufügen.
Eher eine Notlösung, werde sie aber im Hinterkopf behalten
Danke
Graphity
Bitte.
Gern geschehen :-)
Hallo !
Es läuft insofern nicht, daß ein alert(NameButton.value); mir den Wert anzeigt, aber eine Fehlermeldung behauptet NameButton has no properties (NC4.7?) bzw. "Value is NULL oder kein Objekt" (MSIE 6).
Ich bekomme mit dem IE 6 erst beim Versuch das allerletzte arzt-Feld auszufüllen eine Fehlermeldung, vorher nicht.
Die Fehlermeldung lautet:
'undefined' ist Null oder kein Objekt
Meines Erachtens ergibt sich dieser Fehler wie folgt:
Nach Drücken eines Buttons aus der rechten Liste wird zunächst die Funktion
function InFeldEinfuegen(Button)
{
var leeresFeld = NaechstesLeereFeld(); //nächstes leere Feld in leeresFeld speichern
leeresFeld.focus(); //leeres Feld focussieren
leeresFeld.value = Button.name; //nächstes leere Feld mit Wert füllen
if(Button.value != "leer")
{
Button.disabled = true;
}
}
aufgerufen, die selbst dann die Funktion
function NaechstesLeereFeld() //nächstes leere Feld suchen
{
var ArztNummer = 0;
for(ArztNummer=1;ArztNummer<37;ArztNummer++) //alle input-Felder Namens arzt# werden durchsucht
{
var Feld = parent.Formular.document.forms["ETPFormular"].elements["arzt" + ArztNummer];
if(Feld.value == "") //falls Feld leer ist, wird
{
return Feld; //der Feldname zurückgegeben und die Fktn beendet
break;
}
}
}
aufruft.
In letzterer soll geprüft werden, welche Eingabefelder bereits ausgefüllt wurden, und als Objekt 'Feld' das nächste freie Eingabefeld zurückgegeben. Dies klappt auch bei den ersten 36 Feldern wunderbar, nur beim letzten, beim 37. geht es schief (Fehlermeldung s.o.).
Die Funktion prüft wieder die Felder 1 bis 36, keines davon ist leer und die Funktion liefert NIX zurück. Die aufrufende (also die erstgenannte) Funktion will aber ein leeres Feld und nicht NIX=undefined ;-) -> ergo Fehlermeldung.
Ich hoffe, ich hab' jetzt keinen Müll erzählt.
Ist das Problem jetzt klar?
Ja, ich erinnere mich dunkel. ;-)
Gruß,
kerki
Hallo !
Hallo mal wieder, an Dich erinnere ich mich noch :-)
Es läuft insofern nicht, daß ein alert(NameButton.value); mir den Wert anzeigt, aber eine Fehlermeldung behauptet NameButton has no properties (NC4.7?) bzw. "Value is NULL oder kein Objekt" (MSIE 6).
In letzterer soll geprüft werden, welche Eingabefelder bereits ausgefüllt wurden, und als Objekt 'Feld' das nächste freie Eingabefeld zurückgegeben. Dies klappt auch bei den ersten 36 Feldern wunderbar, nur beim letzten, beim 37. geht es schief (Fehlermeldung s.o.).
Wieso geht es schief? Es gibt ja noch ein freies, bevor dareingefügt wird...
Ich hoffe, ich hab' jetzt keinen Müll erzählt.
Es gibt keine dummen Erklärungen, nur dumme Fragen. Aber mal ernsthaft, ist Dir nicht aufgefallen, daß es hier um ein anderes Problem geht?
Gruß,
kerki
Gruß zurück
Graphity
Hallo !
Hallo mal wieder, an Dich erinnere ich mich noch :-)
Ganz viele Buttons! Keine Auswahlliste! *buäh* ;-)
In letzterer soll geprüft werden, welche Eingabefelder bereits ausgefüllt wurden, und als Objekt 'Feld' das nächste freie Eingabefeld zurückgegeben. Dies klappt auch bei den ersten 36 Feldern wunderbar, nur beim letzten, beim 37. geht es schief (Fehlermeldung s.o.).
Wieso geht es schief? Es gibt ja noch ein freies, bevor dareingefügt wird...
Also nochmal die Funktion: *hmm...*
function NaechstesLeereFeld() //nächstes leere Feld suchen
{
var ArztNummer = 0;
for(ArztNummer=1;ArztNummer<37;ArztNummer++) //alle input-Felder Namens arzt# werden durchsucht
Diese Schleife läuft von 1 bis 36. Richtig?
{
var Feld = parent.Formular.document.forms["ETPFormular"].elements["arzt" + ArztNummer];
if(Feld.value == "") //falls Feld leer ist, wird
Hier wird geprüft, ob diese Felder leer sind. Sind sie aber nicht. das nächste freie Feld ist 37!
{
return Feld; //der Feldname zurückgegeben und die Fktn beendet
break;
}
Da die if-Bedingung nicht erfüllt ist, wird dieses 'return Feld' nicht zurückgegeben
Und da hier nichts mehr kommt, wird auch sonst nichts zurückgegeben. :-(
}
}
Ergo -> nix -> undefined -> Fehlermeldung!
Oder spinn ich jetzt?
Gruß,
kerki
Nein, Du hattest Recht!
Die for-Schleife war falsch deklariert... hab's jetzt ausgebessert. Aber trotzdem funzt der Test-Button noch nicht, wie er soll...
Den ersten button erkennt er, aber die anderen...
cu
Graphity
Hi kerki, hi Graphity
Ergänzung zu kerkis Vorschlag
function InFeldEinfuegen(Button)
{
var leeresFeld = NaechstesLeereFeld(); //nächstes leere Feld in leeresFeld speichern
if (leeresFeld)
{
leeresFeld.focus(); //leeres Feld focussieren
leeresFeld.value = Button.name; //nächstes leere Feld mit Wert füllen
if(Button.value != "leer")
{
Button.disabled = true;
}
} else { alert("Kein Rückgeabewert!"); }
}
function NaechstesLeereFeld() //nächstes leere Feld suchen
{
var ArztNummer = 0;
for(ArztNummer=1;ArztNummer<37;ArztNummer++) //alle input-Felder Namens arzt# werden durchsucht
{
var Feld = parent.Formular.document.forms["ETPFormular"].elements["arzt" + ArztNummer];
if(Feld.value == "") //falls Feld leer ist, wird
{
return Feld; //der Feldname zurückgegeben und die Fktn beendet
break;
Das break kannst dir hier sparen, das wird nie im Leben ausgeführt!
}
}
return false;
stattdessen würde ich hier (nach beendigung der For-Schleife - das heisst, wenn kein if-Statement getriggert wurde) ein return false einbauen!
}
Ich hoffe, ich hab' jetzt keinen Müll erzählt.
Ist das Problem jetzt klar?
Ist imho einn ziemlich komplexer Vorgang der da in JS abgebildet werden soll. Es fällt mir nicht leicht, die ganzen Bedingungen + Schleifen in meinen Kopf reinzukriegen ;-)
lg regenfeld
Ist imho einn ziemlich komplexer Vorgang der da in JS abgebildet werden soll. Es fällt mir nicht leicht, die ganzen Bedingungen + Schleifen in meinen Kopf reinzukriegen ;-)
Hey, daß fasse ich jetzt so auf, daß es sich gelohnt hat, in das Forum zu posten *froi*, ich stehle also nicht grundlos eure Zeit :-)
Ich schätze eure Aufmerksamkeit und eure Hilfe, aber... die Funktion InFeldEinfuegen(Button) ist garnicht das Problem... und diese funzt nun, da ich die for-Schleife erweitert habe...
Das break ist wirklich schlechter stil... hast ja recht... aber "never change a runnign system"
lg regenfeld
lg schneeauch
*G*raphity
Hallo !
Ich schätze eure Aufmerksamkeit und eure Hilfe, aber... die Funktion InFeldEinfuegen(Button) ist garnicht das Problem... und diese funzt nun, da ich die for-Schleife erweitert habe...
Du bist aber auch ein Ei! Echt! *grr* ;-)
Du hast ja bisher auch nur flüchtig in einem Nebensatz erwähnt, dass deine Fehlermeldung ausgegen wird, wenn man auf den Button 'Test' drückt.
Dann schauen wir uns doch die entsprechende Funktion einmal an:
function ButtonAktivieren()
{
var ArztNummer = 0;
for(ArztNummer=1;ArztNummer<37;ArztNummer++) //alle input-Felder Namens arzt# werden durchsucht
Alle, bis auf eins, aber das hatten wir ja schon.
{
var Feld = parent.Formular.document.forms["ETPFormular"].elements["arzt" + ArztNummer];
if(Feld.value != "") //falls Feld nicht leer ist, wird
{
for(ArztName=0;ArztName<100;ArztName++)
{
var NameButton = document.forms[0].elements[ArztName];
alert(NameButton);
alert(NameButton.value) dürfte viel aussagekräftiger sein!
if(Feld.value == NameButton.value) //der Wert dieses Feldes mit den Buttons verglichen
{
NameButton.disabled = true;
}
else
{
NameButton.disabled = false;
}
}
}
}
}
Alles klar.
Die '100' hat du aber nur grob geschätzt, oder nicht? ;-)
*lol*
Gruß,
kerki
Sorry, dachte, ich hätte weiter oben exakt darauf hingewiesen... irren ist menschlich, entschuldige
alert(NameButton.value) gibt den richtigen value aus... richtig? was ist das?
richtig = der button der gerade geprüft wird, ich sehe also einen namen nach dem anderen als alert. mir ist aber aufgefallen, daß alert(Feld.value) immer nur einen Wert hat, d.h. die erste for-Schleife (die mittlerweile übrigens auch bis 100 geht) wird also garnicht weiter hochgesetzt :-(
100 hab ich genommen, weil ich denke, daß da nie 100namen stehen werden bzw. nie 100 felder auszufüllen sind... sollte doch kein prob darstellen, wenn er zu hoch zählt... oder? *hoff*
cu
Graphity
Hallo !
Sorry, dachte, ich hätte weiter oben exakt darauf hingewiesen... irren ist menschlich, entschuldige
Sauer war ich doch gar nicht wirklich, aber wir hätten uns viel Raterei ersparen können, wenn du gleich gesagt hättest bei welcher Gelegenheit die Fehlermeldung auftritt. So war ich ja zunächst froh, überhaupt einen Fehler gefunden zu haben, wenn auch einen falschen Fehler. :-)
richtig = der button der gerade geprüft wird, ich sehe also einen namen nach dem anderen als alert. mir ist aber aufgefallen, daß alert(Feld.value) immer nur einen Wert hat, d.h. die erste for-Schleife (die mittlerweile übrigens auch bis 100 geht) wird also garnicht weiter hochgesetzt :-(
Jetzt aber 'mal gaaanz langsam. Ich hör immer nur 100! *g*
100 hab ich genommen, weil ich denke, daß da nie 100namen stehen werden bzw. nie 100 felder auszufüllen sind... sollte doch kein prob darstellen, wenn er zu hoch zählt... oder? *hoff*
Klarer Fall von falsch gedacht. Nochmal der Code:
function ButtonAktivieren()
{
var ArztNummer = 0;
for(ArztNummer=1;ArztNummer<37;ArztNummer++) //alle input-Felder Namens arzt# werden durchsucht
{
var Feld = parent.Formular.document.forms["ETPFormular"].elements["arzt" + ArztNummer];
if(Feld.value != "") //falls Feld nicht leer ist, wird
{
for(ArztName=0;ArztName<100;ArztName++)
Diese Schleife läuft doch immer bis 100, oder sehe ich das falsch?
{
var NameButton = document.forms[0].elements[ArztName];
alert(NameButton);
Nein tue ich nicht, denn wenn man hier alert(NameButton.value); einsetzt, bekommt man die Namen aller Ärzte serviert, und beim 83. (wenn ich richtig gezählt habe) gibt's die Fehlermeldung, weil es den Arzt gar nicht gibt und damit auch kein Formularelement No. 83 -> kein Objekt -> eine Fehlermeldung.
if(Feld.value == NameButton.value) //der Wert dieses Feldes mit den Buttons verglichen
{
NameButton.disabled = true;
}
else
{
NameButton.disabled = false;
}
}
}
}
}
Ich weiß nicht ob die Schleife (auch mit den entsprechend richtigen Werten) so in ihrer Form ideal ist. Ich habe etwas Angst, dass die Sache etwas langsam geraten könnte: 37*82=3034 Vergleiche. Aber probiere es einfach mal aus.
Gruß,
kerki
Grüssi,
richtig = der button der gerade geprüft wird, ich sehe also einen namen nach dem anderen als alert. mir ist aber aufgefallen, daß alert(Feld.value) immer nur einen Wert hat, d.h. die erste for-Schleife (die mittlerweile übrigens auch bis 100 geht) wird also garnicht weiter hochgesetzt :-(
wenn du die Zeilenumbrüche immer noch in den values drin hast, dann springt die If-Bedingung nie an:
var Feld = parent.Formular.document.forms["ETPFormular"].elements["arzt" + ArztNummer];
if(Feld.value != "")
Denn Feld.value wird dann "\n" sein. Du solltest dir ob dieser ganzen Komplikationen, für die Zukunft überlegen, obs nicht einfacher wäre, gleich sauberen Code zu schreiben ;-)
Sauberer Code heisst unteranderem auch sauberer/aufgeräumter (HTML-)Quellcode! Nicht selten sieht man dynamische Seiten, die den Quelltext von PHP ohne einen einzige Umbruch ausgeben lassen. Ich möchte nicht in der Haut der Admins stecken, wenn er da nen Fehler suchen muss!
Was auch dazu gehört: Sicher terminierende Abbruch-Schleifenbedingungen, bzw. durchdachter Einsatz dergeleichen. Eine Schleife einfach von abc bis xyz laufen zu lassen, weil man glaubt, dass eh nie mehr Elemente vorkommen werden, kann Komplikationen ergeben, wenn man nicht genau weiss was man da tut. Du solltest immer Objekte für Schleifenbedingungen verwenden, die die length Property haben, oder eine Ähnliche Methode zur Verfügung stellen, um genau die Länge des Objektes zu ermitteln!
Auch solltest du immer die Funktionsaufrufe Schritt für schritt durchgehen. gibt die Funktion *immer* etwas zurück, werden alle Anweisungen in der Funktion bei *jedem* Aufruf ausgeführt, erwartet man einen Rückgabewert, ...
All das sind Sachen die bei dir fehlen, was die Komplexität nochmal steigert, und im gleichen Ausmass die Lesefreundlichkeit deines Codes verringert.
lg regenfeld
Grüssi,
wenn du die Zeilenumbrüche immer noch in den values drin hast, dann springt die If-Bedingung nie an:
<snip>
Ich habe die komischen Zeilenumbrüche nicht mehr drin, gleich nachdem Du (oder wer war das?) mich darauf aufmerksam gemacht hast, hab ich sie mit hilfe wegrationalisiert
Was auch dazu gehört: Sicher terminierende Abbruch-Schleifenbedingungen, bzw. durchdachter Einsatz dergeleichen. Eine Schleife einfach von abc bis xyz laufen zu lassen, weil man glaubt, dass eh nie mehr Elemente vorkommen werden, kann Komplikationen ergeben, wenn man nicht genau weiss was man da tut. Du solltest immer Objekte für Schleifenbedingungen verwenden, die die length Property haben, oder eine Ähnliche Methode zur Verfügung stellen, um genau die Länge des Objektes zu ermitteln!
ich habe gesehen, das es forms[#].legnth gibt, das gibt aber die anzahl der Formulare in der Datei wieder, es gibt kein elements.length, das die Anzahl der elemente in einem Formular zurückliefert. Es ist meines erachtens zu aufwändig für jeden Button ein eigenes Formular zu machen, wenn man Quellcode-länge und übersicht bedenkt! Kennst du eine Möglichkeit, die Anzahl der Elemente in einem Formular herauszufinden?
All das sind Sachen die bei dir fehlen, was die Komplexität nochmal steigert, und im gleichen Ausmass die Lesefreundlichkeit deines Codes verringert.
Find ich zwar nicht, aber Geschmack ist relativ...
lg regenfeld
sers
Graphity
Hallo !
ich habe gesehen, das es forms[#].legnth gibt, das gibt aber die anzahl der Formulare in der Datei wieder, es gibt kein elements.length, das die Anzahl der elemente in einem Formular zurückliefert.
Bei mir klappt es mit elements.length auch wunderbar. (IE, Mozilla und Opera)
Es ist meines erachtens zu aufwändig für jeden Button ein eigenes Formular zu machen, wenn man Quellcode-länge und übersicht bedenkt! Kennst du eine Möglichkeit, die Anzahl der Elemente in einem Formular herauszufinden?
Andersherum kommen die Eintragungen doch ohnehin aus PHP / einer DB, sodass du sie auch schon dort in den Quellcode setzen könntest.
Gruß,
kerki
Re: Grüssi,
Vielleicht liegts ja daran, dass du deine Zeilen ausgerechnet vor dem schliessenden " deiner Attributwerte umbrichst ;-)
<snip>
" onClick="InFeldEinfuegen(this)"></td></tr><tr><td align="right"> <input type="button" name="Agoura
" value="Agoura
" onClick="InFeldEinfuegen(this)"></td></tr><tr><td align="right"> <input type="button" name="Albert
" value="Albert
<snap>
Äh, nein. Das passiert durch das PHP, keine Ahnung wie ich das ändern kann...
Wie gibst du denn deine Daten aus in PHP? mit "echo"? Es kann schon sein, dass wenn ein '\n' im Namen ist, Javascript diesen Namen dann nicht korrekt erkennt, und so deine Fehler entstehen. Versuch mal die Zeile als ganzes auszugeben:
echo '<input type="button" name="Agoura" value="Agoura" onClick="InFeldEinfuegen(this)">\n';
Abgesehen davon funktionierts bei mir im IE 6 + Mozilla! NS 4.7 und Opera 5 steigen aus :-(
Ich benutze auch den MSIE 6... komisch. Vielleicht hast Du die Funktion garnicht ausgeführt? Hast Du ein paar Namen durch einen Klick auf einen Button eingefügt und dann durch einen Klick auf Test hat sich nichts verändert?? Eigentlich müsste er, wenn man einen Namen von dem Text-Feld wieder löscht, den Button mit diesem Namen nach einem Klick auf Test wieder freigeben...
Blöde Frage: Was spricht dagegen, deine Buttons alle gleich zu benennen, und den Namen nur als Wert zu nehmen - anstatt als name und wert gleichermassen?
<input type="button" name="arzt4" value="Busley" onClick="InFeldEinfuegen(this)">
<input type="button" name="arzt5" value="Detsch" onClick="InFeldEinfuegen(this)">
...
function ButtonAktivieren() {
for(i=1; i<37; i++) {
ArztnameETP = parent.Formular.document.forms["ETPFormular"].elements["arzt" + i].value;
if(ArztnameETP) {
for(i=1; i < 37; i++) {
NameButton = document.forms[0].elements['arzt'+i];
alert(NameButton.value);
if(ArztnameETP == NameButton.value) {
NameButton.disabled = true;
} else {
NameButton.disabled = false;
}
}
}
}
}
Wenn ich noch was anmeckern darf: Es wär glaub ich einfacher wenn du in der Funktion InsFeldEinfügen() den Namen des zuletzt geänderten Feldes in einer Globalen variable speicherst: LetztesGeandertesFeld = "arzt6" beispielsweise. wenn deine Buttons nun (namentlich) gleich aufgebaut sind wie deine Textfelder vereinfacht sich deine Funktion auf:
function ButtonAktivieren() {
NameFeld = parent.Formular.document.forms["ETPFormular"].elements[LetztesGeaendertesFeld];
NameButton = document.forms[0].elements[LetztesGeaendertesFeld];
if (NameFeld.value == NameButton.value)
NameButton.disabled = true;
} else {
NameButton.disabled = false;
}
}
hth?
graphity
hoffe tas hilft - auf englisch ;-)
regenfeld
Grüssi,
Hab das Problem gerade nochmal durchiteriert, und bitte darum, folgenden Absatz aus dem Protokoll zu streichen:
Wenn ich noch was anmeckern darf: Es wär glaub ich einfacher wenn du in der Funktion InsFeldEinfügen() den Namen des zuletzt geänderten Feldes in einer Globalen variable speicherst: LetztesGeandertesFeld = "arzt6" beispielsweise. wenn deine Buttons nun (namentlich) gleich aufgebaut sind wie deine Textfelder vereinfacht sich deine Funktion auf:
function ButtonAktivieren() {
NameFeld = parent.Formular.document.forms["ETPFormular"].elements[LetztesGeaendertesFeld];
NameButton = document.forms[0].elements[LetztesGeaendertesFeld];
if (NameFeld.value == NameButton.value)
NameButton.disabled = true;
} else {
NameButton.disabled = false;
}
}
Schlichtweg falsch gedacht :-(
Was allerdings funktionieren würde, wäre alle Buttons die gedrückt wurden in ein globales Array zu legen.
Schema:
ButtonsPressed[0] = "arzt1"
ButtonsPressed[1] = "arzt2" ... usw ...
function ButtonAktivieren() {
for(i=1; i<37; i++) {
ArztnameETP = parent.Formular.document.forms["ETPFormular"].elements["arzt" + i].value;
if(ArztnameETP) {
for(i=1; i < ButtonsPressed.length; i++) {
NameButton = document.forms[0].elements[ButtonsPressed[i]];
if(ArztnameETP == NameButton.value) {
NameButton.disabled = true;
} else {
NameButton.disabled = false;
}
}
}
}
}
So, Wenn ich das jetzt wieder falsch verstanden habe, wechsle ich den Beruf! ;-)
lg regenfeld
Hallo
Habe diesen Unterthread gerade eben erst entdeckt, deswegen diese lange Antwortdauer
Grüssi,
Was allerdings funktionieren würde, wäre alle Buttons die gedrückt wurden in ein globales Array zu legen.
Schema:
ButtonsPressed[0] = "arzt1"
ButtonsPressed[1] = "arzt2" ... usw ...
function ButtonAktivieren() {
for(i=1; i<37; i++) {
ArztnameETP = parent.Formular.document.forms["ETPFormular"].elements["arzt" + i].value;
if(ArztnameETP) {
for(i=1; i < ButtonsPressed.length; i++) {
NameButton = document.forms[0].elements[ButtonsPressed[i]];
if(ArztnameETP == NameButton.value) {
NameButton.disabled = true;
} else {
NameButton.disabled = false;
}
}
}
}
}
Hmm... auch keine schlechte Idee, im Gegenteil sogar. Ich würde es aber gerne so machen, wie ich vorgeschlagen habe, da man dann dort Namen auch per Hand eintippen kann, die Buttons dann aber auch ghosted sind, nachdem man Test gedrückt hat...
Oder wenn den Namen in ein Text-Feld hineinkopiert...
Nur weil man die Buttons benutzen _soll_ heißt das ja noch lange nicht, das man das auch macht... Menschen sind halt nunmal Menschen...
So, Wenn ich das jetzt wieder falsch verstanden habe, wechsle ich den Beruf! ;-)
Ganz im Gegenteil, ich bewundere Deine Art einen Fehler auf eine andere Art anzugehen. Jeder der hier mitliest bekommt dadurch vielleicht eine Idee, auch wenn sie den, der den thread gestartet hat, nicht interessiert... (de.soc.netzkultur würde mich jetzt wohl umbringen :-))
lg regenfeld
gb sonnenhaus(?)
*G*raphity
Grüssi,
Hmm... auch keine schlechte Idee, im Gegenteil sogar. Ich würde es aber gerne so machen, wie ich vorgeschlagen habe, da man dann dort Namen auch per Hand eintippen kann, die Buttons dann aber auch ghosted sind, nachdem man Test gedrückt hat...
Oder wenn den Namen in ein Text-Feld hineinkopiert...
Nur weil man die Buttons benutzen _soll_ heißt das ja noch lange nicht, das man das auch macht... Menschen sind halt nunmal Menschen...
Oh, oh, dann wirst aber spätestens bei der Einführung des Systems auf einige Sachen draufkommen: Es wird Leute geben, die 'ü' als 'ue' eingeben, oder aus Prinzip keine Grossbuchstaben verwenden, ... soll heissen, du musst, da du die Namen ja miteinander vergleichst, eine Menge String-Parsing-Funktionen drüberlaufen lassen ... Menschen sind halt nunmal Menschen ... ;-)
Die Idee von Sven mit den Select-Boxes gefällt mir übrigens auch sehr gut!
So, Wenn ich das jetzt wieder falsch verstanden habe, wechsle ich den Beruf! ;-)
Ganz im Gegenteil, ich bewundere Deine Art einen Fehler auf eine andere Art anzugehen.
Jeder der hier mitliest bekommt dadurch vielleicht eine Idee, auch wenn sie den, der den thread gestartet hat, nicht interessiert... (de.soc.netzkultur würde mich jetzt wohl umbringen :-))
Solange du triftige Gründe angeben kannst, wird dir niemand böse sein.
lg regenfeld
gb sonnenhaus(?)
*G*raphity
bg lichtwerfer
aka regenfeld ;-)
Da hast du recht... ä,ü usw könnten probs werden, bin ich froh, daß nicht so viele dieses proggi nutzen werden
Hallo mal wieder
Auch Hallo,
[...]
<snip>
function ButtonAktivieren()
{
var ArztNummer = 0;
(*)
for(ArztNummer=1;ArztNummer<37;ArztNummer++)
{
var Feld = parent.Formular.document.forms["ETPFormular"].elements["arzt" + ArztNummer];
if(Feld.value != "")
{
for(ArztName=0;ArztName<100;ArztName++)
{
var NameButton = document.forms[0].elements[ArztName];
|
+--> (!)
if(Feld.value == NameButton.value)
{
NameButton.disabled = "disabled";
}
else
{
NameButton.disabled = "";
}
}
}
}
}
<snip>
[...]
Wie Du siehst, hab ich in Deinem SourceCode eine Zeile mal herausgegriffen. Ich finde es nicht so geschickt, eine Variable innerhalb einer Schleife, die n-mal durchlaufen wird mittels var zu deklarieren.
Prüf doch einfach mal, was passiert, wenn Du die Deklaration außerhalb Deiner Schleifen vornimmst (möglichst in dem Bereich, wo "(*)" steht) und (damit auch der Typ korrekt ist) mit irgendeinem Wert des Objekttyps vorbelegst und dann innerhalb der Schleife nur noch eine einfache Zuweisung ohne (!) "var" geschieht.
Das mit dem true und false solltest Du natürlich auch beherzigen.
Bis denndann
Michael N.
Ich hab' mir jetzt nur die Frage durchgelesen, nicht all die Antworten.
if(Feld.value != "")
würde ich durch
if(Feld.value)
ersetzen. Dann werden values "null" auch abgefangen.
Ich hab' mir jetzt nur die Frage durchgelesen, nicht all die Antworten.
if(Feld.value != "")
würde ich durch
if(Feld.value)
ersetzen. Dann werden values "null" auch abgefangen.
hmm.. ich hab's probiert, aber dann geht garnichts mehr, nichtmal mehr die NamenEinfügen
thx anyway
Servus Leute
Habe es nun, dank eurer Hilfe, endlich geschafft, dieses Problem zu lösen. Hier ist der funktionierende Quellcode. Falls es noch fragen gibt, einfach anmailen...
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Ärzte</title>
</head>
<body>
<a href="einteilungsplan/menue-rechts.php" target="Menurechts">Zurück</a> zum Menü.<br>
<script language="php">
$link = mysql_connect ("localhost")
or die ("Could not connect <br>");
mysql_select_db("klinik");
$aerzte = mysql_query("SELECT name FROM namen ORDER BY name");
$br = "\n";
echo '<form name="LeerUndTest">';
echo '<table width="100%">' . $br;
echo '<tr><th colspan="2">Namen</th></tr>' . $br;
echo '<tr><td align="right">';
echo ' <input type="button" name="test" value="Test" onClick="ButtonAktivieren();">';
echo '</td></tr>' . $br;
echo '<tr><td align="right">';
echo ' <input type="button" name=" " value="leer" onClick="InFeldEinfuegen(this);">';
echo '</td></tr>' . $br;
echo '</table>' . $br;
echo '</form>' . $br;
echo '<form name="Namen">' . $br;
echo '<table width="100%">' . $br;
$x = 1;
while($row = mysql_fetch_array($aerzte))
{
echo $br . '<tr><td align="right">';
echo ' <input type="button" name="name' . $x . '" value="' . chop($row["name"]) . '" onClick="InFeldEinfuegen(this);">';
echo '</td></tr>';
$x++;
}
echo $br . '</table>';
echo $br . '</form>' . $br;
mysql_close ($link);
</script>
<script language="JavaScript" type="text/javascript">
<!--
function NaechstesLeereFeld() //nächstes leere Feld suchen
{
var ArztNummer = 0;
for(ArztNummer=1;ArztNummer<parent.Formular.document.forms["ETPFormular"].elements.length;ArztNummer++) //alle input-Felder Namens arzt# werden durchsucht
{
var Feld = parent.Formular.document.forms["ETPFormular"].elements["arzt" + ArztNummer];
if(Feld.value == "") //falls Feld leer ist, wird
{
return Feld; //der Feldname zurückgegeben und die Fktn beendet
break;
}
}
}
function ButtonAktivieren()
{
var ArztNummer = 1;
var NameButton = 0;
var Feld = 0;
var ButtonAnschalten = 0;
//Alle Buttons anschalten
for(ButtonAnschalten=1;ButtonAnschalten<=document.forms["Namen"].elements.length;ButtonAnschalten++)
{
NameButton = document.forms["Namen"].elements["name" + ButtonAnschalten];
NameButton.disabled = false;
}
//Die Buttons mit den angegebenen Namen ausschalten
for(ArztNummer=1;ArztNummer<38;ArztNummer++) //alle input-Felder Namens arzt# werden durchsucht
{
Feld = parent.Formular.document.forms["ETPFormular"].elements["arzt" + ArztNummer];
if(Feld.value) //falls Feld nicht leer ist, wird
{
for(ArztName=1;ArztName<=(document.forms["Namen"].elements.length);ArztName++)
{
NameButton = document.forms["Namen"].elements["name" + ArztName];
if(Feld.value == NameButton.value) //der Wert dieses Feldes mit den Buttons vergleichen
{
NameButton.disabled = true;
}
}
}
}
}
function InFeldEinfuegen(Button)
{
var leeresFeld = NaechstesLeereFeld(); //nächstes leere Feld in leeresFeld speichern
leeresFeld.focus(); //leeres Feld focussieren
if(Button.value == "leer")
{
leeresFeld.value = Button.name;
}
else
{
leeresFeld.value = Button.value; //nächstes leere Feld mit Wert füllen
}
if(Button.value != "leer")
{
Button.disabled = true;
}
}
//-->
</script>
</body>
</html>