Advertisement
  1. Code
  2. ActionScript

Consejo rápido: Cómo comunicarse entre Flash y JavaScript

Scroll to top
Read Time: 9 min

Spanish (Español) translation by Steven (you can also view the original English article)

En este Consejo rápido, veremos cómo usar la clase ExternalInterface. Esto nos permite escribir AS3 que puede ejecutar código JavaScript, y viceversa. ¡Eso significa que puedes usar Flash para alterar partes de la página web en la que se está ejecutando!


Paso 1: configurar el documento de Flash

Crea un nuevo documento Flash ActionScript 3. Cambia el tamaño del escenario para que sea de 600x300px. Con la herramienta rectángulo, dibuja un rectángulo que sea del tamaño del escenario. Dale un color #CCCCCC. Además, dale un trazo negro de 2px.


Paso 2: Configura la interfaz de usuario en Flash

Aquí está el diseño en el que trabajaremos:

Abre el Panel de componentes (Ventana > Componentes) y, desde la carpeta Interfaz de usuario, arrastra un componente ColorPicker al escenario. Dale un nombre de instancia de 'cp'.

Luego crea un campo de texto dinámico llamado 'resizeText'; colócalo y ajústalo como desees (no puedes ver el que está en mi imagen; está vacío y en la esquina superior derecha del escenario).

Ahora, crea otro campo de texto dinámico. Dale un nombre de instancia de 'jsText'. Luego crea un símbolo de botón y dale un nombre de instancia de 'prompt'. Después de eso, crea otro botón y asígnale un nombre de instancia de 'change'.

Finalmente, crea dos campos de texto de entrada. Coloca uno al lado de tu botón 'prompt' y asígnale el nombre 'promptText'. Toma el segundo campo de texto, muévelo al lado de tu botón 'change' y asígnale el nombre 'changeText'.

Además, agrega las etiquetas que desees; consulta mi imagen para ver cómo la configuro.


Paso 3: Configura la interfaz de usuario HTML

Para que la interfaz externa funcione, el documento debe estar en Internet. Primero, crea un nuevo archivo de texto y guárdalo como 'externalInterface.html'. A continuación, abre un editor de texto y agrega todo el código a continuación. Guarda el archivo HTML.

1
<html xmlns="https://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
2
<head>
3
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
4
<title>externalInterface</title>
5
<style type="text/css">
6
7
body {
8
	font-family:Arial;
9
}
10
11
#asSend {
12
	padding-top:20px;
13
	font-size:12px;
14
}
15
#htmlWrap {
16
	margin-top:10px;
17
	width:578px;
18
	padding-left:20px;
19
	border-width:1px;
20
	border-style:solid;
21
}
22
#sender {
23
	margin-top:10px;
24
}
25
#textChange {
26
	font-size:13px;
27
	font-weight:bold;
28
	padding-top:10px;
29
	padding-bottom:20px;
30
}
31
32
</style>
33
</head>
34
<body>
35
<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="600" height="300" id="externalInterface" align="middle">
36
  <param name="allowScriptAccess" value="sameDomain" />
37
  <param name="allowFullScreen" value="false" />
38
  <param name="movie" value="externalInterface.swf" />
39
  <param name="quality" value="high" />
40
  <param name="bgcolor" value="#ffffff" />
41
  <embed src="externalInterface.swf" quality="high" bgcolor="#ffffff" width="600" height="300" name="externalInterface" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
42
</object>
43
<div id="htmlWrap">
44
<div id="asSend">
45
  <label for="textArea">Send to actionscript:</label><br />
46
  <textarea cols="50" rows="4" id="textArea" name="textArea"></textarea>
47
  <br />
48
  <button id="sender" name="sender">Send</button>
49
</div>
50
<div id="textChange">Use Actionscript to change me!</div>
51
</div>
52
</body>
53
</html>

Las áreas clave son:

  • La sección <object> que incrusta el SWF que crearás a partir del archivo Flash.
  • El <div> y <textarea>, que tienen propiedades id para que podamos acceder a ellos desde el SWF.

Tu HTML debe aparecer como se muestra a continuación:

Cuando se haya reemplazado el código, sube el archivo a tu servidor web para que podamos comenzar a usar ActionScript.


Paso 4: Configurar una clase de tipo documento

Crea una clase de documento para tu archivo Flash; llámalo Main.as. Si no estás familiarizado con las clases de tipo documento lee este consejo rápido.

1
package
2
{
3
	import flash.display.MovieClip;
4
	public class Main extends MovieClip {
5
		public function Main() {
6
			
7
		}
8
	}
9
}

Paso 5: Invocando funciones de JavaScript desde Flash

