2011-09-19 10 views
5

Il modo "moderno" aggiornato per incorporare un oggetto Flash, secondo Adobe:Flash: ExternalInterface funziona con tag sovrastante, ma non con i tag object

 <object id="theFlash" name="theFlash" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
     width="400" height="225" align="middle"> 
      <param name="movie" value="theflashfile.swf" /> 
      <param name="allowScriptAccess" value="always" /> 
      <!--[if !IE]>--> 
      <object type="application/x-shockwave-flash" 
      data="getStreamFrame.swf" width="400" height="225"> 
      <param name="allowScriptAccess" value="always" /> 
      <!--<![endif]--> 
      <a href="http://www.adobe.com/go/getflash"> 
       <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /> 
      </a> 
      <!--[if !IE]>--> 
      </object> 
      <!--<![endif]--> 
     </object> 

Quando si tenta di chiamare una funzione AS3 nel file SWF, da Javascript:

 var flashObj = document.getElementById('theFlash'); 
    flashObj.someASFunction(); 

(e sul lato AS :)

 import flash.external.*; 
    function someASFunction() { 
     //show some text 
    } 
    ExternalInterface.addCallback("someASFunction", someASFunction); 

Questo non lo fa funzionano in Firefox e Chrome. Il flash funziona e carica. flashObj ottiene un riferimento all'oggetto, ma someASFunction non è definito e non viene chiamato.

Se sostituisco il tag oggetto con un tag embed:

<embed id="theFlash" name="theFlash" height="225" width="400" align="middle" 
    type="application/x-shockwave-flash" allowscriptaccess="always" 
    src="theflashfile.swf" /> 

Poi funziona su Firefox e Chrome (la funzione come si chiama e funzioni correttamente) - (non funziona in IE anche se).

Come mai non funziona con un tag oggetto?
Quanto "sicuro" è utilizzare il tag embed al posto del tag object? Non è obsoleto?

nota, che non è sicuramente un problema di temporizzazione - Se io chiamo la funzione AS da JS da una funzione onclick - allora i risultati sono gli stessi.

+1

non preoccuparti di incorporamento statico, usa swfobject! – grapefrukt

+0

Il tag embed è incluso nelle specifiche HTML5. http://html5doctor.com/element-index/#e –

+0

Mi sto imbattendo nello stesso problema.Quando si utilizza swfobject 2.2, Chrome ottiene il tag dell'oggetto e quindi la mia funzione AS non funziona. Se utilizzo swfobject 1.5, Chrome ottiene il tag embed e la mia funzione AS funziona. Vorrei utilizzare l'ultimo swfobject, ma ho anche bisogno della mia funzione AS per funzionare. Qualche aggiornamento qui? – Nick

risposta

1

per incorporamento statica (che mi piace di più) io uso questo codice (questo è per il mio lettore mp3 invisibile):

<object style="position:fixed" id="1pixPlayer" width="1" height="1" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"> 
    <param value="transparent" name="wmode"> 
    <param value="1pxMp3.swf" name="movie"> 
    <param value="always" name="allowScriptAccess"> 
<embed name="1pixPlayer" width="1" height="1" type="application/x-shockwave-flash" wmode="transparent" allowscriptaccess="always" src="1pxMp3.swf"></object> 
0

elemento oggetto è un controllo ActiveX, funziona solo in IE.

le browers standard di W3C utilizzano invece tag sovrastante.

comunemente, è necessario creare un lampo come questo:

var fla, box = document.createElement("div"); 

    box.innerHTML = window.ActiveXObject? 
     "<object id='ID_XXX' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'><param name='movie' value='XXX.swf'></object>": 
     "<embed src='XXX.swf'></embed>"; 

    fla = box.firstChild; 
    document.body.appendChild(fla); 
+0

Non è più vero https://developer.mozilla.org/en-US/docs/HTML/Element/object –

4

Quando si utilizza il metodo di Adobe consigliato, ho anche riuscito a bersaglio il Flashmovie in FF e Chrome. Ho finito per usare il codice seguente e ExternalInterface funziona bene in tutti i browser

<div id="flashContent"> 

     <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="619" height="99" id="myFlashMovie" align="middle"> 
      <param name="movie" value="myFlashMovie.swf" /> 
      <param name="quality" value="high" /> 
      <param name="bgcolor" value="#f2f2f2" /> 
      <param name="allowScriptAccess" value="sameDomain" /> 
      <!--[if !IE]>--> 
      <embed src="myFlashMovie.swf" quality="high" bgcolor="#f2f2f2" 
      width="619" height="99" name="myFlashMovie" align="middle" 
      play="true" loop="true" quality="high" allowScriptAccess="sameDomain" 
      type="application/x-shockwave-flash" 
      pluginspage="http://www.macromedia.com/go/getflashplayer"> 
     </embed> 
      <!--<![endif]--> 
     </object> 

per il targeting del filmato flash, io uso questo script java

 function sendDataToFlash(data) { 

      getFlashMovie("myFlashMovie").myCallbackInFlash(data); 

     } 

     function getFlashMovie(movieName) { 
      var isIE = navigator.appName.indexOf("Microsoft") != -1; 
      if(isIE) return window[movieName]; 
      else return document[movieName]; 

     } 
-1

Per me inizia a lavorare se assegno una distinta id al tag dell'oggetto nidificato ed effettuare chiamate esattamente a questo oggetto.

 <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" height="100%" id="launcher" 
       align="middle"> 
      <param name="movie" value="/flex-frontend/launcher.swf?version=1.3"/> 
      <param name="flashvars" 
        value="sessionId=${session.id}"/> 
      <param name="wmode" value="direct"/> 
      <param name="allowFullScreen" value="true"/> 
      <param name="bgcolor" value="#000000"/> 
      <!--[if !IE]>--> 
      <object type="application/x-shockwave-flash" id="launcher1" data="/flex-frontend/launcher.swf?version=1.3" 
        width="100%" height="100%"> 
       <param name="flashvars" 
         value="sessionId=${session.id}"/> 
       <param name="wmode" value="direct"/> 
       <param name="allowFullScreen" value="true"/> 
       <param name="bgcolor" value="#000000"/> 
       <!--<![endif]--> 
       <a href="http://www.adobe.com/go/getflash"> 
        Flash player version not less than 10.3 is required! 
       </a> 
       <!--[if !IE]>--> 
      </object> 
      <!--<![endif]--> 
     </object> 

Poi da javascript:

// This doesn't work 
// var flashObj = $("#launcher"); 
// But this does 
var flashObj = $("#launcher1"); 
var screenshotData = flashObj.get(0).exportScreenshot(); 

lavoro sia per Chrome e FF.