Cristalab

                 ¿Quieres registrarte?

Cómo comunicar Flash y JavaScript en ActionScript 3

Por: eldervaz
25 de Diciembre del 2007
5122 de clabLevel
Otros artículos de eldervaz
17,628 visitas

En ciertas ocasiones, necesitamos comunicar Flash con JavaScript, para eso estábamos acostumbrado a usar fscommand(), y más recientemente la clase ExternalInterface, que está disponible desde Flash 8, y también en ActionScript 3, con algunos cambios.

La clase ExternalInterface sustituye por completo a fscommand() y es de uso recomendado desde la nueva versión de ActionScript y está disponible en:


En todo caso para saber si tenemos o no la posibilidad de usar esta clase, siempre podremos recurrir a:

Código :

trace(ExternalInterface.available);
Si retorna true, es porque andamos en el camino correcto.

Sobre las mejoras con respecto a fscommand(), cito a la ayuda de ActionScript:

Bien, ahora al código, lo primero que haremos es importar la clase necesaria para poder trabajar con ExternalInterface (trabajaremos todo el código en el FLA). Además crearemos un campo de texto dinámico llamado "campo".

Código :

import flash.external.ExternalInterface;

Ahora para poder llamar una función de JavaScript, utilizamos el método call, que recibe el nombre de dicha función:

Código :

campo.text = String(ExternalInterface.call( "saludar" ) );

Le hacemos un casting a String para poder ponerlo en el campo de texto dinámico.

En el HTML tendríamos:

Código :

function saludar(){
   return ("Hola gente");
}

Pueden ver el ejemplo aquí

Si queremos pasar un parametro (o más) desde Flash, agregamos al código Actionscript:

Código :

campo.text = String(ExternalInterface.call("saludar1","zguillez"));

Y en el html:

Código :

function saludar1(nombre){
   return ("Hola "+nombre);
}

Pueden ver el ejemplo aquí

Bien, hasta aquí vimos como llamar a una función JavaScript desde ActionScript y poder mostrar el resultado en un campo de texto dinámico. Ahora haremos el proceso al revés , llamaremos de JavaScript a una función de ActionScript.

En este ejemplo, llamaré desde el body:
<body onload="cambiaTitle()">
A una función que mostrará un Alert y este a su vez, llamará a una función ActionScript.

Para este propósito usaremos el método addCallback que recibe dos parámetros, el primero es el nombre de la funcion de javascript en string y el segundo, el nombre de la función de ActionScript que ejecutaremos (tiene que ser función).

Código :

var nombre:String = "usagi";
function callMe():String {
   return nombre + "_" + Math.random() * 100;
}
ExternalInterface.addCallback("callJavaScript", callMe);

He creado una funcion callMe que retorna un String (lo enviará a JS) donde tomará la variable nombre y le agregará un número aleatorio (sólo para efectos del ejemplo)

Y en el HTML escribo:

Código :

function cambiaTitle(){
   alert(ejemplo3.callJavaScript());    
}

Pueden ver el ejemplo aquí

Cuando hacemos este proceso debemos tener en cuenta algunas cosas importantes:

El Object debe tener el id igual al que usamos al momento de invocar la función javascript

<object id="ejemplo3" ... >
<param name="allowScriptAccess" value="always" />


Lo mismo sucede con el embed
<embed name="ejemplo3"
allowScriptAccess="always" ...

Estos cambios deben de hacerse, sino no funcionaría. Asimismo, cambiar el parametro allowScriptAccess a always

Los id y name deben ser los mismo que utilizamos en JS para poder identificar con quien quieres interacturar:
alert(ejemplo3.callJavaScript());


Por otro lado, también podemos además devolver desde JavaScript una respuesta.

Sólo tenemos que recibir un parámetro en nuestra función de ActionScript:

Código :

var nombre:String = "Mariux: ";
function callMe(name:String):String {
   return nombre + name;
}
ExternalInterface.addCallback("callJavaScript", callMe);



Y pasar el mensaje desde JavaScript:

Código :

function cambiaTitle(){
   alert(ejemplo4.callJavaScript("Mensaje desde JAVASCRIPT"));    
}

pueden ver el ejemplo aquí

Hemos visto las formas como poder utilizar la clase ExternalInterface de una manera simple, limpia y fácil. Espero les sirva.

Saludos.


Artículos Relacionados


Etiquetas flash javascript actionscript_3

Comentarios | Enviar un comentario
Muy bueno eldervaz. (y)
Por: Carloz.Yanez
Muy bien Elder. Excelente tip! (y)
Por: The Fricky!
Ala man ¿todo bien?, me parece ó.. estás llamando a Usagi? :roll:

Muy buen tip man, podría servir para aquellos clientes especiales ^^ .
Por: (ristalab
No se porque no funciona en Opera 9.25 alguien me podría explicar porque? :S
Por: David_blog

David_blog :

No se porque no funciona en Opera 9.25 alguien me podría explicar porque? :S

Hola David, lo probé y si funciona, lo q sucede con los dos ultimos link, ya es por parte de JavaScript, pero el ExternalInterface va bien.

Quizas con la invocación en JS. :(
Por: eldervaz
los links tienen un destino sin contenido :(
Por: Lucas_blog
Exelente tip eldervaz.!, como de costumbre, ! ^^ .
Por: Zandy
Buenas,

Estoy probando en internet explorer 7 y no me funciona, ninguno de los ejemplos de la web, ni tampoco cuando he intentado hacerlo en mi servidor. Solo comentar que tenia un codigo prácticamente igual en AS2 que me funcionaba y al migrarlo me han aparecido estos problemas.
Por: dac_blog
:o Excelente, gracias
Por: JoH
hola muchas gracias por el codigo, pero no me funciona en IE7,
Por: ixs_blog
que tal, tengo este error en firefox al llamar una funcion de flash;

Código :

Error: document.getElementById("movie").callMe is not a function
Archivo de origen: http://direccion/home.php
Línea: 91



que podria ser?

Gracias
Por: Chevy
:alabado:
Por: penHolder
Nunca de los nunca (hasta el momento) olviden ponerle un id al tag object del swf para que no tengan problemas en IE ;).

<object .... id="idDelSwf">
.
.
.
</object>
Por: Rafeo
no me funciona ni en explorer, ni en firefox ni en google chrome:

Error: document.getElementById("amenities").callJavaScript is not a function
Source File: http://localhost/sample.html
Line: 13


<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="900" height="600" id="smp" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="smp.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="smp.swf" quality="high" bgcolor="#ffffff" width="900" height="600" name="smp" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>


function cambiaTitle(){

//document.title = ejemplo3.callJavaScript();
alert(document.getElementById("smp").callJavaScript());
}


primer frame de la movie:

import flash.external.ExternalInterface;
var TheMovies = "aa.swf|bb.swf";
TheMovies = TheMovies.split("|");
//trace(ExternalInterface.available);
var nombre:String = "sample";
function callMe():String {
return nombre + "_" + Math.random() * 100;
}
ExternalInterface.addCallback("callJavaScript", callMe);
//ExternalInterface.addCallback("callJavaScript", ShowBrand);
stop();
Por: fong-blog
eres el tio más maravilloso del mundo :D
Por: ooole-blog
Gracias por el tip espero que sigas y algun dia ayudarte
Por: jonathan isai aguirre cor
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.