Lo primero que haremos con ExternalInterface es llamar a una función de JavaScript que cambiará el color de fondo de nuestra página web. Por lo tanto, adjunta un detector de eventos a nuestro componente ColorPicker. Cuando el color cambia, enviará el valor hexadecimal a una función de JavaScript llamada acceptColor():

1
package
2
{
3
	import fl.events.ColorPickerEvent;
4
	import flash.display.MovieClip;
5
	import flash.external.ExternalInterface;
6
	public class Main extends MovieClip {
7
		public function Main() {
8
			cp.addEventListener(ColorPickerEvent.CHANGE, colorChange);
9
		}
10
		
11
		public function colorChange(event:ColorPickerEvent):void {
12
			ExternalInterface.call("receiveColor", event.target.hexValue);	//calls receiveColor(event.target.hexValue) in the javascript

13
		}
14
	}
15
}

Ahora tenemos que escribir esta función acceptColor(). En la cabecera de nuestro documento HTML, comenzamos el javascript definiendo esta función. Esto simplemente toma el valor que envió Flash y cambia el color de fondo.

1
<script type="text/javascript">
2
function receiveColor(value) {
3
	document.bgColor = "#" + value;
4
}
5
</script>

Pon eso justo después del <head> en tu archivo HTML. Si todo está bien, cuando ejecutes la página HTML en un navegador y cambia el color en ColorPicker, debes cambiar el color de fondo de la página web.


Paso 6: Llamando a funciones de ActionScript desde JavaScript

El siguiente ejemplo será enviar datos de JavaScript a Flash. En el documento HTML, pega el siguiente código dentro de la etiqueta <script>:

1
window.onload = function() {
2
	var sender = document.getElementById("sender");		//getElementById finds an element according to its "id" property
3
	sender.onclick = function() {
4
		var ta = document.getElementById("textArea");
5
		document['externalInterface'].receiveText(ta.value);
6
		ta.value = "";
7
	};
8
};

Esto es lo que hace: después de cargar el documento, obtenemos el botón 'sender' y le adjuntamos un detector de eventos. Cuando se hace clic en el botón "sender", se llamará a la función ReceiveText() en Flash que configuraremos ahora.

De vuelta en Flash, le decimos a ExternalInterface que registre la función ActionScript para poder llamarla desde JavaScript. Luego configuramos nuestra función ReceiveText():

1
package
2
{
3
	import fl.events.ColorPickerEvent;
4
	import flash.display.MovieClip;
5
	import flash.external.ExternalInterface;
6
	public class Main extends MovieClip {
7
		public function Main() {
8
			cp.addEventListener(ColorPickerEvent.CHANGE, colorChange);
9
			ExternalInterface.addCallback("receiveText", receiveText);	//allows JavaScript to access the receiveText() function.

10
		}
11
		
12
		public function colorChange(event:ColorPickerEvent):void {
13
			ExternalInterface.call("receiveColor", event.target.hexValue);
14
		}
15
		
16
		//this is the new receiveText function

17
		public function receiveText(value:String):void {
18
			jsText.text = value;
19
		}
20
	}
21
}

(Las nuevas líneas son 5, 9 y 16-19.)


Paso 7: Llamando alertas de JavaScript, confirmaciones y avisos desde ActionScript

También podemos llamar alertas muy fácilmente desde ActionScript. Aquí simplemente le decimos a ExternalInterface que llame a un 'prompt'. También podemos usar la interfaz externa para pasar parámetros a las funciones. Aquí le decimos a la función 'prompt' que le pregunte al usuario su nombre. Cuando nuestro usuario ingresa la información, se devuelve al campo de texto 'promptText'.

1
package
2
{
3
	import fl.events.ColorPickerEvent;
4
	import flash.display.MovieClip;
5
	import flash.external.ExternalInterface;
6
	public class Main extends MovieClip {
7
		public function Main() {
8
			cp.addEventListener(ColorPickerEvent.CHANGE, colorChange);
9
			ExternalInterface.addCallback("receiveText", receiveText);
10
			prompt.addEventListener(MouseEvent.CLICK, promptClick);	//makes promptClick() run when prompt button is clicked

11
		}
12
		
13
		public function colorChange(event:ColorPickerEvent):void {
14
			ExternalInterface.call("receiveColor", event.target.hexValue);
15
		}
16
		
17
		public function receiveText(value:String):void {
18
			jsText.text = value;
19
		}
20
		
21
		//function to be called when prompt button is clicked. Will ask for user's name using a JS prompt.

22
		public function promptClick(event:MouseEvent):void {
23
			promptText.text = "You said your name is: " + ExternalInterface.call("prompt", "What is your name?");
24
		}
25
	}
26
}

