Sascha Bahl: Zugriff aus einem Object

Ich habe per <embed> Tag eine SVG-Datei eingebunden. Über einen Slider (zusätzliches ausfahrbares Menü), der an der Seite angebracht ist und das SVG-Dokument teilweise überlappt, möchte ich mit dem SVG interagieren. Auch das SVG-Dokument soll mit dem Slider interagieren können. Für den Slider habe ich anfänglich ein iFrame benutzt, was auch wunderbar mit dem Firefox funktioniert. Beim Internet Explorer allerdings habe ich das Problem, dass der Slider in den Hintergrund verschwindet, sobald ich auf das SVG-Dokument klicke. Auch mit der Funktion Focus() war der Slider nicht in den Vordergrund zu bekommen.

Also habe ich eine Methode versucht zu finden, den Slider immer im Vordergrund behalten zu können. Das funktioniert mit der Einbindung des Slider-Codes mittels <object>-Tag ziemlich gut. Jetzt habe ich aber das Problem, dass ich nicht weiss, wie ich von dem JavaScript-Code im Slider auf Funktionen des Fensters oder Dokumentes zugreifen kann, in dem das <object>-Tag eingebettet ist. Die Struktur könnte man etwa so beschreiben:

<script language="JavaScript">
    function MyTest()
    {
        alert("Aufruf aus dem Object");
    }
</script>

<embed name="embedsvg" id="embedsvg" style="position:absolute;z-index:1;margin-left:35px;margin-top:2px;" type="image/svg+xml" src="libraries/drawarea.psvg" width="800" height="600">
</embed>

<!-- Hier ist der JavaScript-Code drin, der die obige Funktion aufrufen soll -->
<object id="slider" style="border-style:solid;border:#b9b9b9;border-width:0px;overflow:hidden;position:absolute;z-index:2;margin-left:0px;margin-top:0px;" width="270" height="600" type="text/html" data="flipmenu.php" border="0" />

