Urs: Fehlermeldungen im Allgemeinen...

Hallo Forumer/innen!

Als blutiger Anfänger in Sachen Javascript habe ich mir mal das einfachste (?) Script vorgenommen, und zwar die dynamischen grafische Buttons (wie in SelfHTML beschrieben: http://www.teamone.de/selfhtml/tedg.htm).
Dort steht auch, dass das Ganze mit IE3 nicht geht. Es gibt eine Fehlermeldung ( Zeile: 7 'Image' ist undefiniert ) , was ziemlich "unschön" ist.

Nun zu meiner Frage: kann man den IE3 und andere Browser dazu bringen, dass sie Scripts, die sie nicht verstehen einfach "überlesen". Dass die Scripts in einen Kommentar gehören ist mir bewusst, scheint aber den IE3 nicht zu beeindrucken.

Falls jemand einen Rat weiss, vielen Dank!

Gruss Urs

  1. Hallo Urs!

    Nun zu meiner Frage: kann man den IE3 und andere Browser dazu bringen, dass sie Scripts, die sie nicht verstehen einfach "überlesen".

    Zum einen kann man durch den Language-Typ etwas einschränken (z.B. <script language="JavaScript1.1"> oder <script language="JScript">), was aber "dank" sehr schlechter Einhaltung der Spezifikationen relativ wenig bringt.
    Dann gibt's noch die "gute alte" Browserabfrage über navigator.appName und navigator.appVersion.
    Außerdem kann man theoretisch noch abfragen, ob es ein Objekt gibt, etwa if (document.layers) {...}, aber damit hatte ich in der Praxis öfters Probleme ("Objekt ist nicht vorhanden" oder ähnliche Fehlermeldungen).

    Ciao,
    Mirko

    1. Außerdem kann man theoretisch noch abfragen, ob es ein Objekt gibt, etwa if (document.layers) {...}, aber damit hatte ich in der Praxis öfters Probleme ("Objekt ist nicht vorhanden" oder ähnliche Fehlermeldungen).

      Ciao,
      Mirko

      nicht nur theoretisch sondern auch praktisch, mit der Abfrage ob ein Element vorhanden ist, schließt man beim Fehlen des Elementes alles andere aus, vorausgesetzt alle diesbezüglichen Anweisungen befinden sich in den geschweiften Klammern (wenn es mehr als eine ist)

      if (document.images) schließt den IE3 aus,
      if (document.all) erfaßt den IE ab der 4 und
      if (document.layers) die vierer Versionen des Navis

      weiterhin kann man auch die Existenz von Variablen etc. abfragen und damit Fehlermeldungen vorbeugen.

      Fehlermeldungen kommen nur, wenn die Abfrage nicht alle Bereiche erfaßt, die verwendet werden.

      Viele Grüße

      Antje

      1. Hallo Antje!

        weiterhin kann man auch die Existenz von Variablen etc. abfragen und damit Fehlermeldungen vorbeugen.

        Von Variablen, wirklich? Die Moeglichkeit, die Existenz von Funktionen/Methoden abzufragen, ist mir ja bekannt. So testet z.B.
            if (window.focus) then window.focus();
        erst mal, ob die focus()-Methode beim window-Objekt ueberhaupt implementiert ist, und falls ja, wird diese ausgefuehrt. Man beachte hier die fehlenden Klammern hinter focus innerhalb der if-Bedingung. Haette ich die Klammern hingeschrieben, so hiesse das, der Rueckgabewert (den es bei focus() gar nicht gibt) wuerde ausgewertet werden und falls er einen Wert ungleich 0, also True, ergibt, wird die im True-Zweig stehende(n) Anweisung(en) ausgefuehrt.

        Wenn ich aber in der gleichen Weise eine Variable pruefe, dann erwarte ich vom JS-Interpreter nicht die Feststellung, ob die denn ueberhaupt existiert, sondern ich nehme einfach an, dass sie existiert und verlange eine ordentliche Auswertung des Variableninhalts. Wenn ich also frage
            if (window.document.MyForm.MyDropDownBox.options[2].selected)  alert("Hallo");
        soll genau dann eine Messagebox aufgeblendet werden, wenn die 3. Option (Index 2) aus einer bestimmten Drop-Down-Box in einem Formular ausgewaehlt ist. (Oft wird die Schreibweise
            if (xxxx.selected == true)  mach_was();    verwendet, aber das ist doppelt-gemoppelt, denn es wird letztlich abhaengig vom selected-Status entweder
            if (true == true)    oder    if (false == true)    abgefragt. In beiden Faellen ist das Ergebnis jeweils der eigentliche selected-Status. Aber manche finden es einfach uebersichtlicher so.)

        Dies laesst nun vermuten, dass ein JS-Fehler entstehen muesste, falls eine Variable abgefragt wird, die es gar nicht gibt. Das ist aber nach meiner Erfahrung nicht so. Das heisst nun entweder, dass ich unrecht habe (dass also in der Tat die Existenz der Variable abgefragt wird und nicht deren Wert), oder dass die Nicht-Existenz der Variable als gleichbedeutend mit 'Variable ist false' angesehen wird. Im ersten Fall muesste eine If-Abfrage letztlich zu True ausgewertet werden, wenn ich eine Variable abfrage, die existent ist und den Wert 0 hat (denn die Variable existiert ja). Im zweiten Fall muesste dieselbe Abfrage zu False ausgewertet werden (denn die Variable hat den Wert 0, was gleichbedeutend mit false ist). Wer mag, kann ein Script schreiben, das ueberprueft, was nun Sache ist.

        So, viel theoretisiert, eigentlich wollte ich ja nur sagen, dass ich glaube, die Existenz von Variablen laesst sich so nicht feststellen. ;-)

        Calocybe

        1. So, viel theoretisiert, eigentlich wollte ich ja nur sagen, dass ich glaube, die Existenz von Variablen laesst sich so nicht feststellen. ;-)

          Calocybe

          Du hast Recht, nicht die Existenz wird abgefragt, daß geht nur bei Objekten, sondern ob die Variable einen Wert hat. Gibt es die Variable nicht, wird man mit einer Fehlermeldung bestraft. Ich hätte nicht so voreilig sein sollen :-).
          Allerdings reicht es schon, wenn man die Variable einfach mit var y; anmeldet.
          Für Urs, noch ein kleines Beispiel, wie es funktioniert:

          <html><head><title>Test</title>
          <script language="JavaScript">
          <!--
          var y; /* y hat noch keinen Wert */

          if (y) alert('ja'); else alert('nein');

          function test()
          {
          if (y) alert(y);
          }

          //-->
          </script>
          </head>
          <body>
          <a href="JavaScript:test()">test</a>
          <script language="JavaScript">
          <!-- /* y erhält einen Wert */
          y=20;
          //-->
          </script>
          </body>
          </html>

          Viele Grüße

          Antje

          1. Hallo Antje!

            »»  Gibt es die Variable nicht, wird man mit einer Fehlermeldung bestraft.

            Ja was denn?! Bei mir gab es doch nie eine! Also nochmal probier.... und herausfind:
            Es kommt darauf an, wie man y abfragt. Du hast verwendet
                > if (y) alert('ja'); else alert('nein');
            Aber ich hatte bisher immer etwas in der Art
                if (self.y) alert('ja'); else alert('nein');
            Und das vermeidet tatseachlich die Fehlermeldung, wenn y noch nicht deklariert ist! Stattdessen gibt es einfach die 'Nein'-Meldung. Es funzt natuerlich auch mit window.y.

            Heisst das jetzt etwa, dass (self.y) doch in erster Linie die Existenz abfragt und nicht den Wert? Weitere Versuche ergeben: Auch wenn man y deklariert und mit 0 initialisiert, kommt die 'Nein'-Meldung. Erst bei y=1 gibt es 'Ja'. Fragt man nur (y) ab, bekommt man die Fehlermeldung ("y is not defined."), wie Du schon gesagt hast. Auch hier natuerlich erst die 'Ja'-Meldung, wenn y=1 (oder besser: y!=0).

            Interessant, wie ich finde. Vielleicht kann ja mal jemand irgendeine Spec raussuchen, wo das beschrieben ist? Ich koennte mir auch vorstellen, dass das bei verschiedenen Browsern anders laeuft. Meiner ist Netscape 4.08 en.

            Calocybe

            1. Heisst das jetzt etwa, dass (self.y) doch in erster Linie die Existenz abfragt und nicht den Wert? Weitere Versuche ergeben: Auch wenn man y deklariert und mit 0 initialisiert, kommt die 'Nein'-Meldung. Erst bei y=1 gibt es 'Ja'. Fragt man nur (y) ab, bekommt man die Fehlermeldung ("y is not defined."), wie Du schon gesagt hast. Auch hier natuerlich erst die 'Ja'-Meldung, wenn y=1 (oder besser: y!=0).

              Interessant, wie ich finde. Vielleicht kann ja mal jemand irgendeine Spec raussuchen, wo das beschrieben ist? Ich koennte mir auch vorstellen, dass das bei verschiedenen Browsern anders laeuft. Meiner ist Netscape 4.08 en.

              Calocybe

              Hallo Calocybe

              ich habe noch etwas experimentiert und hier und da nachgelesen und mir folgendes zusammengereimt.

              Mit window oder self spricht man ja das Objekt Window an und die Frage nach self.y ist also eine Frage nach der Eigenschaft (?) y des Objektes. Gibt es diese Eigenschaft, dann wird mit ja sonst mit nein geantwortet. Im Grunde machen wir ja mit if (document.all) genau das gleiche.

              Die Null ließ mir auch keine Ruhe. Das Ergebnis ist im IE 4/5 und Navi 4.06/4.5 wie bei dir.
              Ich fand aber eine Notiz im Mintert, allerdings im Zusammenhang parseInt() und parseFloat() das diese Funktionen im Navigator 2 im Fehlerfall 0 als Wert lieferten, der nicht als Zahl interpretiert wird und zwar nur unter dem Betriebssystem Windows.

              Vielleicht liegt hier der Fall vor, das Null einfach nicht als Zahl angesehen wird, sondern als Kennzeichen für ein nichtexistierendes Element? Ausgeben läßt sich die Null ja, auch wenn stur der Nein-Fall gewählt wird. Vielleicht weil hier direkt der Wert gelesen wird? if (y==0) erzeugt übrigens den ja-Zweig.

              Ich vermute mal if (y) fragt nur nach der Existenz also sucht einen Zeiger auf y und if (y==0) sucht den Zeiger und liest den Wert von y.

              Wäre interessant zu erfahren, wie es bei anderen Betriebssystemen aussieht mit der 0.

              Viele Grüße

              Antje

          2. Für Urs, noch ein kleines Beispiel, wie es funktioniert:

            <html><head><title>Test</title>
            <script language="JavaScript">
            <!--

            ....................

            //-->
            </script>
            </body>
            </html>

            Viele Grüße

            Antje

            Hallo Antje
            Vielen Dank für Deine Ausführungen. Ich werde mich wohl noch etwas länger mit der Materie auseinandersetzen müssen, um dies alles zu kapieren... ;-)
            Danke auch an Calocybe und Mirko

            Gruss Urs