Christine Kuehnel: OO sieht "komisch" aus (war:JavaScript Probs )

Hallo alle,

Torsten schrieb im Thread "JavaScript Probs":
       "Die Frage ist eben ob das parent.parent geht ?!"

Das bringt mich auf den Gedanken, mal ein bisschen was zu OO und zur Notation hier zu schreiben.
parent.parent sieht irgendwie verwirrend aus, nicht wahr?
Es ist aber ganz logisch.
Zur Erinnerung: es ging um Frames.
Von einem Frame aus spreche ich mit "parent" das uebergeordnete Frameset an. Hier ist das Wort "parent" auch recht treffend, wenn man sich das mal veranschaulichen will - gar nicht schlecht, an "Eltern" oder "Erzeuger" in dem Zusammenhang zu denken.

---8><--------------><8---
Einschub (ueberlesen, wer eine Idee von OO hat):
Hinter dem Punkt (z.B. self.parent) notiert man die Eigenschaft des Ausgangsobjektes, greift auf diese zu.
Hier heisst das, auf die Eigenschaft "parent" - sprich "Erzeuger" von "self".
Man hat also mit "self.parent" den "Erzeuger" im Zugriff.
---8><--------------><8---

self.parent ist ein window-Objekt, naemlich das uebergeordnete Frameset.
Wenn sich das nun aber auch wieder in einem Frameset befindet? Dann hat es das natuerlich einen "Erzeuger"
  self.parent.parent
Was, wenn das immer noch nicht die oberste Ebene repraesentiert, sondern immer noch in einem Frameset steckt?
  self.parent.parent.parent
Was, wenn ...? Ja, dann gibt es auch noch das hier:
  self.parent.parent.parent.parent
Was, wenn...?

Auch wenn es eigenarig aussieht, es ist korrekt und sogar logisch :-)

Noch ein kleines Beispiel?
Ich probier's mal mit einem aus dem RL (nicht hauen bitte, sowas ist immer ein bisschen krampfig und ein bisschen erhellend):
Ihr kennt vielleicht diese russischen Puppen, bei denen immer eine in der anderen steckt - Matrjoschkas.

  • Eine Puppe (Objekt), die wieder Puppe(n) enthaelt, soll "matrjoschka" heissen.
  • Eine Puppe (Objekt), die keine weitere enthaelt (leer ist) soll "hohl" heissen.
  • Wie kommt man von aussen an die innerste, wenn die die siebente insgesamt ist?
      matrjoschka.matrjoschka.matrjoschka.matrjoschka.matrjoschka.matrjoschka.hohl

Und jetzt hoere ich auf mit meinem sonntaeglichen "Vortrag" :-)

