Christian: Skript, dass prüft, ob bestimmte ID existiert..(? - Probleme)

Hallo,

vorab - da mein erster Post - Hallo an alle Forennutzer!
Ich hoffe dass mir jemand in mener Angelegenheit helfen kann. Da ich absoluter JavaScript Anfänger bin, gibt es vielleicht einfach etwas, dass ich übersehen habe oder so...

Was ich erreichen möchte:
-------------------------

Eine Webseite hat ein Frameset "main" und "menu".
Der Frame "main" hat einen iframe "datamain".

Im Frame "menu" soll nun ein Link plaziert werden, der ein JS-Script aufruft, dass...
... 1. prüft, ob im frame "main" der iframe(id) "datamain" existiert.
Wenn dass der Fall ist, soll der Inhalt dieses iframes getauscht werden.
...2. wenn der "datamain"-iframe fehlt, soll eine passende hmtl geladen werden, die diesen iframe enthält und im Anschluss soll dessen Inhalt dann angepasst werden.

Was ich bisher habe:
--------------------

function checklayer(url_name)
{
 if (parent.mainFrame.document.getElementById('datamain')) {

}
  else {
    parent.mainFrame.location.href = "fr_oben.html";

}

parent.frames[0].frames[0].location.href = url_name;
}

Was es macht:
-------------

Mein jetziges Script, aufgerufen mit checklayer("test.html") zum Beispiel lädt die eingegebene URL erfolgreich in den iframe, WENN dieser bereits existiert.
Wenn der iframe nicht existiert, lädt das Skript den entsprechenden frame "fr_oben.html" (der den iframe "datamain" enthält) erfolgreich vor, lädt dann ABER NICHT die gewünschte iframe-Seite in den iframe hinein...

Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt und bedanke mich vorab für jede Hilfe!

