¿Quieres registrarte?

Asignar parámetros a un SWF según el HTML donde se encuentre

Por: Zguillez
1 de Febrero del 2009
7273 de clabLevel
Otros artículos de Zguillez
3,294 visitas

Cuando estamos haciendo sites híbridos, osea páginas XHTML con partes en Flash, es probable que esas partes en Flash sean la cabecera o algún menú que es común para todas las páginas.

Pero aun siendo común para todas las páginas es probable que necesitemos que ese SWF tenga unas características asignadas dependiendo de la página en la que se encuentre. Por ejemplo, que el botón de la sección en la que nos encontremos esté iluminado, o que el SWF se inicie reproducciendo una animación concreta para cada sección.

La solución más fácil sería crear un SWF independiente para cada página con los parámetros que nos interesa para cada página.. pero eso nos resultaría un trabajo bastante tedioso.

Lo mejor es hacer que el propio SWF se inicie con unos parámetros diferentes según el HTML en el que esté colocado.

Para saber en que página estamos utilizaremos el objeto location de Javascript, y ExternalInterface de Actionscript.

Pondremos este código al inicio de la pelicula:

Código :

var ruta:Array = String(ExternalInterface.call("function href(){return (location.href)}")).split("/");
var pagina:String = ruta[ruta.length - 1].replace(".htm","");


Con esto sabremos el nombre del archivo HTML en el que se encuentra ejecutandose el SWF. Apartir de ahi asignaremos los parámetros que nos interese para cada caso.

Por ejemplo haremos que según la página en la que estemos iniciaremos la película en un fotograma u otro:

Código :

var num:uint;
switch (pagina)
{
   case "servicios" :
      num = 2;
      break;
   case "descargas" :
      num = 3;
      break;
   case "contacto" :
      num = 4;
      break;
   default :
      num = 1;
}
gotoAndStop(num);

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas actionscript_3

Comentarios | Enviar un comentario
buena idea, asi no pasas parametros fijos. util ^^
Por: eldervaz
¡Yup! Esto puede ser muy útil al poder dar la oportunidad de tener el mismo *swf para cada sección sin comprometer su contenido individual.
Por: M@U
Hey esto es muy bueno y practico.
(y)
Por: Otaku RzO
Como mencioné antes, esto podría mejorar usando un XML en vez de un switch-case, pero realmente es un gran tip. Seguro le ayudará a muchos.
Por: Freddie
Hola:
Hace mucho que buscaba solución a este "problema" gracias ...... pero es posible que expliques un poco más de donde hay que colocar los codigos, como dicen en mi pais "como si fuese un niñito de 5 años" .... gracias y quedo a la espera de tus comentarios
Por: Cristian-blog

Cristian-blog :

Hola:
Hace mucho que buscaba solución a este "problema" gracias ...... pero es posible que expliques un poco más de donde hay que colocar los codigos, como dicen en mi pais "como si fuese un niñito de 5 años" .... gracias y quedo a la espera de tus comentarios

En el tip lo dice, todo ese código va seguido en el primer fotograma de tu película (o en el constructor de la clase Main).
Por: Zguillez
no entiendo XD Podrías explicar como se supone que el algoritmo sabe en que html esta?

ejem
{
case "contacto" : // Contacto es el nombre del .htm de la sección o como?

de antemano gracias.
Por: juancube

juancube-blog :

no entiendo XD Podrías explicar como se supone que el algoritmo sabe en que html esta?

ejem
{
case "contacto" : // Contacto es el nombre del .htm de la sección o como?

de antemano gracias.


"contacto" es el nombre del html , osea -> contacto.html

Eso lo recuperas ejecutando una función javascript con ExternalInterface que te devuelve location.href.
Con el split("/") divides la ruta por carpetas y obtines la última que es el nombre de la página.
Con el replace() eliminas la extensión, con lo que te quedas solo con el nombre.
Y listo

var ruta:Array = String(ExternalInterface.call("function href(){return (location.href)}")).split("/");
var pagina:String = ruta[ruta.length - 1].replace(".htm","");
Por: Zguillez
Excelente tip Z. Muy útil.
Por: XKlibur
muy buen tip :D
Por: drarock
No deberia de depender de la extensión. Deberia de quitarse automáticamente.

Siguiendo con el ejercicio del split aqui un one-liner :D

Código :

var pagina:String = String(ExternalInterface.call("function href(){ return local.href; }")).split("/").pop().split(".").slice(0, -1).join(".");

Por: fernando

fernando :

No deberia de depender de la extensión. Deberia de quitarse automáticamente.

Siguiendo con el ejercicio del split aqui un one-liner :D

Código :

var pagina:String = String(ExternalInterface.call("function href(){ return local.href; }")).split("/").pop().split(".").slice(0, -1).join(".");

Cierto, asi es más práctico :D
Gracias por el aporte Fernando (y)
Por: Zguillez
Muy útil el Tip. Aunque yo siempre lo he hecho con la ayuda de PHP y el swfObject de Javascript.

Una pregunta, como es un Javascript, ¿Funciona en todo Navegador+Sistema?
Por: gcm
Creo q esto sirve mas para deep linking no se...
creo q Freddie tiene razón por el lado que se puede hacer un archivo de configuración por xml que se puede cargar desde una base de datos.
Cada uno lo aplica como mejor le parezca.
Por: absulit
Disculpa no hay nada parecido pero para Actionscript 2 es que ya tengo mi top en Actionscript 2 y quisiera hacer esto mismo
Por: Javier Ramos-blog

Javier Ramos-blog :

Disculpa no hay nada parecido pero para Actionscript 2 es que ya tengo mi top en Actionscript 2 y quisiera hacer esto mismo

En AS2 puedes llamar a esa función javascript con getURL();
Por: Zguillez
me podrias detar un poco mas el Script por favor
Por: Javier Ramos-blog
Hola Zguillez:
Bueno he probado tus codigos de varias formas y no logro dar con el resultado.
Te explico:
El header es en flash y común para todas las paginas de sitio y cada botón debe quedar encendido cuando navegue por ellas.

En el header tengo un preload......
Preguntas
1.-Donde coloco el código 1 que señalas?
var ruta:Array = String(ExternalInterface.call("function href(){return (location.href)}")).split("/");
var pagina:String = ruta[ruta.length - 1].replace(".htm","");

2.- y donde coloco el otro codigo?
var num:uint;
switch (pagina)
{
case "servicios" :
num = 2;
break;
case "descargas" :
num = 3;
break;
case "contacto" :
num = 4;
break;
default :
num = 1;
}
gotoAndStop(num);

3.- Con el aporte de Fernando, cambia algo?

Gracias, me ayudarias mucho
Por: netsolweb-blog
ww
Por: ww-blog
cordial saludo, es justamente lo que buscaba para que los servidores externos de la empresa puedan medir los links, pero aun así no me funciona... coloco todo eso en el primer frame (y me sale un error de no encontrar la clase uint) y cambio los nombres de las paginas web, pero nada, espero que no sea el script que me quita los macos de IE. gracias por su ayuda
Por: rowilson
Hola otra vez, como crei que era el AS2 hago el llamado del actionS con geturl

var pagina:String = String(ExternalInterface.call("function getURL(){ return local.href; }")).split("/").pop().split(".").slice(0, -1).join(".");

y tampoco, espero alguien me pueda ayudar
Por: rowilson
esto es AS3 no es cierto?, hay forma de hacerlo en AS2?
Por: diegood
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.