Sabine: Fehlermeldung beim Formularabschicken innerhalb von Javascript

Hallo Leute,

Ich habe ein ganz spezielles Problem in Javascript. Ich möchte ein Suchformular erstellen, wobei das Formular einerseits mit einem Link, der sich "Suchen" nennt und andererseits mit Return abgeschickt werden kann. Und weiters sollen die Formulardaten nach Submit in einer Funktion noch überprüft werden. Hinzukommt aber noch, dass ich das Formular in einer js-Datei habe, welche von jeder Seite meines Webs aufgerufen werden soll. D. h. das ganze ist in js geschrieben. Und weiters arbeite ich mit Frames und "nav1" ist der Frame, den ich hier ansprechen möchte.

Hier nun der Script Code:

parent.nav1.document.write("<table border=0 cellspacing=0 cellpadding=0><form name=suche method='get' target='_top' action='/cgi-bin/search.pl' onsubmit='javascript:return checksuche();'><tr><td height=18 width=9 nowrap></td><td>");

if(navigator.userAgent.indexOf("Opera")>-1){var sizeField=sizeOpera;}
        else{if(navigator.appName.indexOf("Netscape")>-1){var sizeField=sizeNetscape;}
                else{var sizeField=sizeMSIE;}}

parent.nav1.document.write("<input type='text' name='q' size='"+sizeField+"' class='formElements' value=''>");

parent.nav1.document.write("</div></td><td width=4></td><td valign=bottom><a class='search' href='javascript:parent.nav1.document.suche.submit();' onclick='javascript:return checksuche();'>Suchen</a></td></tr></form></table>");

Im IE 5.5 ergibt dieser Code einen Laufzeitfehler in Zeile 0, Fehler: Objekt erwartet. Im Script-Debugger werden je nachdem, ob auf den Link oder auf Return geklickt wird, folgende 2 Zeilen gekennzeichnet:

onsubmit='javascript:return checksuche();' und
onclick='javascript:return checksuche();'

Die Folgeseite wird zwar angezeigt, aber eben diese Fehlermeldung kommt, und außerdem wird meine Fuktion nicht aufgerufen.

Interessanterweise schreibt mir der Netscape 4.77 gar keine Fehlermeldung.

Mein Frage nun konkret: Wie schreibe ich diesen Funktionsaufruf innerhalb von Javascript richtig? Der gleiche Code funktioniert in reinem HTML indem man beim Form-Tag onsubmit="return funktionsname();" und im A-Tag onclick="return funktionsname();" angibt. Wie funktioniert das ganze in Javascirpt und mit Angabe des richtigen Frames?

Ich hoffe, dass mir jemand dabei helfen kann, denn ich stehe schon ziemlich an. Falls noch weitere Angaben benötigt werden, kann man mich auch gerne per Mail kontaktieren.
Danke einmal im voraus.

