Snucky: Verwirrung Objektmodell; Anwendung von Frames

Entschuldigt bitte, aber ich habe eine ziemlich alberne Frage. Und zwar habe ich ein Script verfasst, welches eine tiefe Objektverknüpfung besitzt. Ich beschreibe den Sachverhalt.

Das Fenster soll auf einen iFrame (name="sucheWeg1") zugreifen, der eine Seite mit einem Frameset enthält (id="sucheWeg2"). Dort wiederrum muss ich in den ersten Frame (id="sucheWeg3") durchqueren, um darin eine Fkt aufzurufen.

Mein Befehlt (window.frames["sucheWeg1"].document.getElementById("sucheWeg2").getElementById("sucheWeg3").fktname(parameter);) funktioniert nicht.

Danke für jede Hilfe!

  1. Hallo Snucky,

    Mein Befehlt (window.frames["sucheWeg1"].document.getElementById("sucheWeg2").getElementById("sucheWeg3").fktname(parameter);)

    gibt bitte einen Link an, wo man sich ansehen kann, was Du wie dort versuchst zu machen!

    Gruß aus Berlin!
    eddi

    1. gibt bitte einen Link an, wo man sich ansehen kann, was Du wie dort versuchst zu machen!

      http://www.virtuatech.de/suche.php
      Das Unternehmen existiert aber noch nicht!

      1. Hallo Snucky,

        Das Unternehmen existiert aber noch nicht!

        Das ist ja nun Wurst ;) So; zu Deiner eigentlichen Frage:

        Das Fenster soll auf einen iFrame (name="sucheWeg1") zugreifen, der eine Seite mit einem Frameset enthält (id="sucheWeg2"). Dort wiederrum muss ich in den ersten Frame (id="sucheWeg3") durchqueren, um darin eine Fkt aufzurufen.

        Mein Befehlt (window.frames["sucheWeg1"].document.getElementById("sucheWeg2").getElementById("sucheWeg3").fktname(parameter);) funktioniert nicht.

        ##########################   Zur Erläuterung:   #######################################

        wondow.frames['sucheWeg1']   greift auf das "Fenster", das im <iframe> geladen wird, zu

        .document                    greift auf das geladene Dokument des <iframe> zu

        .getElementById('sucheWeg2') greift vergebens auf ein nicht angelegtes Element mit ID
                                     -sucheWeg2- zu

        .getElementById('sucheWeg3') greift vergebens auf das nicht angelegte Element mit ID
                                     -sucheWeg3- zu, was im nicht angelegten Element mit ID
                                     -sucheWeg2- sich befinden soll

        .fktname(parameter)          greift auf eine irreguläre Methode -fktname- des nicht ex-
                                     istenten Elements mit ID -sucheWeg3- zu, welches seiner-
                                     seits im nicht angelegten Element mit ID -sucheWeg2- sein
                                     soll.

        #######################################################################################

        Soweit habe ich Dein Problem verstanden; ich hoffe, Du jetzt auch. Nur war meine Frage nicht danach. Ich möchte von Dir wissen, was Du dort machen willst!

        Gruß aus Berlin!
        eddi

        1. Hoppala, ich hatte die Seiten auf dem Server wohl nicht aktualisiert... Die Ids sind schon alle richtig und die Fkt hatte ich allgemein notiert. Konkret ist ihr Name Start und als Parameter wird ein String für die Suche übergeben.

          Ich erläutere das Problem einmal ausführlicher:
          Auf der Seite soll die Suchmaschine (zurzeit noch mit Testeinträgen gefüllt(man sollte nach JavaScript suchen)) auf zwei Arten erreicht werden.
          1. über die Seite suche.php (auch über den Link "erweiterte Suche"    rechts zu finden) und
          2. über das Eingabefeld rechts in der vorgesehenen Tabelle. Dummerweise  finde ich nicht den Weg, diesen String an die Suche weiterzugeben.

          Dazu muss nämlich folgendes Frame gewimmel durchquert werden:
          a) Der iframe (sucheWeg1) auf suche.php.
          b) Das Frameset (sucheWeg2) auf /scripts/suchmaschine/suchemain.php
          c) Ein Frame (sucheWeg3) auf /scripts/suchmaschine/suchemain.php und
          d) Die darin befindliche Fkt start mit dem Suchstring als Paramter

          Kompliziert, aber mit window.frames["sucheWeg1"].document.getElementById("sucheWeg2").getElementById("sucheWeg3").start(suchstring); klappts eben nicht. Der String wird übrigens mit einem Php-Script an JavaScript auf der Seite suche.php übergeben.

          Danke für die Hilfe!

          1. Re:

            Hoppala, ich hatte die Seiten auf dem Server wohl nicht aktualisiert...

            Das passiert manchmal ;)

            Die Ids sind schon alle richtig und die Fkt hatte ich allgemein notiert.

            Da bin ich begründet anderer Meinung. Das Objekt -wondow.frame['sucheWeg1'].document- hat ist wie folgt angelgegt:

            <!--<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">-->
            <html>
            <head>
            <title>Clientseitige Suchmaschine Virtuatech.</title>
            <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
            </head>
            <frameset rows="250,*" frameborder="0" border="0">
            <frame src="search.php" noresize scrolling="no">
            <frame src="results.htm#start" name="main">
            </frameset>
            </html>

            Bitte wo siehst Du hier IDs?

            [...] Dummerweise  finde ich nicht den Weg, diesen String an die Suche weiterzugeben.

            Ich glaube da sind wir auf dem richtigem Wege. Ich bitte Dich nochmals zu erklären, was Du hier eigentlich gedenkst zu tun. Der gesamte Aufbau von Frames und Unterframe wird doch sicher einen Grund haben. Den - genau den - würde ich gerne von Dir hören, damit man Dir möglichst bessere Wege aufzeigen kann. Ich meine, Du wirst Dir ja irgendetwas dabei gedacht haben, viele verschachtelte Frames einzusetzen, nur warum; das ist mir derzeit noch nicht ersichtlich.

            Gruß aus Berlin!
            eddi

            1. Da bin ich begründet anderer Meinung. Das Objekt -wondow.frame['sucheWeg1'].document- hat ist wie folgt angelgegt:

              Es sollte so aussehen:
              <frameset id="sucheWeg2" rows="250,*" frameborder="0" border="0">
                <frame id="sucheWeg3" src="search.php" noresize scrolling="no">
                <frame src="results.htm#start" name="main">
              </frameset>
              War gestern Nacht zu müde, um daran zu denken, die Datei auch abzulegen. Wie ich sagte: Die Ids stimmen schon alle; ich würde nur gerne wissen, wie ich durchkomme.

              Ich versuche nochmal zu erklären, weshalb ich diesen komplizierten Weg vornehmen will:
              Die Suchmaschine ist ein eigenes Programm mit einem Frameset (hier sucheWeg2), das im oberen, kleineren Fenster stets die Eingabe von Suchbegriffen zulässt. Unterhalb sollen diese sofort angezeigt werden. Da das Script clientseitig ist, ist es wichtig, dass der oebere Suchframe ebenfalls bestehen bleibt, weil sonst ja wieder Ladezeiten auftreten würden.

              Aber ich möchte mich einmal entschuldigen, dass ich immer vergesse, die Ids auf dem Server zu benennen.

              Danke!
              Christopher

              1. Hallo Christopher,

                Es sollte so aussehen:
                <frameset id="sucheWeg2" rows="250,*" frameborder="0" border="0">
                  <frame id="sucheWeg3" src="search.php" noresize scrolling="no">
                  <frame src="results.htm#start" name="main">
                </frameset>

                Frames haben ureigens dafür das Attribut NAME. Dann ließe sich folgendes anwenden: http://aktuell.de.selfhtml.org/tippstricks/javascript/fensterzugriff/ So würde ich es auch machen, statt über IDs abzufragen.

                Die derweil eingesetzte Funktion start() ist keine Methode des Elements mit ID -sucheWeg3-! Das hatte ich schonmal erklärt, dort allerdings mit der Funktion fktname(); nur scheint es noch nicht durchgedrungen zu sein. Weiterhin ist ebenso nicht wirklich ersichtlich, warum Du nicht direkt auf -sucheWeg3- zugreifst:
                window.frames["sucheWeg1"].document.getElementById("sucheWeg3")

                Ich versuche nochmal zu erklären, weshalb ich diesen komplizierten Weg vornehmen will:
                Die Suchmaschine ist ein eigenes Programm mit einem Frameset (hier sucheWeg2), das im oberen, kleineren Fenster stets die Eingabe von Suchbegriffen zulässt. Unterhalb sollen diese sofort angezeigt werden. Da das Script clientseitig ist, ist es wichtig, dass der oebere Suchframe ebenfalls bestehen bleibt, weil sonst ja wieder Ladezeiten auftreten würden.

                Ja - bei einem 13 kB großem JavaScript, was nicht annähernd die Funktionalität eines Serverscripts bietet, ist mir das verständlich, daß man dort nicht noch mal laden will, jedoch ist mir nicht verständlichen, warum Du alle mit deaktiviertem JavaScript ausschließt und warum Du Frames einsetzt.

                Gruß aus Berlin!
                eddi

                1. Es klappt jetzt mit:
                  window.frames["sucheWeg1"].self.sucheWeg2.start(suchbegriff);

                  Für die clientseitige Version habe ich mich entschieden, weil ich davon begeistert war, nach einmaligem Laden endlich suchen zu können. Natürlich ist das bei wachsender Datenbank Quatsch, aber wer spricht davon, dass ich eine serverseitige verneine?

                  Ich finde diese Lösung auf jeden Fall klasse.
                  Vielen Dank für jede Hilfe!

                  1. Hallo Snucky,

                    Für die clientseitige Version habe ich mich entschieden, weil ich davon begeistert war, nach einmaligem Laden endlich suchen zu können. Natürlich ist das bei wachsender Datenbank Quatsch, aber wer spricht davon, dass ich eine serverseitige verneine?

                    Keiner. Es ging mir auch um den Unsinn der Frames, der begründungslos verblieb, als nur um das ausladende JavaScript. Ich sehe nach wie vor keinen Grund hier ein Frameset einsetzen zu müssen; weil wenn JavaScript, dann bitte aber auch bestmöglich ;)

                    1.) Jedes Frame heißt wieder einen Request und unweigerlich einen Response.
                    2.) Ablage der Funktionen in eine separate Datei, um Auslieferung zu vermeiden im noscript-Falle

                    Mache alles auf ein Dokument und verwende statt document.write() mal lieder DOM-gerechte Funktionen: node und Methoden

                    Gruß aus Berlin!
                    eddi

  2. Das Fenster soll auf einen iFrame (name="sucheWeg1") zugreifen, der eine Seite mit einem Frameset enthält (id="sucheWeg2"). Dort wiederrum muss ich in den ersten Frame (id="sucheWeg3") durchqueren, um darin eine Fkt aufzurufen.

    Wenn ich dich richtig verstehe:
    Das Fenster: window
    das iFrame: window.document.sucheWeg1
    das Frame mit der Funktion: window.document.sucheWeg1.sucheWeg3
    Die Funktion: window.document.sucheWeg1.sucheWeg3.fkt();

    Mein Befehlt (window.frames["sucheWeg1"].document.getElementById("sucheWeg2").getElementById("sucheWeg3").fktname(parameter);) funktioniert nicht.

    Natürlich nicht.
    Das getElementById kann nicht funktionieren. getElement... ist eine Funktion eines Dokumentes und nicht eines Fensters.

    Struppi.

    1. Hallo Struppi,

      Das getElementById kann nicht funktionieren. getElement... ist eine Funktion eines Dokumentes und nicht eines Fensters.

      Doch, doch - an sich funktioniert das Konstrukt getElementById(ID).getElementById(ID) schon

      Gruß aus Berlin!
      eddi

      1. Das getElementById kann nicht funktionieren. getElement... ist eine Funktion eines Dokumentes und nicht eines Fensters.

        Doch, doch - an sich funktioniert das Konstrukt getElementById(ID).getElementById(ID) schon

        Klar, wenn das Objekt diese Funktion kennt. Aber nicht wenn das Element ein Frame (=window) ist.

        Struppi.

        1. Hallo Struppi,

          Doch, doch - an sich funktioniert das Konstrukt getElementById(ID).getElementById(ID) schon

          Klar, wenn das Objekt diese Funktion kennt. Aber nicht wenn das Element ein Frame (=window) ist.

          genau da liegt ja der Hase im Pfeffer. Snucky Alias Christopher greift auf Elemente zu, will aber auf Fenster zugreifen, über die man ganz legitim auf deren definierten Funktionen zugegriffen werden kann. Dazu nutzt man kein document sondern geht über die Namen der einzelnen Fenster und nicht über window.document.sucheWeg1.sucheWeg3.fkt()

          document kennt das Unterobjekt .frames nicht, window schon. Daher mangelt es im Ansatz. Und überhaupt <Dialekt>na sach mal</Dialekt> das ich Dir das sagen muß ;)

          Gruß aus Berlin!
          eddi