Felix Riesterer: Scriptausführung im IE trotz fehlendem Flash-Plugin garantieren

Liebe Mitleser,

ich erzeuge im IE(8) dynamisch ein <object> Element, um darin einen Flash-Film (den JW FLV-Player) abzuspielen. Da in meinem IE aber kein Flash-Plugin verfügbar ist, bricht mir der Browser die Ausführung meines JavaScripts mit einer Fehlermeldung ("The specified module could not be found.") ab.

o = document.createElement("object");  
try { o.type = "application/x-shockwave-flash"; } // wirft "The specified module could not be found."  
catch (e) { alert(e); } // wird nie ausgeführt

Kennt jemand einen Weg, wie ich die weitere Ausführung meines Scripts garantieren kann?

Liebe Grüße,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  1. Hallo Felix,

    Nimm, anstatt selbst den Film einzubinden, lieber swfobject, das ist mittlerweile auch der Adobe empfohlene Weg.

    Viele Gruesse

    Dieter

    1. Lieber Dieter,

      Nimm, anstatt selbst den Film einzubinden, lieber swfobject

      hmm, dabei wollte ich auf diese Bibliothek verzichten, da ich sie im Grunde nicht benötige. Ich will nicht testen, welche Version des Flash-Plugin verfügbar ist, ich will ein <object> in die Seite setzen - egal ob das Plugin (oder heißt es "der" Plugin?) verfügbar ist, oder nicht. Und nur der IE (mal wieder!) macht dabei Probleme...

      Was mich besonders wundert ist die Tatsache, dass mein try/catch-Statement hier "versagt". Eigentlich hätte ich vom IE erwartet, dass er mir das catch-Statement ausführt, wenn es im try-Statement zu Fehlern kommt. Hat er aber nicht. Ist das nun mein Denkfehler, oder verhält sich der IE (mal wieder) nicht wie er sollte?

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Hi,

        Nimm, anstatt selbst den Film einzubinden, lieber swfobject

        hmm, dabei wollte ich auf diese Bibliothek verzichten, da ich sie im Grunde nicht benötige. Ich will nicht testen, welche Version des Flash-Plugin verfügbar ist, ich will ein <object> in die Seite setzen - egal ob das Plugin (oder heißt es "der" Plugin?) verfügbar ist, oder nicht.

        Und wenn du es einfach ganz brutalbanal per innerHTML reinprügelst ...?

        Was mich besonders wundert ist die Tatsache, dass mein try/catch-Statement hier "versagt". Eigentlich hätte ich vom IE erwartet, dass er mir das catch-Statement ausführt, wenn es im try-Statement zu Fehlern kommt. Hat er aber nicht. Ist das nun mein Denkfehler, oder verhält sich der IE (mal wieder) nicht wie er sollte?

        Da kann man wohl geteilter Meinung drüber sein.
        Mathias hat ja bspw. schon des öfteren die Meinung geäussert, dass try-catch kein brauchbarer Ersatz für eine solide Abfrage ist, ob der Browser etwas beherrscht, also ein Objekt oder eine Methode kennt oder nicht. Nur wird eine solche in diesem Falle wohl nicht so trivial möglich sein - swfobject und UFO sind ja auch keine Dreizeiler ...

        Wenn etwas, was man in JavaScript explizit erst mal per try "ausprobieren" möchte, nicht klappt, sollte aber natürlich catch zu Hilfe eilen, um eine Verarbeitung des Fehlers und ein Fortfahren des Scriptes zu ermöglichen. Dass das hier nicht klappt, könnte damit zusammenhängen, wie Flash im IE eingebunden ist - als ActiveX-Komponente (ich nehme doch wohl an, dass das beim 8er immer noch so ist). Und mit dem Erzeugen/Aufrufen/Initiieren eines solchen begibt man sich wohl etwas ausserhalb des Bereiches, auf den JavaScript selber Einfluss hat.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Lieber ChrisB,

          Und wenn du es einfach ganz brutalbanal per innerHTML reinprügelst ...?

          von diesem Ratschlag habe ich Gebrauch gemacht. Er hat zwar das grundlegende Problem nicht lösen können (warum wird über try/catch hinweggemeldet?), aber dafür konnte ich mir an anderer Stelle so richtig viel DOM-Gekrabbel sparen (und die TextNodes im IE damit auch).

          Offensichtlich war ich trotz umfangreicher Vorkehrungen wieder einmal Opfer des Gedächtnisses des IE geworden... *grrr*

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
          1. Hallo Ingrid,

            | Und wenn du es einfach ganz brutalbanal per innerHTML reinprügelst ...?

            von diesem Ratschlag habe ich Gebrauch gemacht.

            es ist sogar so, dass ich für die Kompatibilität unter den IEs nur mit innerHTML wirklich glücklich werden kann, da IE6 und IE7 das Erzeugen von <param>-childNodes nicht wirklich unterstützen... stattdessen werden diese in reichhaltiger Fülle automatisch beim Zuweisen der classid an das <object> erzeugt:

            function erzeuge_flash_object () {  
                var o = document.createElement("object");  
                o.classid = "CLSID:D27CDB6E-AE6D-11cf-96B8-444553540000";  
              
                if (o.outerHTML) alert(o.outerHTML); // viele bunte childNodes...  
            }
            

            Bewundern kann man das Zauberkunststück hier: weird_ie67.html (nur mit IE6 oder IE7 ansurfen!)

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        2. Und wenn du es einfach ganz brutalbanal per innerHTML reinprügelst ...?

          So machts ja auch SWFObject (dort outerHTML). Außerdem wird dort <object classid> verwendet, man kennt ja die IE-Probleme mit <object type src>.

          Ich wüsste auch nicht, wieso man von dieser bewährten und abwärtskompatiblen Praxis weg sollte. Im eine Browsererkennung kommt man dann aber nicht umhin, z.B. über window.ActiveXObject oder JSCript Conditional Compilation.

          Mathias

          1. Lieber Mathias,

            Ich wüsste auch nicht, wieso man von dieser bewährten und abwärtskompatiblen Praxis weg sollte. Im eine Browsererkennung kommt man dann aber nicht umhin, z.B. über window.ActiveXObject oder JSCript Conditional Compilation.

            Du hast natürlich wieder einmal Recht. Die Sache mit den Conditional Compilations habe ich mir inzwischen angeschaut. Damit gelingt es dann auch z.B. in IEs<8.

            Vielen Dank!

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
          2. Hi,

            Im eine Browsererkennung kommt man dann aber nicht umhin, z.B. über window.ActiveXObject

            Ist das ein gutes Beispiel? Ich könnte mir zumindest sehr gut vorstellen, daß da auch Nicht-IEs anspringen, die ein ActiveX-Plug-in installiert haben (habe es aber nicht überprüft).

            Gruß, Cybaer

            --
            Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
            (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
            1. Ich könnte mir zumindest sehr gut vorstellen, daß da auch Nicht-IEs anspringen, die ein ActiveX-Plug-in installiert haben (habe es aber nicht überprüft).

              Die einzige Möglichkeit, die ich kenne, um ActiveX-Controls in anderen Browsern laufen zu lassen, ist schon ewig alt und für aktuelle Browser gar nicht mehr verfügbar. Und wenn dieses Plugin tut, was es soll, dann sollte es auch Flash korrekt mit ActiveX darstellen können, ansonsten verstehe ich dessen Sinn nicht und es ist aus meiner Sicht schlicht kaputt.

              Mathias

              1. Hi,

                Und wenn dieses Plugin tut, was es soll, dann sollte es auch Flash korrekt mit ActiveX darstellen können, ansonsten verstehe ich dessen Sinn nicht und es ist aus meiner Sicht schlicht kaputt.

                :) Wo Du Recht hast ...

                Hatte nur den Eindruck, es würde dir um eine generelle IE-Erkennung gehen, wg. der erwähnten CC.

                Man sollte halt vielleicht beachten, daß die Nutzung von window.ActiveXObject *nicht* zwangläufig bedeutet, man habe einen IE vor sich und könne jetzt Dinge nutzen, die nur der IE können muß.

                Insofern wäre wohl ggf. "window.ActiveXObject *und* CC zusammen" sinnvoller, als "window.ActiveXObject oder CC" ...

                Gruß, Cybaer

                --
                Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
                (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
      2. Was mich besonders wundert ist die Tatsache, dass mein try/catch-Statement hier "versagt".

        Das hat sich ja mittlerweile geklärt, aber dadurch wird das try-catch hier nicht sinnvoller. Was hast du davon, dass try-catch hier korrekt funktioniert, also im IE der catch-Zweig ausgeführt wird? Was macht dein Script dann?

        Noch etwas: Du schließt offenbar, dass die Einbindung funktioniert, wenn keine Exception geworfen wurde. Davon würde ich nicht ausgehen. Es kann sein, dass ältere IEs keine Exception werfen, die Einbindung aber trotzdem nicht funktioniert. Schließlich weiß man seit 2002, dass der IE die standardkonforme Einbindung schluckt, aber nicht das daraus macht, was man beabsichtigte.

        Mathias

  2. Hi,

    ich erzeuge im IE(8) dynamisch ein <object> Element, um darin einen Flash-Film (den JW FLV-Player) abzuspielen. Da in meinem IE aber kein Flash-Plugin verfügbar ist, bricht mir der Browser die Ausführung meines JavaScripts mit einer Fehlermeldung ("The specified module could not be found.") ab.

    o = document.createElement("object");

    try { o.type = "application/x-shockwave-flash"; } // wirft "The specified module could not be found."
    catch (e) { alert(e); } // wird nie ausgeführt

      
    Ich kenne mich mit Javascript fast gar nicht aus, aber gibt es da nicht eine implementierte Möglichkeit im Browser geladene Module/Plugins abzufragen?  
      
    Und dann wäre die Frage, was willst Du machen, wenn kein Flash-Player verfügbar ist, das Object hast Du ja schon im ersten Schritt erstellt?  
      
    Gruß,  
    Jannes  
    
    
    1. Hi,

      Ich kenne mich mit Javascript fast gar nicht aus, aber gibt es da nicht eine implementierte Möglichkeit im Browser geladene Module/Plugins abzufragen?

      http://developer.apple.com/internet/webcontent/examples/detectallplugins.shtml
      http://www.oreillynet.com/pub/a/javascript/2001/07/20/plugin_detection.html
      http://developer.apple.com/internet/webcontent/detectplugins.html

      mit dem Code den die hier nehmen, kommt man evtl. so auf 5-10 Zeilen? um das zu checken. Ist zwar nicht so schön kurz wie Deine Variante, aber wenn es ohne Abbruch funktioniert.

      Gruß,
      Jannes

  3. Obwohl ich mit dem funkelnagelneuen Developertool ständig den Cache geleert hatte, scheint mir der IE doch zu gedächtnisstark gewesen zu sein.

    try { o.type = "application/x-shockwave-flash"; } // wirft "The specified module could not be found."

    catch (e) { alert(e); } // wird nie ausgeführt

      
    dieses try/catch-Statement wird nun wie erwartet ausgeführt. Ich erhalte keine Scriptunterbrechung mehr und auch keine Fehlermeldung in der Konsole.  
      
    Problem gelöst - und das diesmal ganz ohne Timeout! Wer hätte das gedacht? Morgen teste ich gegen den IE6. Mal sehen, ob ich mir wieder die Haare raufen muss...  
      
    Liebe Grüße,  
      
    Felix Riesterer.
    
    -- 
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    
    1. Sup!

      Ich hab' die Idee, wie Du es im IE hinbekommst; du bindest ein (von Dir zu entwickelndes - aber das kann ja nicht so schwer sein!) ActiveX-Plugin ein, dass die Seite im IE mit Hilfe eines eingebetteten Firefox darstellt.

      Voila!

      Gruesse,

      Bio

      1. Lieber Bio,

        ein (von Dir zu entwickelndes - aber das kann ja nicht so schwer sein!) ActiveX-Plugin ein, dass die Seite im IE mit Hilfe eines eingebetteten Firefox darstellt.

        und mit welcher Begründung mute ich den Besuchern meiner Seite zu, sich das Dingens in Ihren Dre^H^H^HBrowser zu installieren? An deren Stelle würde ich die Seite sofort für immer verlassen...

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Hallo :)

          ein (von Dir zu entwickelndes - aber das kann ja nicht so schwer sein!) ActiveX-Plugin ein, dass die Seite im IE mit Hilfe eines eingebetteten Firefox darstellt.

          und mit welcher Begründung mute ich den Besuchern meiner Seite zu, sich das Dingens in Ihren Dre^H^H^HBrowser zu installieren? An deren Stelle würde ich die Seite sofort für immer verlassen...

          Würden Sie eine Weltreise machen, ohne Ihren Liebling mitzunehmen?
          Nein? Da hätten Sie Gewissensbisse?
          Dann ist dieses Plugin das Richtige für Sie!
          Bereisen Sie die weite Welt des Internets ganz ohne Gewissensbisse
          und nehmen Sie Ihren Lieblingsbrowser einfach mit!

          mfg
          cygnus

          --
          Die Sache mit der Angel und dem  ><o(((°>  hat immer einen Haken ...
        2. Sup!

          und mit welcher Begründung mute ich den Besuchern meiner Seite zu, sich das Dingens in Ihren Dre^H^H^HBrowser zu installieren? An deren Stelle würde ich die Seite sofort für immer verlassen...

          Lieber Felix!

          Das liegt doch auf der Hand. Wer den Internet-Explorer benutzt, ist sowieso ein wenig deppert und installiert generell jedes bekloppte Plugin, dass "die Seite zur optimalen Darstellung benötigt".

          Wenn da also so eine tolle Zwischenseite kommt, die zur Installation des Firefox-ActiveX-Plugins auffordert, dann macht der normale IE-Nutzer das, und freut sich nachher, dass er jetzt dieses tolle Plugin auch hat.

          Benutzer, die wegen sowas Seiten sofort und für immer verlassen benutzen generell nicht den Internet-Explorer. Denk doch mal nach!

          Gruesse,

          Bio