Christine

  1. Leider hatte ich die Diskussion unten nicht verfolgt, aber fuer mich ist das alles auch logisch, und ich haette es ohne weiteres auch eingesetzt. Allerdings weiss ich nicht, inwieweit Browser da mitspielen. Der MSIE hat ja so seine Probleme mit dem DOM (siehe DHTML)

  2. Hi !

    OO ist mir so weit auch recht vertraut (durfte mich lange genug mit c++ beschaeftigen
    ...Java kommt noch)

    Die Frage ist halt was N4 aufm Mac dazu sagt. Ich hatte auf nem Mac schon die tollsten
    Ergebnisse.

    So ging zum Beispiel bei einem Grafikwechsler fuer ne button leiste das script bei einem bild nicht.
    (bei allen anderen ging es einwandfrei) Auf PC und Unix ging es immer.
    ( Pfade usw. waren auch alle richtig)

    Die Loesung mit dem Top und Target die ich weiter unten hatte ging auch einwandfrei mit IE4
    aufm Mac . Nur mit N4  aufm Mac ging es nicht (habe gerade mal das gleiche aufm
    PC gestartet... geht).

    Es ist irgendwie alles raetselhafter als es sein sollte....

    Torsten

    1. Hallo,

      OO ist mir so weit auch recht vertraut (durfte mich lange genug mit c++ beschaeftigen
      ...Java kommt noch)

      Hoppla, ich wollte keinem zu nahe treten.
      Natuerlich weiss ich, dass 'ne Menge Leute schon mal was von Objekten gehoert haben.
      Andererseits merke ich immer wieder, dass diejenigen, die sich ueber JavaScript an Programmierung rantasten, u.a. genau damit so ihre Probleme haben. Und das tun viele. Sie kommen von HTML, da ist der Einstieg oft nicht so einfach. Dinge, die andere ganz selbstverstaendlich von ihnen bekannten Sprachen uebertragen, sind Neuland.
      Ist ganz normal. Irgendwann war es das fuer uns auch mal, ob nun bei JavaScript oder C++.
      Einmal begriffen, sind Objekte kein Thema mehr. Dann wird ploetzlich vieles ganz einfach und durchsichtig.

      Die Frage ist halt was N4 aufm Mac dazu sagt. Ich hatte auf nem Mac schon die tollsten
      Ergebnisse.

      Komisch. Bisher hoere ich immer nur vom MAC-MSIE, dass der ein Kapitel fuer sich ist.
      Navi ist mir neu, oder sagen wir, bis auf ein paar Kleinigkeiten neu.

      So ging zum Beispiel bei einem Grafikwechsler fuer ne button leiste das script bei einem bild nicht.

      ImageMap?
      Wie war das? onmouseout ist kritisch, oder?

      Christine

      1. Wie war das? onmouseout ist kritisch, oder?

        Die sache mit defaultstatus ging schon mal nicht.(in beiden)
        Bei der Sache mit dem Button ging gar nix. Weder onmouseover noch onclick.
        Sehr verdaechtig... das Script geht sonst ueberall in der config... nur der Mac will nicht.
        (und das nur bei einem von 6 buttons... sehr komisch)

        Torsten

      2. Komisch. Bisher hoere ich immer nur vom MAC-MSIE, dass der ein Kapitel fuer sich ist.
        Navi ist mir neu, oder sagen wir, bis auf ein paar Kleinigkeiten neu.

        Haaa ! Nu gibts Saures  ;-)

        Ich habe es heute aufm Mac probiert. Es ging nix.
        Ich habe heute mal den orginal Quelltext hier:

        Datei 1:

        <Frameset ROWS="*,30">
        <Frame SRC="datei2.htm" name="main">
        <Frame SRC="navleiste_unten.htm">
        </Frameset>

        Datei 2:

        <Frameset COLS="130,*">
        <Frame SRC="button.htm" NAME="buttons">
        <Frame SRC="start.htm" NAME="inhalt">
        </Frameset>

        navleiste_unten.htm

        <A HREF="xxx.htm" onclick="parent.main.buttons.location.href='yyy.htm';return true;" target="inhalt">Link</A>

        Der Rechtsweg ist wie immer ausgeschlossen ;-)

        Die ganze Sache geht solange wie ich in der letzten Zeile das target="inhalt" nicht habe.
        Dann kommt nur noch die xxx.htm.
        Ohne das Target geht beides.... allerdings die xxx halt im falschen frame.
        Das ganze ist nur mit N4 so (IE4 geht).
        Das prob tritt auch auf wenn ichs in eine funktion packe und sie ausfuehre.

        ...und was ich immer mache, aber den sinn wirklich nicht verstanden habe ist das
        return true. (wird der (href) link sonst bei return false nicht ausgefuehrt ?)

        Ein dickes Danke an Christine fuer die Geduld.

        Torsten

        1. Hallo,

          Komisch. Bisher hoere ich immer nur vom MAC-MSIE, dass der ein Kapitel fuer sich ist.
          Navi ist mir neu, oder sagen wir, bis auf ein paar Kleinigkeiten neu.
          Haaa ! Nu gibts Saures  ;-)

          Noe, nur die Qunitessenz aus dem, was ich bisher von Macianern gehoert habe.
          Auf die bin ich hin und wieder angewiesen von wegen Test.

          Ich habe heute mal den orginal Quelltext hier:
          <Frameset ROWS="*,30">
          <Frame SRC="datei2.htm" name="main">
          <Frame SRC="navleiste_unten.htm">
          </Frameset>
          <Frameset COLS="130,*">
          <Frame SRC="button.htm" NAME="buttons">
          <Frame SRC="start.htm" NAME="inhalt">
          </Frameset>

          »»

          <A HREF="xxx.htm" onclick="parent.main.buttons.location.href='yyy.htm';return true;" target="inhalt">Link</A>

          Und jetzt kommen wir mal auf den Ururursprung der Frage zurueck.
          Sehe ich das richtig, dass die beiden zu aendernden Frames direkt nebeneinander liegen?
          Dann lassen wir doch das ganze JavaScript weg, ersetzen einfach mit dem Link das komplette obere Frameset. :-)
          <A HREF="zzz.htm" target="main">Link</A>
          mit zzz.htm:
          <Frameset COLS="130,*">
          <Frame SRC="yyy.htm" NAME="buttons">
          <Frame SRC="xxx.htm" NAME="inhalt">
          </Frameset>

          Die JavaScript-Loesungen machen IMHO nur dann wirklich Sinn, wenn zwei Frames geaendert werden sollen, die sich nicht in einem Frameset zusammenfassen lassen.

          Was wir bei der Entscheidung leider nie erfahren werden, welche Browser nun welchen (Un)Sinn machen.
          Oder hat jemand Lust, mal ein Beispiel zum Testen ins Netz zu stellen?

          ...und was ich immer mache, aber den sinn wirklich nicht verstanden habe ist das
          return true. (wird der (href) link sonst bei return false nicht ausgefuehrt ?)

          Genau so ist es. Allerdings gibt es diese Funktionalitaet erst ab JavaScript1.1
          Sowas kann man sich zunutze machen, z.B. wenn man unterschiedliche Versionen einer Seite ansteuern will:
          function weiter()
          {
             if (document.images)  
               // ist einfache Moeglichkeit, JS1.0-Browser rauszuhalten,
               // ginge auch ueber doppelte Funktion,
               // 1x unter <SCRIPT LANGUAGE="JavaScript"> und
               // 1x unter <SCRIPT LANGUAGE="JavaScript1.1">
                  self.location.href="die_Komfortable.htm";
          }
          <A HREF="die_Einfache.html" onclick="weiter();return false;">
          Damit landen alle, die JavaScript aktiviert haben und deren Browser mindestens 1.1 beherrscht, auf der komfortablen Seite.
          Die anderen muessen mit der Einfachfassung zufireden sein.
          Es gibt noch ein paar andere Situationen, in denen genau diese Unterscheidung ganz hilfreich ist.

          Ein dickes Danke an Christine fuer die Geduld.

          : - ) ) )

          Christine

          1. Und jetzt kommen wir mal auf den Ururursprung der Frage zurueck.
            Sehe ich das richtig, dass die beiden zu aendernden Frames direkt nebeneinander liegen?
            Dann lassen wir doch das ganze JavaScript weg, ersetzen einfach mit dem Link das komplette obere Frameset. :-)
            <A HREF="zzz.htm" target="main">Link</A>
            mit zzz.htm:
            <Frameset COLS="130,*">
            <Frame SRC="yyy.htm" NAME="buttons">
            <Frame SRC="xxx.htm" NAME="inhalt">
            </Frameset>
            Die JavaScript-Loesungen machen IMHO nur dann wirklich Sinn, wenn zwei Frames geaendert werden sollen, die sich nicht in einem Frameset zusammenfassen lassen.

            So habe ich das bisher auch... da es  aber 1. nicht gerade schnell bzw. sonderlich elegant ist
            und ich es 2. auch noch fuer wo anders braeuchte ist es eben leider so nicht moeglich.
            :-(

            Was wir bei der Entscheidung leider nie erfahren werden, welche Browser nun welchen (Un)Sinn machen.
            Oder hat jemand Lust, mal ein Beispiel zum Testen ins Netz zu stellen?

            Das mit den Browsern is eh so nen Wahnsinn. Warum koennen Netscape bzw. Microsoft
            nicht mal zu ihren eigenen Browsern Kompatibel sein ??

            function weiter()
            {
               if (document.images)  
                 // ist einfache Moeglichkeit, JS1.0-Browser rauszuhalten,
                 // ginge auch ueber doppelte Funktion,
                 // 1x unter <SCRIPT LANGUAGE="JavaScript"> und
                 // 1x unter <SCRIPT LANGUAGE="JavaScript1.1">
                    self.location.href="die_Komfortable.htm";
            }
            <A HREF="die_Einfache.html" onclick="weiter();return false;">

            Nu isses passiert !  Das return false verstehe ich nun nicht....
            Sollte das ganze nicht schon ohne das retur false funzen ??
            Onclick wir dann eben ausgefuehrt... die Funktion macht dann doch auch nix wenn document.images== false. So wird doch auch nur der HREF ausgefuehrt oder ?

            Torsten

            1. Hallo Torsten und die, die diesen Thread evtl. noch verfolgen,

              Das mit den Browsern is eh so nen Wahnsinn. Warum koennen Netscape bzw. Microsoft
              nicht mal zu ihren eigenen Browsern Kompatibel sein ??

              Fragst Du das mich oder wen? :-)

              function weiter()
              {
                 if (document.images)  
                   // ist einfache Moeglichkeit, JS1.0-Browser rauszuhalten,
                   // ginge auch ueber doppelte Funktion,
                   // 1x unter <SCRIPT LANGUAGE="JavaScript"> und
                   // 1x unter <SCRIPT LANGUAGE="JavaScript1.1">
                      self.location.href="die_Komfortable.htm";
              }
              <A HREF="die_Einfache.html" onclick="weiter();return false;">

              Nu isses passiert !  Das return false verstehe ich nun nicht....
              Sollte das ganze nicht schon ohne das retur false funzen ??
              Onclick wir dann eben ausgefuehrt... die Funktion macht dann doch auch nix wenn document.images== false. So wird doch auch nur der HREF ausgefuehrt oder ?

              Jetzt komme ich nicht ganz mit.
              Mit "return false" wird der Link eben nicht ausgefuehrt.
              Genau das wollte ich. Neuere Browser benutzen onclick, gehen auf die_Komfortable.htm.
              Bei denen darf der Link nicht ausgefuehrt werden, weil onclick... den macht.
              Damit die alten (betrifft Navi2 uund MSIE3) aber nicht auf den Gedanken kommen, auf onclick wirklich zu reagieren, schliesse ich die aus mit "if(document.images)". Das beantworten die mit "false". Ginge auch evtl. nicht gut, die da einzuschliessen, weil sie "return false" nicht werten, damit den echten Link ausfuehren wuerden. Das waeren dann naemlich zwei Links, wuerde ich nicht machen in der Praxis. Dazu braucht man 100%ige Sicherheit, dass onclick zuerst kommt, der echte Link damit gar nicht mehr zum Zuge kommt. Lass ich lieber.
              Die Methode ist fuer den Fall gedacht, dass in den einen Topf die ohne JS und die beiden "Alten" sollen, in den anderen alle anderen.
              Will man anders trennen, muss man sich natuerlich wieder was anderes einfallen lassen.
              War auch nur ein Beispiel.

              Christine

              1. » Jetzt komme ich nicht ganz mit.

                Mit "return false" wird der Link eben nicht ausgefuehrt.
                Genau das wollte ich. Neuere Browser benutzen onclick, gehen auf die_Komfortable.htm.
                Bei denen darf der Link nicht ausgefuehrt werden, weil onclick... den macht.
                Damit die alten (betrifft Navi2 uund MSIE3) aber nicht auf den Gedanken kommen, auf onclick wirklich zu reagieren, schliesse ich die aus mit "if(document.images)". Das beantworten die mit "false". Ginge auch evtl. nicht gut, die da einzuschliessen, weil sie "return false" nicht werten, damit den echten Link ausfuehren wuerden. Das waeren dann naemlich zwei Links, wuerde ich nicht machen in der Praxis. Dazu braucht man 100%ige Sicherheit, dass onclick zuerst kommt, der echte Link damit gar nicht mehr zum Zuge kommt. Lass ich lieber.
                Die Methode ist fuer den Fall gedacht, dass in den einen Topf die ohne JS und die beiden "Alten" sollen, in den anderen alle anderen.
                Will man anders trennen, muss man sich natuerlich wieder was anderes einfallen lassen.
                War auch nur ein Beispiel.

                Ha !! Ich habe es verstanden... (glaube ich :-) )
                Nur 2 kurze Fragen:

                a) Koennte man das return false auch mit in die Funktion nehmen ?
                b) Wenn ich nix angebe liefern Funktionen immer true oder ? (so lange nix schief geht)

                Danke
                  Torsten

                1. a) Koennte man das return false auch mit in die Funktion nehmen ?

                  Ja, dann muss der Aufruf aber anders aussehen.
                  function gib_was()
                  {
                     ...
                     return false;
                  }
                  ...onclick="return gib_was()"

                  Christine

  3. Hallo Christine!

    im Thread "JavaScript Probs"...

    ... kann ich leider nicht mitreden...aber zu dem Thema hier:

    Sollte ich den Sinn dieses Forums falsch verstanden habe, es eher als Hotline gedacht sein:(..) dann moege man mir das bitte sagen, weil ich mich daran dann wohl nicht mehr beteiligen werde.

    Du bist hier unentbehrlich! Genauso unentbehrlich wie SELFHTML es immer war und genauso unentbehrlich, wie in kurzer Zeit dieses Forum geworden ist!

    Wenn Du etwas postest, verstehe ich persönlich meistens nur Bahnhof, es ist noch nicht das Niveau, das ich beherrsche, aber es ist für all die anderen ungemein wichtig.

    Also laß Dich nicht "entmutigen" (ich weiß, du wirst es nicht sein) nur weil einer mal ein bißchen frech war (übrigens auch zu Thorsten). Lies doch mal meine "Liebeserklärung an dieses Forum", die irgendwo im Schwanzabschneider/Alte Themen schlummert.

    Also: in wenigen Worten: das Forum braucht Dich, bleib uns erhalten!

    Bis danndann

    PAF (patrickausfrankfurt)