Danke + Gruß
Christian

  1. Hallo,

    bekommst du eine Fehlermeldung? Wenn darin steht, dass ein Objekt nicht existiert, kann es auch bedeuten, dass ein Objekt _noch_ nicht existiert.

    Gruß plan_B

    1. Hallo,

      bekommst du eine Fehlermeldung?

      Warum sollte eine Fehlermeldung kommen? Nach der Beschreibung läuft doch alles richtig.

      Wenn darin steht, dass ein Objekt nicht existiert, kann es auch bedeuten, dass ein Objekt _noch_ nicht existiert.

      Ein Objekt kann entweder existeren oder nicht existieren, aber "noch nicht existieren" ist Unsinn.

      Gruß
      Gloria Mundi

      1. Hallo Gloria,

        danke für deine Antwort,
        ich versuche das nachher mal umzusetzen.
        Ich hoffe, ich versteh das mit dem String so richtig, dass ich dem Link in der Funktion "ladeiframe('iframe.html')" zum beispiel direkt den gewünscht zu ladenden iframe mitgebe...

        und onload des oberen frames prüft und führt das dann aus?

        danke,
        gruß
        Christian

      2. Hallo,

        Hallo,

        bekommst du eine Fehlermeldung?

        Warum sollte eine Fehlermeldung kommen? Nach der Beschreibung läuft doch alles richtig.

        ich habe daraus gelesen, dass er etwas anderes erwartet hat und ich kann mir nicht denken, dass es keine Fehlermeldung gibt.

        Wenn darin steht, dass ein Objekt nicht existiert, kann es auch bedeuten, dass ein Objekt _noch_ nicht existiert.
        Ein Objekt kann entweder existeren oder nicht existieren, aber "noch nicht existieren" ist Unsinn.

        bist du dir sicher?

        wenn das Objekt ein Frame ist, dann dauert es eben ein bischen, bischen bis du frames[0] bearbeiten kannst ..., es existiert eben _noch_ nicht!

        parent.mainFrame.location.href = "fr_oben.html";
         parent.mainFrame.frames[0].location.href = url_name;

        Gruß plan_B

        1. Kann ich denn zwischen zwei Ausführungen eine kurze Pause setzen?

          danke.

          1. Hallo,

            Kann ich denn zwischen zwei Ausführungen eine kurze Pause setzen?

            das war ja der andere Vorschlag von Struppi. Problem dabei ist eben, dass du nicht weisst wie kurz die Pause sein darf, deswegen:

            in regelmäßigen intervalen prüfen ob das iframe vorhanden ist und dann die Seite darin laden

            Gruß plan_B

            1. Achsoo...da hin soll die Prüfung, alles klar.

              Aber: kannst du mir noch den Befehl dazu nennen? Oder eine kurze function, mir fehlt da wirklich noch ein Teil an JS-Grundsätzen :)

              Vielen Dank!

              1. Hallo,

                Aber: kannst du mir noch den Befehl dazu nennen?

                http://de.selfhtml.org/javascript/objekte/window.htm#set_timeout@title=setTimeout

                Oder eine kurze function, mir fehlt da wirklich noch ein Teil an JS-Grundsätzen :)

                meine Funktion würde so aufgerufen

                lade_iframe('mainFrame','datamain',url_name,millisec)

                function lade_iframe(frame0,id,url_name,millisec) {
                  // überprüfen ...
                  // 1. Schritt frame0 laden
                  // 2. Schritt iframe laden
                  // wenn nicht komplett, sich selbst aufrufen
                  if( ... ) {
                  window.setTimeout("lade_iframe('"+frame0+"','"+id+"','"+url_name+"',"+millisec")",millisec);
                  }
                }

                Gruß plan_B

                1. Hallo,

                  window.setTimeout("lade_iframe('"+frame0+"','"+id+"','"+url_name+"',"+millisec")",millisec);

                  da fehlt ein "+".
                  einfacher man baut sich erst den String zusammen;

                  var s_func="lade_iframe('"+frame0+"','"+id+"','"+url_name+"',"+millisec+")";
                  alert(s_func);  // dann kann man nochmal die Gänsefüsschen prüfen
                  window.setTimeout(s_func,millisec)

                  Gruß plan_B

    2. Hallo,

      danke für eure Antworten.

      Einen Fehler bekomme ich nicht angezeigt (IE und firefox).
      Es ist nur so, dass, wenn der frame mit der "datamain" layer nocht nicht geladen ist, ich zwei mal auf den entsprechenden Link klicken muss. Beim ersten mal kommt der passende Frame, beim zweiten Klicken dann auch der iframe.

      Ist es evtl. sinnvoll, aus dem ganzen zwei Funktionen zu machen, die nacheinander aufgerufen werden?

      Die Lösung mit dem Intervall, das prüft, ob der frame richtig geladen ist, kommt, wenn ich das richtig verstehe, nicht in Betracht, da ja nur beim Klicken auf den Link dieser Frame + iframe gewechselt werden soll..(oder meintest du (1, Antwort) das anders?)

      Den iframe über "onLoad" in den oberen Frame zu setzen wäre möglich, dieser soll aber auch abhänging vom angeklickten Link sein.

      Werde noch ein bisschen rumprobieren.
      Danke weiterhin für jeden Tip.

      Ist denn die Funktion an sich in Ordnung -?

      Gruß,
      Danke,

      Christian

      1. Hallo,

        Den iframe über "onLoad" in den oberen Frame zu setzen wäre möglich, dieser soll aber auch abhänging vom angeklickten Link sein.

        Du mußt halt die zu ladende Resource im Query-string übergeben!

        Gruß
        Gloria

  2. Mein jetziges Script, aufgerufen mit checklayer("test.html") zum Beispiel lädt die eingegebene URL erfolgreich in den iframe, WENN dieser bereits existiert.
    Wenn der iframe nicht existiert, lädt das Skript den entsprechenden frame "fr_oben.html" (der den iframe "datamain" enthält) erfolgreich vor, lädt dann ABER NICHT die gewünschte iframe-Seite in den iframe hinein...

    Das sichereste den onload Event des iframes zum nachladen benutzen, aber zur Not kannst du auch in regelmäßigen intervalen prüfen ob das iframe vorhanden ist und dan die Seite darin laden.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
  3. Hallo nochmal,

    ich bin jetzt einen Schritt weiter, scheitere aber noch an einer -hoffentlichen- Winzigkeit.

    Ein setTimeout, bevor der iframe nachgeladen wird, ist eine gute Idee.
    Aussehen tut es ja dann so:

    else {

    parent.mainFrame.location.href = "fr_oben.html";
      window.setTimeout("parent.mainFrame.datamain.location.href = url_name",2000);

    }

    (die 2000 msec. nur zum Testen derzeit)

    Das Problem ist jetzt einfach, dass die variable "url_name" wohl nicht übergeben wird, jedenfalls zeigt der IE an, dass "url_name" undefiniert sei.
    Setze ich stattdessen z.b. "'test.html'" ein, dann klappt das ganze. Aber dies hier muss ja doch eine Variable sein.

    Gibt es einen einfachen Befehl zum übergeben der Variable? Oder wieso wird sie gar nicht weitergegeben?

    Vielen Dank!!

    Gruß
    Christian

    1. Ein setTimeout, bevor der iframe nachgeladen wird, ist eine gute Idee.
      Aussehen tut es ja dann so:

      else {
          parent.mainFrame.location.href = "fr_oben.html";
        window.setTimeout("parent.mainFrame.datamain.location.href = url_name",2000);

      }

      hier bietet es sich eine anoyme Funktion zu verwenden:
      window.setTimeout(
      function() { parent.mainFrame.datamain.location.href = url_name; }, 2000);

      Struppi.

      --
      Javascript ist toll (Perl auch!)
      1. Hallo,

        Ein setTimeout, bevor der iframe nachgeladen wird, ist eine gute Idee.

        aber funktioniert es wirklich immer, oder wären kurze Intervallabfragen nicht vorteilhafter?

        Aussehen tut es ja dann so:

        else {
            parent.mainFrame.location.href = "fr_oben.html";
          window.setTimeout("parent.mainFrame.datamain.location.href = url_name",2000);

        }

        hier bietet es sich eine anoyme Funktion zu verwenden:

        ...

        Struppi.

        ... habe mich mit diesem Code eng an dein Ausgangsbeispiel gehalten, und überprüfe jetzt in kurzen Intervallen, ob der iframe geladen werden kann.

        function checklayer(url_name)
        {
         with (parent.mainFrame) {
          if (document.getElementById('datamain')) {
           frames[0].location.href = url_name;
            }
           else {
           var fr_oben="fr_oben.html";
           if (location.href.indexOf(fr_oben)<0){
              location.href = fr_oben;
            }
           window.setTimeout(function(){checklayer(url_name);},50);
          }
         }
        }

        schön finde ich, dass man beim "Helfen" immer noch was dazulernen kann.

        • Danke -

        Gruß plan_B

        1. ... habe mich mit diesem Code eng an dein Ausgangsbeispiel gehalten, und überprüfe jetzt in kurzen Intervallen, ob der iframe geladen werden kann.

          function checklayer(url_name)
          {
          with (parent.mainFrame) {
            if (document.getElementById('datamain')) {
             frames[0].location.href = url_name;
              }
             else {
             var fr_oben="fr_oben.html";
             if (location.href.indexOf(fr_oben)<0){
                location.href = fr_oben;
              }
             window.setTimeout(function(){checklayer(url_name);},50);
            }
          }
          }

          50 Millisekunden finde ich zu kurz, ich sehe auch nicht wo die Abbruchfunktion ist (oder übersehe ich was?) und dann musst du auch auf das vorhandensein von .document checken.

          ich würd's eher so machen:

            
          function checklayer(url_name)  
          {  
          var frame = parent.mainFrame; // Das Frame worum es sich dreht  
          with (parent.mainFrame) // ist das frame geladen  
          {  
              if(document)  
              {  
              var iFrame = document.getElementById('datamain');  
              // Existiert das iFrame  
              if(iFrame)  
              {  
                   iFrame.location.href = url_name;  
                   return; // ... und fertig  
              }  
              // kein iFrame, checken ob die Seite mit iFrame geladen wurde  
              var fr_oben = "fr_oben.html";  
              if (location.href.indexOf(fr_oben) < 0) location.href = fr_oben;  
          }  
          // 1/4 Sekunde sollte i.O. sein  
          window.setTimeout(function(){checklayer(url_name);}, 250);  
          }  
          
          

          Struppi.

          --
          Javascript ist toll (Perl auch!)
          1. Hallo,

            50 Millisekunden finde ich zu kurz, ich sehe auch nicht wo die Abbruchfunktion ist (oder übersehe ich was?) und dann musst du auch auf das vorhandensein von .document checken.

            möglich, dass bei sehr kurzen Intervallen das .document mal nicht definert ist.

            Abbruchfunktion? leider war das Einrücken beim Kopieren versetzt und damit nicht mehr so klar ersichtlich.
            denke aber setTimeout kommt nur im "else { }" Zweig vor.

            // 1/4 Sekunde sollte i.O. sein
            window.setTimeout(function(){checklayer(url_name);}, 250);

            von mir dürfte die "Schleife" mehrfach laufen, also auch ganz kurz ...

            Gruß plan_B

    2. Finde hier leider keinen EDIT-Button, daher hänge ich es mal an:

      Problem gelöst!! Vielen Dank an alle, hat mir sehr geholfen!

      Ich habe jetzt in der setTimeout eine inner_function aufgerufen, welche wiederum die Variable übernimmt. Lösung hab ich hier im Forum gefunden, "Closure" - sehr nett :)

      Danke an euch!
      Machts gut,
      Christian

      Hallo nochmal,

      ich bin jetzt einen Schritt weiter, scheitere aber noch an einer -hoffentlichen- Winzigkeit.

      Ein setTimeout, bevor der iframe nachgeladen wird, ist eine gute Idee.
      Aussehen tut es ja dann so:

      else {
          parent.mainFrame.location.href = "fr_oben.html";
        window.setTimeout("parent.mainFrame.datamain.location.href = url_name",2000);

      }

      (die 2000 msec. nur zum Testen derzeit)

      Das Problem ist jetzt einfach, dass die variable "url_name" wohl nicht übergeben wird, jedenfalls zeigt der IE an, dass "url_name" undefiniert sei.
      Setze ich stattdessen z.b. "'test.html'" ein, dann klappt das ganze. Aber dies hier muss ja doch eine Variable sein.

      Gibt es einen einfachen Befehl zum übergeben der Variable? Oder wieso wird sie gar nicht weitergegeben?

      Vielen Dank!!

      Gruß
      Christian