Fehler in Netscape 'first is not defined'
Florian Pressler
- javascript
Hallo,
ich habe ein Projekt, welches ausgiebig Gebrauch von JavaScript macht, am Laufen, und habe dieses bis dato immer im IE(5.0) getestet. Heute habe ich probeweise eine Vorab-version der Seite im Netscape testen wollen, und wurde durch einen Fehler gleich am Anfang auf den Boden der Tatsachen geholt.
Leider gibt die JavaScript Konsole vom Netscape nicht mehr her als den Namen der Datei und die Fehlermeldung "first is not defined".
Hat vielleicht jemand eine Ahnung was diesen Fehler verursachen könnte? Leider kann ich den Code nicht ins Netz stellen, aber vielleicht kann mir trotzdem jemand weiterhelfen.
Danke
Florian Pressler
Hallo Florian,
Tja, das ist so der Standardfehler (mein persönlicher favorite). Auf IE heisst das soviel wie "first ist kein Objekt". Ähnlich aussagekräftig, gell ;-)
Nein ernsthaft, das kann 1000 Ursachen haben. Und ohne Code wird es schwerfallen, draufzukommen. Es sagt nur, dass ein Objekt keinen Wert besitzt. Das passiert z.b. oft durch Flüchtigkeitsfehler wie:
// function hallo() { write('huhu'); }
// <a href="javascript: halo();">
oder durch 999 andere Kleinigkeiten ;-) Auf jeden Fall immer Dinge, über die man sich später grün und blau ärgert!
Aber wenn das so geheim ist kannst du ja versuchen, es uns verbal zu schildern, dein Script. Angefangen mit:
Du siehst, es wäre leichter, wenn du ein wenig Code präsentieren könntest (muss ja nicht alles sein, die wesentlichen Passagen halt)
Grüsse
Bernhard
Hallo Bernhard,
Danke für Deine freundliche Antwort.
Du siehst, es wäre leichter, wenn du ein wenig Code präsentieren könntest (muss ja nicht alles sein, die wesentlichen Passagen halt)
also der Fehler wird in folgender Funktion bemängelt:
function sty (anzahl)
{
if (anzahl > 0) GenerateTable(first.anzahl.value);
else alert("Sie müssen angeben, wieviele Datensätze Sie eingeben wollen");
}
Wenn ich diese Funktion woanders hinschiebe, ändert sich auch die Zeilenangabe bei der Fehlermeldung des Netscape, es muß also eng mit dieser Funktion zusammenhängen. Ich kann in dieser Funktion keinen Fehler erkennen, aber wer weiß... GenerateTable ist eine andere Funktion, die als Übergabewert eine Eingabe aus einem Eingabefeld erwartet. Das Formular heißt 'first' und das Element 'anzahl', daher first.anzahl.value.
Aufgerufen wird diese Funktion übrigens über einen Senden-Knopf:
<INPUT TYPE=button VALUE="Senden" OnClick="sty(first.anzahl.value);">
Das Element 'anzahl' ist das Einzige seines Formulars. Ich hoffe, daß diese Angaben eine Hilfestellung erleichtern.
Danke auf jeden Fall schon mal im Voraus für Deine Mühen.
Florian Pressler
Hallo
Danke für Deine freundliche Antwort.
gern geschehen :)
Das Formular heißt 'first' und das Element 'anzahl', daher
first.anzahl.value.
Aufgerufen wird diese Funktion übrigens über einen Senden-Knopf:
<INPUT TYPE=button VALUE="Senden" OnClick="sty(first.anzahl.value);">
Also das iss ja schon mal was ;-)
Zuerst einmal solltest du Formularfelder immer nach folgender Syntax ansprechen:
document.forms['Formularname'].elements['Feldname'].value
bzw. document.forms[0].elements[0].value
Die Fehlermeldung hat er dir wahrscheinlich deswegen rausgeworfen, weil das document gefehlt hat, und er daher mit der Objekt-Hierarchie (DOM) nicht klargekommen ist. Allerdings hätte da auch der IE einen Fehler melden müssen.
Ich schätz mal generateTable() soll eine Tabelle mit "anzahl" spalten/zeilen zeichnen. Wenn ja, sollte folgendes genügen:
// function sty ()
// anz = document.forms['first'].elements[0].value;
// {
// if (anzahl > 0) GenerateTable(anzahl); ....}
... damit ersparst du dir beim Aufruf mit onClick die Wertabfrage. onClick="sty()"
Genaueres, wie du mit Formularen umgehst findest du in Selfhtml ;-)
Schöne Grüsse
Bernhard
Die Fehlermeldung hat er dir wahrscheinlich deswegen rausgeworfen, weil das document gefehlt hat, und er daher mit der Objekt-Hierarchie (DOM) nicht klargekommen ist. Allerdings hätte da auch der IE einen Fehler melden müssen.
also, ich hab mich jetzt ein bißchen gespielt und muß schon sagen - wirklich verstehen werde ich diese Browser nie... aber gut, zurück zum Wesentlichen. Also das Problem läßt sich ganz einfach dadurch lösen, daß man den in der Funktion sty befindlichen Funktionsaufruf von GenerateTable nicht mit einem erneuten Auslesen der Variable aus dem Formfeld bewerkstelligt, sondern einfach mit der der Funktion sty übergebenen Variable 'anzahl' (die ja eigentlich genau dieser Wert ist). Wohlgemerkt: den Aufruf der Funktion sty in der Form OnClick="sty(first.anzahl.value);" habe ich hierbei belassen, daß heißt man könnte vermuten, daß es nicht an dieser Art der Formulierung lag, so wie Du ja geschrieben hast. ABER: Wenn ich in nun den Funktionsaufruf in der Funktion sty so wie Du vorgeschlagen hast IN der Funktion anstatt 'anzahl' oder auch 'first.anzahl.value' schreibe, dann funktioniert es auch. Meine Schlußfolgerung: Netscape hat die "korrektere" Formulierung 'documents.form...' lieber, nimmt aber auch 'first.anzahl.value' - aber nur, wenn es sich dieser Ausdruck nicht innerhalb einer anderen Funktion befindet...
so long
Florian Pressler
Hi,
also, ich hab mich jetzt ein bißchen gespielt und muß schon
sagen - wirklich verstehen werde ich diese Browser nie...
da bist du nicht allein ;-(
Also das Problem läßt sich ganz einfach dadurch lösen, daß man
den in der Funktion sty befindlichen Funktionsaufruf von
GenerateTable nicht mit einem erneuten Auslesen der Variable aus
dem Formfeld bewerkstelligt, sondern einfach mit der der Funktion
sty übergebenen Variable 'anzahl' (die ja eigentlich genau dieser
Wert ist).
ja. Da kann es auch keine Probleme geben.
Wohlgemerkt: den Aufruf der Funktion sty in der Form OnClick="sty
(first.anzahl.value);" habe ich hierbei belassen, daß heißt man
könnte vermuten, daß es nicht an dieser Art der Formulierung lag,
so wie Du ja geschrieben hast.
Im Formular selbst wundert mich das nicht so arg, dass du da kein "document." brauchst, mit onClick="sty(this.anzahl.value)" funktioniert ja auch. Allerdings wundert mich, dass der NS so tolerant ist !
ABER: Wenn ich in nun den Funktionsaufruf in der Funktion sty so
wie Du vorgeschlagen hast IN der Funktion anstatt 'anzahl' oder
auch 'first.anzahl.value' schreibe, dann funktioniert es auch.
Was meinst du da? Was funktioniert IN der Funktion?
// anzahl = document.forms['first'].elements[0].value;
oder
// if (anzahl > 0) GenerateTable(first.anzahl.value); ....}
dass letzteres funktioniert kann ich mir echt nicht vorstellen, aber
wie du schon gesagt hast. Die Browser werden uns ein ewiges Rätsel
bleiben ;-)
Meine Schlußfolgerung: Netscape hat die "korrektere"
Formulierung 'documents.form...' lieber, nimmt aber
auch 'first.anzahl.value' - aber nur, wenn es sich dieser
Ausdruck nicht innerhalb einer anderen Funktion befindet...
Ich kann dir nur sagen, mach es lieber so wie ich dir vorgeschlagen habe, so stimmts auf _jeden_ Fall. Ausser du stehst auf graue Haare :)
Grüsse,
Bernhard
Was meinst du da? Was funktioniert IN der Funktion?
Hmm, ich hab' mich da glaub' ich etwas unklar ausgedrückt, sorry. Ganz kurz die beiden relevanten Elemente, wie sie im betreffenden Beispiel ausgesehen haben:
function sty (anzahl)
{
if (anzahl > 0) GenerateTable(document.forms['first'].elements[0].value);
else alert("Sie müssen angeben, wieviele Datensätze Sie eingeben wollen");
}
<INPUT TYPE=button VALUE="Senden" OnClick="sty(first.anzahl.value);">
Dieses Beispiel funktioniert überall, und seltsam fand ich das deshalb, weil im unteren Teil jene Syntax verwende ('first.anzahl.value'), welche oben (in der Funktion) einen Fehler verursacht.
Ich kann dir nur sagen, mach es lieber so wie ich dir vorgeschlagen habe, so stimmts auf _jeden_ Fall. Ausser du stehst auf graue Haare :)
Mach ich, sicher ist sicher!
mit freundlichen Grüßen
Florian Pressler
Hallo Florian
function sty (anzahl)
{
if (anzahl > 0) GenerateTable(document.forms['first'].elements[0].value);
else alert("Sie müssen angeben, wieviele Datensätze Sie eingeben wollen");
}<INPUT TYPE=button VALUE="Senden" OnClick="sty(first.anzahl.value);">
Ach so, dann ist die Welt ja noch in Ordnung. Du musst dir nur folgendes vorstellen: Alles was zwischen <script> und </script> steht kannst du in eine eigene JS-Datei schreiben (file.js) und in deine HTML-Seite einbinden. Das bezweifelt ja hoffentlich niemand ;-)
Das heisst, was passiert wenn du jetzt in deiner Funktion, die du zwischen zwei Script-TAGs definierst _kein_ "document." hinschreibst? Wo soll der Browser anfangen zu suchen? first könnte alles sein, z.b. der Name eines Fensters, ...
Der Script-Bereich "gehört also quasi gar nicht zum Dokument". Darum musst du dort immer mit document.element.unterelement arbeiten :)
keep it simple ;-)
Bernhard