Integrar Flash y Javascript

  • 25/03/2007
  • 8:29 pm
  • unijimpe

Desde Flash 8 hay una clase llamada External Interface que permite la comunicación transparente entre Flash y Javascript. External Interface permite enviar objetos con argumentos complejos en comparación con Fscommand que se utilizaba antes para este tipo de comunicación.

Para utilizar External Interface es necesario desarrollar en Flash 8, y hay que tener en cuenta que no funciona en todos los navegadores pero si en la mayoría, entre los cuales tenemos el siguiente listado.

  • Internet Explorer 5.0+
  • Netscape 8.0+
  • Mozilla 1.7.5+
  • Firefox 1.0+
  • Safari 1.3+

Comunicación de Flash a Javascript
Lo primero para lograr la comunicación es importar la clase External Interface, esto se hace de la siguiente manera.

Actionscript:
  1. import flash.external.ExternalInterface;

Luego el siguiente paso es llamar a la función call, la cual puede llamar a cualquier función definida en Javascript, para ello se le pasa como parámetro el nombre de la función Javascript a ejecutar.

Actionscript:
  1. ExternalInterface.call("functionName");

Veamos un ejemplo de uso de esta propiedad. Sea que tengamos un campo de formulario en el cual se ingresa el nombre del usuario, además de ello tenemos una función javascript el cual devuelve el texto ingresado en este campo.

HTML:
  1. <title>Flash2Javascript</title>
  2. <script language="javascript">
  3. function getNombre() {
  4.     return document.getElementById("nombre").value;
  5. }
  6. </script>
  7. </head>
  8. Nombre: <input name="nombre" type="text" id="nombre" />
  9. </body>
  10. </html>

Luego en una película flash si deseamos llamar a esta función desde un botón llamado btObtener tendríamos el siguiente código:

Actionscript:
  1. import flash.external.ExternalInterface;
  2. btObtener.onPress = function() {
  3.     txtMensaje.text = ExternalInterface.call("getNombre");
  4. }

Con lo cual obtendremos el siguiente resultado.

flash2javascript.gif

Comunicación de Javascript a Flash
El proceso inverso de comunicación se realiza con la función addCallback, el cual recibe tres parámetros los cuales son: Alias de la función, instancia donde se encuentra la función a llamar y finalmente el nombre de la función a ejecutarse.

Actionscript:
  1. ExternalInterface.addCallback("alias", instancia, funcion);

Como ejemplo en flash creamos un campo de ingreso de texto y luego con Javascript leeremos esta información. Entonces si tenemos un campo de texto llamado txtMensaje, creamos un función para obtener el texto ingresado en este campo y luego creamos una interface para poder leer desde Javascript.

Actionscript:
  1. import flash.external.ExternalInterface;
  2. function getNombre() {
  3.     return txtMensaje.text;
  4. }
  5. ExternalInterface.addCallback("getNombre", this, getNombre);

Luego en el HTML podemos llamar directamente a esta función, anteponiendo el nombre del elemento flash, es decir si incluimos esta película flash utilizando SWFObject donde asignamos como ID mymovie, función para llamar los datos desde flash sería:

HTML:
  1. <title>Flash2Javascript</title>
  2. <script type="text/javascript" src="swfobject.js"></script>
  3. <script language="javascript">
  4. function getInfo() {
  5.     alert(document.getElementById("mymovie").getNombre());
  6. }
  7. </script>
  8. </head>
  9. <div id="flashcontent"></div>
  10. <script type="text/javascript">
  11.    var so = new SWFObject("javascript2flash.swf", "mymovie", "300", "80", "8", "#009933");
  12.    so.write("flashcontent");
  13. </script>
  14. <input type="submit" name="Submit" value="Obtener Nombre" onClick="getInfo();">
  15. </body>
  16. </html>

Con lo cual obtendremos el siguiente resultado:

javascript2flash.gif

Resumiendo para llamar a una función Javascript desde flash utilizaremos el método call y si deseamos que desde Javascript se llame a alguna función de flash tendremos que definirla utilizando la función addCallback.

Finalmente les dejo los archivos con los códigos fuente desarrollados en este post.

Posts Relacionados

Total de Comentarios: 20

Publicidad
abrahan
11/05/2007
3:46 pm

hola he provaado todo y no me funciona tengo que descargar lgo mas par el flash tengo flash 8 y internet explorer 7.0 por que no ponen un archivo para descargar seria de mucha utilidad gracias….

11/05/2007
4:03 pm