Wäre toll, wenn mir da jemand helfen kann. Auch wenn es unter Umständen heisst, dass der Internet Explorer Aufrufe aus einem Object an übergeordnetete Objekte nicht erlaubt.

  1. Hallo,

    Jetzt habe ich aber das Problem, dass ich nicht weiss, wie ich von dem JavaScript-Code im Slider auf Funktionen des Fensters oder Dokumentes zugreifen kann, in dem das <object>-Tag eingebettet ist.

    Probiere es im SVG-Code mit der Referenzierung auf top. Es sollte ein Zugriff auf top.variable bzw. top.funktion() moeglich sein.

    Ansonsten duerfte eine Archivsuche helfen.

    MfG, Thomas

    1. Hallo,

      Jetzt habe ich aber das Problem, dass ich nicht weiss, wie ich von dem JavaScript-Code im Slider auf Funktionen des Fensters oder Dokumentes zugreifen kann, in dem das <object>-Tag eingebettet ist.

      Probiere es im SVG-Code mit der Referenzierung auf top. Es sollte ein Zugriff auf top.variable bzw. top.funktion() moeglich sein.

      Ansonsten duerfte eine Archivsuche helfen.

      MfG, Thomas

      Der SVG-Code ist nicht das Problem. Den habe ich mit <embed> eingebunden. Von dort aus habe ich Zugriff auf die übergeordneten Objekte. Jetzt habe ich aber eine PHP-Datei, die HTML/JavaScript ausgibt und diese durch einen <object>-Tag eingebunden. Dort funktioniert die Verfahrensweise top.frame.function(), top.function(), top.varible oder nur function() nicht über den Internet Explorer. Der Firefox hat keine Probleme damit....

      ...und natürlich habe ich erst das Archiv durchstöbert vor meinem Posting. Vorher habe ich auch schon Suchmaschinen benutzt. Hab aber nichts gefunden :-(

      1. Hallo,

        Jetzt habe ich aber eine PHP-Datei, die HTML/JavaScript ausgibt und diese durch einen <object>-Tag eingebunden. Dort funktioniert die Verfahrensweise top.frame.function(), top.function(), top.varible oder nur function() nicht über den Internet Explorer. Der Firefox hat keine Probleme damit....

        Es wird also vom PHP-Skript kein SVG-Code erzeugt, sondern HTML-Code als <object> eingebunden? Dann verwende doch besser einen <iframe>.

        Der Zugriff von SVG im <object> auf sein top-Document funktioniert auch im IE und so hatte ich das verstanden:

        Minimaler Test-Case:

        bla.htm:

          
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
        <html>  
        <head>  
        <title>Test by TM 11/05</title>  
        <script type="text/javascript">  
        var x=123;  
        </script>  
        </head>  
        <body>  
        <object data="bla.svg" type="image/svg+xml"></object>  
        </body>  
        </html>
        

        bla.svg:

          
        <?xml version="1.0"?>  
        <svg onload="alert(top.x)"><!-- gibt 123 aus -->  
        <circle cx="100" cy="100" r="20" fill="#F00"/>  
        </svg>
        

        MfG, Thomas

        1. Hallo,

          Jetzt habe ich aber eine PHP-Datei, die HTML/JavaScript ausgibt und diese durch einen <object>-Tag eingebunden. Dort funktioniert die Verfahrensweise top.frame.function(), top.function(), top.varible oder nur function() nicht über den Internet Explorer. Der Firefox hat keine Probleme damit....

          Es wird also vom PHP-Skript kein SVG-Code erzeugt, sondern HTML-Code als <object> eingebunden? Dann verwende doch besser einen <iframe>.

          Der Zugriff von SVG im <object> auf sein top-Document funktioniert auch im IE und so hatte ich das verstanden:

          Minimaler Test-Case:

          bla.htm:

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
          <head>
          <title>Test by TM 11/05</title>
          <script type="text/javascript">
          var x=123;
          </script>
          </head>
          <body>
          <object data="bla.svg" type="image/svg+xml"></object>
          </body>
          </html>

          
          >   
          >   
          > bla.svg:  
          >   
          > ~~~xml
            
          
          > <?xml version="1.0"?>  
          > <svg onload="alert(top.x)"><!-- gibt 123 aus -->  
          > <circle cx="100" cy="100" r="20" fill="#F00"/>  
          > </svg>
          
          

          MfG, Thomas

          Hallo, Thomas!

          Ja, das obige Beispiel ist schon sehr gut, ausser, dass ich in diesem Fall keine SVG-Datei einbinde, sondern eine PHP-Datei die HTML/JavaScript-Code ausgibt. Anders wie per Object-Tag kann ich über iFrames auf das ganze DOM zugreifen. Der Haken dabei: Das iFrame soll mein SVG überlappen, da es ein Menü darstellt. Wenn ich aber das SVG anklicke, liegt das iFrame darunter und ist nicht mehr in den Vordergrund zu bekommen. Das ist bei per Object- oder Embed-Tag eingebundenen Code anders. Nur das ich zur Zeit keine Ausgabe über embed eingebundenen PHP hinbekomme. Vielleicht mache ich was falsch.
          Der Firefox reagiert da ganz anders. Mit dem habe ich eigentlich keine Probleme. Mein Ziel ist es aber Browserunabhängingen Code zu schreiben...

          Gruß

          Sascha Bahl

          1. Hallo,

            Nur das ich zur Zeit keine Ausgabe über embed eingebundenen PHP hinbekomme. Vielleicht mache ich was falsch.

            Das Überlagern von Objekten ist immer so eine Sache, die man kaum browseruebergreifend in den Griff bekommt.

            Mein Rat: Aendere das Konzept. Verwende entweder div-Elemente, die mittels z-index positioniert werden (wobei auch hier das eingebundene Objekt wieder top-most liegen kann) oder lege alles im SVG-Dokument ab. Dort ist es leicht, ein Rechteck ueber einem anderen anzuordnen, etwa wie ein Tooltipp -- nur mit mehr Flaeche und Funktionalitaet.

            Der Firefox reagiert da ganz anders. Mit dem habe ich eigentlich keine Probleme. Mein Ziel ist es aber Browserunabhängingen Code zu schreiben...

            Das duerfte nur mit einem Plug-in wie dem ASV funktionieren und dann wie beschrieben: im SVG selbst. Dem neuen Firefox 1.5 kann man wiederum SVG direkt im XHTML-Dokument anbieten und somit auch Anwendungen bauen, die von HTML (z. B. Formulare) und SVG profitieren.

            MfG, Thomas