2011-06-01 11 views
6

Estoy tratando de llamar a una función en un script de acción usando la API ExternalInterface.addCallback, pero parece que no puedo hacer que funcione. Aquí es lo que tengo:Accediendo a una función de ActionScript a través de Javascript

ActionScript:

//MyClass.as 
package { 

    import flash.display.Sprite; 
    import flash.external.ExternalInterface; 

    public class MyClass extends Sprite 
    { 
     public function MyClass() 
     { 
      ExternalInterface.addCallback('getStringJS', getStringAS); 
     } 

     public function getStringAS():String 
     { 
      return "Hello World!"; 
     } 
    } 
} 

NOTA: Estoy compilando esto en un SWF utilizando el compilador Flex mxmlc si lo que importa.

HTML/Javascript:

<!doctype html> 
<html> 
    <head> 
     <title>User Identification</title> 
    <head> 
    <body> 
     <object id="MyClass" name="MyClass" type="application/x-shockwave-flash" data="MyClass.swf" width="1" height="1"> 
      <param name="movie" value="MyClass.swf"> 
      <embed src="MyClass.swf" width="1" height="1"> 
     </object> 
     <script type="text/javascript"> 
      var flash = document.getElementById("MyClass"); 
      var str = flash.getStringJS(); 
      alert(str); 
     </script> 
    </body> 
</html> 

El error que estoy recibiendo es:

Uncaught TypeError: Object #<HTMLObjectElement> has no method 'getStringJS' 

También probé la adición en un tiempo de espera en caso de que el archivo SWF no estaba cargando, pero tampoco tuvo éxito con ese método.

¿Alguna idea?

Saludos,
Mike

Respuesta

5

Me di cuenta. La forma clave de señalizar el javascipt es a través del ExternalInterface.call para que sepamos con certeza que el swf está cargado. La forma más "universal" de hacer esto es como sigue:

MyClass.as

//MyClass.as 
package { 

    import flash.display.Sprite; 
    import flash.external.ExternalInterface; 

    public class MyClass extends Sprite 
    { 
     public function MyClass() 
     { 
      ExternalInterface.addCallback('getStringJS', getStringAS); 
      if (ExternalInterface.available) { 
       ExternalInterface.call("isConnectedFlex"); 
      } 
     } 

     public function getStringAS():String 
     { 
      return "Hello World!"; 
     } 
    } 
} 

index.html

<!doctype html> 
<html> 
    <head> 
     <title>User Identification</title> 
    <head> 
    <body> 
     <object id="MyClass" name="MyClass" type="application/x-shockwave-flash" data="MyClass.swf" width="1" height="1"> 
      <param name="movie" value="MyClass.swf"> 
      <embed src="MyClass.swf" width="1" height="1"> 
     </object> 
     <script type="text/javascript"> 

      var flash = document.getElementById("MyClass"); 

      function isConnectedFlex() { 
       var str = flash.getStringJS(); 
       alert(str); 
      } 


     </script> 
    </body> 
</html> 
+0

Buen ejemplo. Aún funciona en 2017. Para otros, también se puede encontrar otra información adicional aquí: http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7cb1.html – Aleks

2

Creo que el problema es una cuestión de que el flash no está cargado. Probé el código utilizando el evento window.onload y funcionó para mí:

El flash es lo mismo ...

HTML/JS:

<!doctype html> 
<html> 
    <head> 
     <title>User Identification</title> 
    <head> 
    <body> 

     <object id="MyClass" name="MyClass" type="application/x-shockwave-flash" data="MyClass.swf" width="1" height="1"> 
      <param name="movie" value="MyClass.swf"> 
      <embed src="MyClass.swf" width="1" height="1"> 
     </object> 

     <script> 

      window.onload = function() { 

       var flash = document.getElementById("MyClass"); 
       var test = flash.getStringJS("test"); 
       alert(test); //pops up with "Hello World!" on Firefox 

      }; 

     </script> 
    </body> 
</html> 

ayuda eso?

+0

Sí, me hizo dar cuenta que realmente necesita para aprender a revisar mi trabajar en otros navegadores jaja. Funciona en Firefox e IE, pero no en Chrome. De cualquier manera, todavía necesito un método más universalmente aceptable. ¿Alguna idea? – Swift

+0

Ya veo. Es posible que desee consultar este enlace: [problem-accessing-externalinterface-exposed-method-in-google-chrome] (http://stackoverflow.com/questions/1436722/problem-accessing-externalinterface-exposed-method-in -google-chrome) – Ian

Cuestiones relacionadas