Sabine

  1. Hallo Leute,

    Hallo Binchen,

    Ich habe ein ganz spezielles Problem in Javascript. Ich möchte ein Suchformular erstellen, wobei das Formular einerseits mit einem Link, der sich "Suchen" nennt und andererseits mit Return abgeschickt werden kann. Und weiters sollen die Formulardaten nach Submit in einer Funktion noch überprüft werden. Hinzukommt aber noch, dass ich das Formular in einer js-Datei habe, welche von jeder Seite meines Webs aufgerufen werden soll. D. h. das ganze ist in js geschrieben. Und weiters arbeite ich mit Frames und "nav1" ist der Frame, den ich hier ansprechen möchte.

    Hier nun der Script Code:

    parent.nav1.document.write("<table border=0 cellspacing=0 cellpadding=0><form name=suche method='get' target='_top' action='/cgi-bin/search.pl' onsubmit='javascript:return checksuche();'><tr><td height=18 width=9 nowrap></td><td>");

    Versuchs mal ohne eine Methode "get", sondern schreib method="javascript:Funktion()"

    mfg
    HaThoR

    1. Moin!

      Versuchs mal ohne eine Methode "get", sondern schreib method="javascript:Funktion()"

      Hast du überhaupt den blassesten Schimmer einer Ahnung, was du da als Ratschlag von dir gibst, oder ist das blinder Aktionismus, weil du unbedingt antworten willst? Hast du deine Lösung wenigstens getestet? Ansonsten laß' das doch einfach.

      http://www.nuhr.de/data/FRESSEHA.MP3
      "Wenn man keine Ahnung hat: Einfach mal Fresse halten."

      (Hiermit beantrage ich, daß das Forum nicht nur Message-Grafiken kennt, sondern auch Sounds einbinden kann. Oh, Mist, ich will kein <I>, seht ihr denn das <i> nicht? :) )

      - Sven Rautenberg

      1. Moin!

        Versuchs mal ohne eine Methode "get", sondern schreib method="javascript:Funktion()"

        Hast du überhaupt den blassesten Schimmer einer Ahnung, was du da als Ratschlag von dir gibst, oder ist das blinder Aktionismus, weil du unbedingt antworten willst? Hast du deine Lösung wenigstens getestet? Ansonsten laß' das doch einfach.

        Ich hatte dasselbe Problem wie Sabine. Es klappte sowohl mit IE 5.x bis 6.x plötzlich, als ich spaßeshalber "method='javascript:xyz()'" ausprobiert habe. Habe mich selbst gewundert. Aber damit konnte ich die ENTER-Taste auf eine Funktion umleiten.

        http://www.nuhr.de/data/FRESSEHA.MP3
        "Wenn man keine Ahnung hat: Einfach mal Fresse halten."

        Nana!

        (Hiermit beantrage ich, daß das Forum nicht nur Message-Grafiken kennt, sondern auch Sounds einbinden kann. Oh, Mist, ich will kein <I>, seht ihr denn das <i> nicht? :) )

        • Sven Rautenberg

        Nix 4 oongood
        HaThoR

      2. Ach ja: und mit NN 6.1 funktionierte es auch so ohne Beanstandungen

        (...wollte ich eigentlich schreiben und hab´s wieder mal vergessen, war aber überzeugt , ich hätte... Kennst Du ja von mir...)

        Also Fazit: ich weiß zwar nicht, was ich da getan habe, weil´s nirgends so dokumentiert ist, aber es fungst.

        mjg nochmal
        HaThoR

  2. Moin!

    Du hast ein komplexes Problem...

    Im IE 5.5 ergibt dieser Code einen Laufzeitfehler in Zeile 0, Fehler: Objekt erwartet. Im Script-Debugger werden je nachdem, ob auf den Link oder auf Return geklickt wird, folgende 2 Zeilen gekennzeichnet:

    onsubmit='javascript:return checksuche();' und
    onclick='javascript:return checksuche();'

    onclick, onmouseover, onmouseout, onsubmit, onirgendwas... - alle haben eine Gemeinsamkeit: Bitte kein "javascript:" davorsetzen! Diese Attribute sind Event-Handler, das bedeutet, sie können nur Javascript ausführen, alles andere wäre sinnlos. Bei einem Link <a href="irgendwas"> muß man "javascript:" davorschreiben, damit der Browser weiß, was er da als URL hat, und nicht versehentlich solch eine Seite vom Server abruft.

    Außerdem reicht es vollkommen, wenn du nur onsubmit prüfst, ob das Formular in Ordnung ist.

    Punkt zwei: Im <form> steht: target="_top". Das mußt du natürlich ändern, wenn das Ergebnis des Formulars in einen bestimmten Frame gehen soll.

    Die Folgeseite wird zwar angezeigt, aber eben diese Fehlermeldung kommt, und außerdem wird meine Fuktion nicht aufgerufen.

    Wenn Fehler entdeckt werden, dann wurde das, was fehlerhaft ist, nicht gemacht. Formular abschicken geht (das hat mit Javascript nichts zu tun), aber Prüfen geht nicht wegen falschem Aufruf.

    Interessanterweise schreibt mir der Netscape 4.77 gar keine Fehlermeldung.

    Bestimmt tut er das, nur versteckt. Wenn du in die URL-Zeile "javascript:" eingibst (das hat jetzt nichts mit dem "javascript:" von eben zu tun), dann öffnet er die Javascript-Konsole, in der nacheinander alle auftretenden Fehler angezeigt werden. Und das sogar brauchbarer, als beim IE ohne Debugger.

    - Sven Rautenberg

    1. Hallo Sven!
      Danke einmal für die vielen Hinweise! Ich habe auch schon alle umgesetzt.

      Moin!

      Du hast ein komplexes Problem...

      Im IE 5.5 ergibt dieser Code einen Laufzeitfehler in Zeile 0, Fehler: Objekt erwartet. Im Script-Debugger werden je nachdem, ob auf den Link oder auf Return geklickt wird, folgende 2 Zeilen gekennzeichnet:

      onsubmit='javascript:return checksuche();' und
      onclick='javascript:return checksuche();'

      onclick, onmouseover, onmouseout, onsubmit, onirgendwas... - alle haben eine Gemeinsamkeit: Bitte kein "javascript:" davorsetzen! Diese Attribute sind Event-Handler, das bedeutet, sie können nur Javascript ausführen, alles andere wäre sinnlos. Bei einem Link <a href="irgendwas"> muß man "javascript:" davorschreiben, damit der Browser weiß, was er da als URL hat, und nicht versehentlich solch eine Seite vom Server abruft.

      Danke für die ausführliche Erklärung! Ich habe nun bei onsubmit das "javascript:" rausgenommen, nun steht nur mehr onsubmit='return checksuche();'

      Außerdem reicht es vollkommen, wenn du nur onsubmit prüfst, ob das Formular in Ordnung ist.

      Ok, ist eigentlich wahr... habe onclick rausgenommen.

      Punkt zwei: Im <form> steht: target="_top". Das mußt du natürlich ändern, wenn das Ergebnis des Formulars in einen bestimmten Frame gehen soll.

      Ja, das ist mir klar. Das Ergebnis wird aber in einer eigenen Website angezeigt.

      Die Folgeseite wird zwar angezeigt, aber eben diese Fehlermeldung kommt, und außerdem wird meine Fuktion nicht aufgerufen.

      Wenn Fehler entdeckt werden, dann wurde das, was fehlerhaft ist, nicht gemacht. Formular abschicken geht (das hat mit Javascript nichts zu tun), aber Prüfen geht nicht wegen falschem Aufruf.

      Ja genau, das ist mir mittlerweile auch schon klar, dass mein Aufruf der Funktion falsch ist. Nur leider bin ich immer noch nicht draufgekommen wie ich es richtig schreibe.

      Interessanterweise schreibt mir der Netscape 4.77 gar keine Fehlermeldung.

      Bestimmt tut er das, nur versteckt. Wenn du in die URL-Zeile "javascript:" eingibst (das hat jetzt nichts mit dem "javascript:" von eben zu tun), dann öffnet er die Javascript-Konsole, in der nacheinander alle auftretenden Fehler angezeigt werden. Und das sogar brauchbarer, als beim IE ohne Debugger.

      Dieser Hinweis hat mir sehr geholfen. Das wußte ich nicht, dass ich im Netscape mit "javascript:" diese Fehlerbeschreibungen bekomme. Also bei meinem Fall kommt jetzt, nachdem ich alle Deine Hinweise ausgebessert habe, folgende Fehlermeldung: "checksuche is not defined." Ist das nun wirklich ein Fehler im Aufruf der Funktion? Oder kann auch in der Funktion selber ein Fehler vorhanden sein? Ich kenne da leider Javascript zu wenig. Also dass es die Funktion auch wirklich gibt, mußt Du mir auch glauben. Ich habe auch extra nochmal den Namen der Funkion beim Aufruf noch mal mit STRG-C und STRG-V zur Funktion selber kopiert, um ja auszuschließen, dass ich den Namen falsch geschrieben habe. Ich weiß nicht, stehe ich jetzt auf der Leitung? Warum geht denn mein Funktionsaufruf nicht? Direkt in HTML funktioniert er einwandfrei. Und dort habe ich auch den Beweis, dass die Funktion selber richtig ist (es wird dort nur überprüft, ob das Feld leer ist oder nicht). Also liegt es doch irgendwie daran, dass dieses ganze Formular samt Aufruf in einer js-Datei liegt? Ist da die Schreibweise anders? Das war auch der Grund, warum ich bei onsubmit javascript: davor gesetzt habe.

      Ich hoffe ich stelle hier nicht zu viele Fragen. Ich bin nur schon etwas verzweifelt dabei. Und dann werd ich aus den tollen Fehlermeldungen von Javascript nicht wirklich schlau.

      Danke nochmal
      Sabine

      • Sven Rautenberg
      1. MoiN!

        Dieser Hinweis hat mir sehr geholfen. Das wußte ich nicht, dass ich im Netscape mit "javascript:" diese Fehlerbeschreibungen bekomme. Also bei meinem Fall kommt jetzt, nachdem ich alle Deine Hinweise ausgebessert habe, folgende Fehlermeldung: "checksuche is not defined." Ist das nun wirklich ein Fehler im Aufruf der Funktion?

        Nein, das ist ein Fehler in der Definition der Funktion.

        Der Aufruf mit checksuche() funktioniert einfach deshalb nicht, weil keine Funktion mit diesem Namen definiert ist.

        Hast du im Dokument, welches das Formular enthält, diese Funktion definiert? Ist der Name auch wirklich durchgehend kleingeschrieben (ganz wichtig! Javascript ist case-sensitiv, Groß/Kleinschreibung ist entscheidend!)?

        Oder kann auch in der Funktion selber ein Fehler vorhanden sein?

        Klar, wenn dadurch verhindert wird, daß sie gültig definiert wurde, wird sie hinterher nicht gefunden. Aber dann wäre eine andere Fehlermeldung erschienen.

        Ich kenne da leider Javascript zu wenig. Also dass es die Funktion auch wirklich gibt, mußt Du mir auch glauben. Ich habe auch extra nochmal den Namen der Funkion beim Aufruf noch mal mit STRG-C und STRG-V zur Funktion selber kopiert, um ja auszuschließen, dass ich den Namen falsch geschrieben habe. Ich weiß nicht, stehe ich jetzt auf der Leitung? Warum geht denn mein Funktionsaufruf nicht?

        Schreibst du die Funktion auch nochmal mit Javascript ins Formular?

        Direkt in HTML funktioniert er einwandfrei. Und dort habe ich auch den Beweis, dass die Funktion selber richtig ist (es wird dort nur überprüft, ob das Feld leer ist oder nicht). Also liegt es doch irgendwie daran, dass dieses ganze Formular samt Aufruf in einer js-Datei liegt? Ist da die Schreibweise anders? Das war auch der Grund, warum ich bei onsubmit javascript: davor gesetzt habe.

        Die Schreibweise ist nicht anders. Egal ob vom Server oder durch Javascript erzeugt: Der Inhalt eines Dokuments funktioniert immer gleich.

        Ich hoffe ich stelle hier nicht zu viele Fragen. Ich bin nur schon etwas verzweifelt dabei. Und dann werd ich aus den tollen Fehlermeldungen von Javascript nicht wirklich schlau.

        Die Fehlermeldungen sind aber dein Freund. :)

        Was mir spontan noch einfällt: Du schreibst das Formular ja aus einem Frame heraus in einen anderen Frame. Wo ist die Funktion checksuche definiert? Im alten Frame? Dann kannst du auf sie auch frameübergreifend zugreifen.

        Wenn sie z.B. im obersten Frame definiert wäre, würdest du sie aus allen Framefenstern heraus mit top.checksuche() aufrufen können. Logischerweise geht das Konzept auch, wenn sie im Frameset etwas tiefer angesiedelt ist: top.name1.name2.checksuche() geht, oder auch parent.nachbarframe.checksuche(). Eventuell solltest du damit mal etwas herumspielen. Wie du andere Frames über Javascript ansprichst, hast du ja schon herausgefunden. Auf die gleiche Weise werden Funktionen und Variablen angesprochen. Das funktioniert nur dann NICHT, wenn der Inhalt des anderen Frames von einer anderen Domain kommt (Sicherheitsbestimmungen verhindern das).

        - Sven Rautenberg

        1. Hallo nochmal!
          Erst einmal dankeschön für die sehr konkreten Hinweise, die mich wirklich schon sehr nahe an das wirkliche Problem hinführen. Ich denke, dass ich das ganze nun richtig durchschaue. Dein letzter Hinweis,

          Was mir spontan noch einfällt: Du schreibst das Formular ja aus einem Frame heraus in einen anderen Frame. Wo ist die Funktion checksuche definiert? Im alten Frame? Dann kannst du auf sie auch frameübergreifend zugreifen.

          Wenn sie z.B. im obersten Frame definiert wäre, würdest du sie aus allen Framefenstern heraus mit top.checksuche() aufrufen können. Logischerweise geht das Konzept auch, wenn sie im Frameset etwas tiefer angesiedelt ist: top.name1.name2.checksuche() geht, oder auch parent.nachbarframe.checksuche(). Eventuell solltest du damit mal etwas herumspielen. Wie du andere Frames über Javascript ansprichst, hast du ja schon herausgefunden. Auf die gleiche Weise werden Funktionen und Variablen angesprochen. Das funktioniert nur dann NICHT, wenn der Inhalt des anderen Frames von einer anderen Domain kommt (Sicherheitsbestimmungen verhindern das).

          ist glaube ich das wirkliche Problem. Ich kann es nur leider erst wieder am Montag ausprobieren. Möchte mich aber jetzt schon hifür bedanken. Denn ich arbeite in einer ziemlich großen Firma, wo mir bis jetzt noch keiner so konkrete Fehlerhinweise liefern konnte - echt traurig finde ich. Falls das Script nun wirklich funktioniert, werde ich mich bei meinem Chef wegen einer ev. Prämie für Dich einsetzen ;-)
          Melde mich dann am Montag wieder.
          Ciao und schönes WE
          Sabine