Los archivos del ejemplo funcionando esta disponibles al final del post. De todas formas pongo el enlace: http://www.box.net/public/y65rlv6a91

abrahan
11/05/2007
4:36 pm

hay que configurar el explorador por que me da un error que dice que el objeto no acepta el metodo y el error esta en l linea 7

abrahan
11/05/2007
5:51 pm

Gracias ya me funciono…
Esta muy bueno, me va a ayudar mucho….

abrahan
11/05/2007
9:20 pm

tengo un problema con document.getElementById(”mymovie”).getNombre() me a un error en esa linea dice que el objeto no acepta est propiedad o metodo que sera lguna fall en el archivo swfobject de verdd no se me gustria que me ayudaran agradesco su pronta respuesta

oliver
20/07/2007
5:28 pm

Hola:

He probado el ejemplo navegando en el sitio y me funciona. Pero cuando descargo los ficheros y los pruebo desde mi computadora me dice que el objeto no acepta esta propiedad.

Agredeceria mucho si alguien me ayudara.

Gabriel
29/08/2007
1:25 pm

solo funciona bajo servidor, en local tal cual no funciona

aldo
24/09/2007
9:58 am

Bueno, pero le falta mas detallado con Cristalab por ejemplo

Marcelo
02/11/2007
2:07 am

Esta perfecta esta información, ahi esta todo lo que se necesita, en cristalab han hecho demasiado lio.

Bueno, aca una pregunta para ver si alguien sabe si se puede.

Yo tengo un cuadro de texto con texto html.
en el texto html tengun un href, que quiero que haga una accion dentro del flash.
por ej. play()
alguien sabe si esto es posible????

Lo tuve que solucionar con javascript pero lo insólito es eso, tengo que llamar una funcion javascript que llame una función en actionscript. usando href=’javascript:llamarFuncion(…. etc…

Marcelo
02/11/2007
2:19 am

bueno,
tuve suerte y lo encontré muy rapido, si se puede, aca lo pongo por si alguien lo necesita.

02/11/2007
2:36 am

Para ello existe una función llamada asfunction, que te permite llamar directamente a funciones de flash, por ejemplo para llamar a una función llamada playMovie que esta en el root:

<a href="asfunction:_root.playMovie">play</a>

13/11/2007
4:05 pm

Hola, queria saber si hay alguna forma de configurar el flash player para realizar pruebas locales con librerias externas javascript.

Jauuu
26/11/2007
8:58 am

Cuando llamo a la función javascript mediante la clase ExternalInterface, ésta me devuelve un null, cuando me tendría q devolver el contenido de la barra de direcciones. Y en el browser me sale el siguiente error javascript: el objeto no acepta esta propiedad o método.
Qué puede pasar?
He puesto los parámetros allowScriptAccess a ‘always’ en el html q llama al flash.

06/02/2008
6:04 pm

hola… necesito hacer un juego de un conejo que salta y como frutas. pero las frutas son imagenes aleatorias que deben salir y moverse solas como el juego de happy rabbit que aparece por google pero no se el codigo que debo utlilizar para que se muevan sera que pueden ayudarmen lo mas antes posible.. se les agradece saludos

06/02/2008
6:06 pm

ah pero estoy trabajando en net beans version 5.0….(java)

victor
02/05/2008
3:31 pm

Hola
Me Pueden Ayudarme
porque en mi computadora esta mal cuando quiero abrir el gunbound de la pagina me sale javascript porque si yo lo tengo instalado el java man

FER
21/06/2008
1:02 pm

Cuando llamo a la función javascript mediante la clase ExternalInterface, ésta me devuelve un null, cuando me tendría q devolver el contenido de la caja de texto. Y en el browser me sale el siguiente error javascript: el objeto no acepta esta propiedad o método.
Qué puede pasar?

Renatto
01/08/2008
8:52 am

Hola…..tengo mi animacion pero solo quiero que ingrese la hora que se actualiza cada segundo y la fecha, y no hacer niungun evento de boton…..¿se podra?

Jose
08/10/2008
11:04 pm

Hola, tengo una calculadora financiera en HTML y necesito embeberla un una pagina que esta en flash. He tratado de hacerlo utilizando la clase External Interface, pero no me funciona. Como lo puedo hacer?

08/10/2008
11:16 pm

Jose, Flash permite incluir algunos tags de HTML como esta explicado en http://blog.unijimpe.net/incluir-html-en-flash/ pero no permite embeber un html completo, solo se permite cargar archivos: swf, jpg, png, gif, mp3, flv, entre otros.

Enviar Comentario

(*)

(*)