(Las nuevas líneas son 10 y 21-24.)


Paso 8: Llamando a funciones anónimas de JavaScript

Otra cosa que podemos hacer es escribir nuestras propias funciones de JavaScript como cadenas, luego llamarlas desde la interfaz externa. Aquí creamos una función de JavaScript que recibe un parámetro. Tomamos ese parámetro y asignamos su valor al atributo innerHTML de nuestro div 'textChange' en el documento HTML. Notarás que no se llaman funciones externas de JavaScript; todo está contenido en ActionScript.

1
package
2
{
3
	import fl.events.ColorPickerEvent;
4
	import flash.display.MovieClip;
5
	import flash.external.ExternalInterface;
6
	public class Main extends MovieClip {
7
		public function Main() {
8
			cp.addEventListener(ColorPickerEvent.CHANGE, colorChange);
9
			ExternalInterface.addCallback("receiveText", receiveText);
10
			prompt.addEventListener(MouseEvent.CLICK, promptClick);
11
			change.addEventListener(MouseEvent.CLICK, changeClick);	//makes changeClick() run when change button is clicked

12
		}
13
		
14
		public function colorChange(event:ColorPickerEvent):void {
15
			ExternalInterface.call("receiveColor", event.target.hexValue);
16
		}
17
		
18
		public function receiveText(value:String):void {
19
			jsText.text = value;
20
		}
21
		
22
		public function promptClick(event:MouseEvent):void {
23
			promptText.text = "You said your name is: " + ExternalInterface.call("prompt", "What is your name?");
24
		}
25
		
26
		//changes text inside the HTML to match text field inside Flash

27
		public function changeClick(event:MouseEvent):void {
28
			ExternalInterface.call("function(param){ document.getElementById('textChange').innerHTML = param; }", changeText.text);
29
			changeText.text = "";
30
		}
31
	}
32
}

(Las nuevas líneas son 11 y 26-30.)


Paso 9: Llamando a funciones anónimas de JavaScript y ActionScript

Finalmente, podemos llamar a funciones anónimas en ambos lados. En la función 'anonymous', registramos una función anónima de ActionScript con la interfaz externa. La función completa algún texto, luego inicia un temporizador. A continuación, llamamos a una función anónima de JavaScript. Esta función le dice a la ventana que, cuando se ha redimensionado, debe volver a llamar a nuestra función anónima de ActionScript.

1
package
2
{
3
	import fl.events.ColorPickerEvent;
4
	import flash.display.MovieClip;
5
	import flash.external.ExternalInterface;
6
	public class Main extends MovieClip {
7
		public function Main() {
8
			cp.addEventListener(ColorPickerEvent.CHANGE, colorChange);
9
			ExternalInterface.addCallback("receiveText", receiveText);
10
			prompt.addEventListener(MouseEvent.CLICK, promptClick);
11
			change.addEventListener(MouseEvent.CLICK, changeClick);
12
			
13
			//create a new timer with a one second tick, and add an event listener

14
			var timer:Timer = new Timer(1000);
15
			timer.addEventListener(TimerEvent.TIMER, onTimer);
16
			
17
			anonymous();   //set up the anonymous functions

18
		}
19
		
20
		public function colorChange(event:ColorPickerEvent):void {
21
			ExternalInterface.call("receiveColor", event.target.hexValue);
22
		}
23
		
24
		public function receiveText(value:String):void {
25
			jsText.text = value;
26
		}
27
		
28
		public function promptClick(event:MouseEvent):void {
29
			promptText.text = "You said your name is: " + ExternalInterface.call("prompt", "What is your name?");
30
		}
31
		
32
		public function changeClick(event:MouseEvent):void {
33
			ExternalInterface.call("function(param){ document.getElementById('textChange').innerHTML = param; }", changeText.text);
34
			changeText.text = "";
35
		}
36
		
37
		//clear the text after one second has passed

38
		public function onTimer(event:TimerEvent):void {
39
			resizeText.text = "";
40
			timer.stop();
41
		}
42
		
43
		public function anonymous():void {
44
			//see how we're defining a function inside another function?

45
			ExternalInterface.addCallback("anon", function(){
46
				resizeText.text = "The window has been resized.";
47
				timer.start();
48
			});
49
			
50
			//same applies here

51
			ExternalInterface.call("function(){ window.onresize = function(){ document['externalInterface'].anon(); }; }");
52
		}
53
	}
54
}

(Las nuevas líneas son 13-17 y 37-52.)


Conclusión

ExternalInterface es una clase extremadamente potente y útil. Con él, puedes recibir valores y eventos, todo fuera del SWF. ¡Diviértete con ella y gracias por leer!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.