Comunidad de diseño web y desarrollo en internet online

Modificación de un menú swf desde un swf externo

Citar            
MensajeEscrito el 09 Jun 2009 03:27 pm
Hola a todos!

Después de resolver el problema de los arrays en php, me acabo de encontrar con otra cosilla. Os explico.

Tengo una página html (llamada "index") que contiene un menú swf y un iframe llamado "cargador".
En el iframe, se carga por defecto un html (llamado "home") que contiene un archivo swf llamado home.swf.

Lo que quiero conseguir es, que pulsando el botón 1 en home.swf, cargue una página html (pagina1.html) en el "cargador" de "index" y en el menu swf de "index" vaya al fotograma 10.

Seguro que se puede hacer, enviando una variable desde "home.html" al iframe de "index" y que desde aquí la cargue en el menu... o algo así, pero no se como hacerlo :P


Muchas gracias!

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 09 Jun 2009 06:29 pm
En vez de leer un html en el iframe lee un php al que le envíes una variable por post y este la envíe por flashVar al flash, así cuando el flash termine de cargar puedes controlar que vaya al número de fotograma que refleje dicha variable.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 10 Jun 2009 11:47 am
Digamos que tengo esta estructura:


- index.html
--> menu.swf (*)
--> iframe -------->> home.html
--> home.swf ----------------> link a pagina1.html que se cargará en el iframe sustituyendo a
home.html.
----------------> de alguna manera, cuando el usuario pulse el link explicado
anteriormente, hacer que en menu.swf * contenido en
index.html (la página madre de todas, por decirlo de alguna
forma) vaya al fotograma numero 10.

Esta es la cosa. No sé si home.html debería ser un php o no. La historia no es que le pase una variable desde la página madre, a través del iframe hasta home.html y de aquí por flashvars a home.swf. El tema es que no es home.swf la animación en la que yo quiero saltar de fotograma, si no que desde home.swf, quiero enviarle una variable a través del iframe hasta la página madre y desde aquí que la recoja menu.swf y cambie de fotograma.

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 10 Jun 2009 11:49 am

tina89bcn escribió:

Digamos que tengo esta estructura:


- index.html
----> menu.swf (*)
----> iframe -------->> home.html
--------------------------------> home.swf ----------------> link a pagina1.html que se cargará en el iframe sustituyendo a
home.html.
-----------------------------------------------------------------------> de alguna manera, cuando el usuario pulse el link explicado
anteriormente, hacer que en menu.swf * contenido en
index.html (la página madre de todas, por decirlo de alguna
forma) vaya al fotograma numero 10.

Esta es la cosa. No sé si home.html debería ser un php o no. La historia no es que le pase una variable desde la página madre, a través del iframe hasta home.html y de aquí por flashvars a home.swf. El tema es que no es home.swf la animación en la que yo quiero saltar de fotograma, si no que desde home.swf, quiero enviarle una variable a través del iframe hasta la página madre y desde aquí que la recoja menu.swf y cambie de fotograma.


vuelvo a colgarlo a ver si no se descuajaringan los espacios...

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 10 Jun 2009 12:05 pm
En realidad no te entendí anteriormente, pense que deseabas que el flash que estaba dentro del iframe fuera a un frame determinado cuando en el iframe se cargara la página y lo que deseas es que el swf del menu principal vaya a un frame y quien envíe esa acción sea el SWF que está dentro del iframe.

Una de las cosas que mejor se me ocurre, es que tengas una función dentro del flash del menú que si le envías un número vaya a ese frame en la línea de tiempo. Después esta función la puedes llamar mediante JavaScript utilizando ExternalInterface. Te explico a continuación el orden:


  • En el flash home.swf el botón primero que todo llama a una función javascript de la página y depués manda a abrir la url en el iframe.
  • La función javascript que se llama desde home.swf lo que hace es llamar a una función contenida dentro del flash menu.swf enviándole un número.
  • La función dentro del flash lo que hace es ir al frame que le especifica este número.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 10 Jun 2009 03:48 pm
Vale, buena idea! peroo.... Cómo hago el segundo punto? Yo y javascript llevamos una relación de amor-odio que dificulta las cosas... Vamos que de javascript voy muy pez.

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 10 Jun 2009 04:14 pm
No tienes que saber mucho de javascript, sólo debes saber llamar a la función, ve en la ayuda a la clase ExtrenalInterface y estúdiala hay un ejemplo de como debes acceder al objeto flash de la página y como debes de llamar a la función.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 10 Jun 2009 04:57 pm
De acuerdo! mañana os cuento que tal ha ido.

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 11 Jun 2009 10:17 am
De acuerdo, he mirado la ayuda como me dijiste. El ejemplo que sale es este:

En el swf:

Código ActionScript :

var param1:uint = 3;
var param2:uint = 7;
var result:uint = ExternalInterface.call("addNumbers", param1, param2);

/*Si el contenedor es una página HTML, este método invocará a la función de JavaScript con el nombre especificado, que debe estar definida en un elemento script en la página HTML contenedora. El valor devuelto por la función de JavaScript se devuelve a ActionScript.*/


En el html pondríamos la siguiente función, que sería la que recogería las variables y realizaría la suma, devolviendola a flash posteriormente.

Código Javascript :

<script language="JavaScript">
    // suma dos números y devuelve el resultado a ActionScript
    function addNumbers(num1, num2)
    {
        return (num1 + num2);
    }
</script>


En mi caso, debería poner en el botón de mi swf lo siguiente:

Código ActionScript :

on(release) {
    ExternalInterface.call("enviarvariables", var1);
}


Donde var1 sería el número de fotograma del swf menú al cual quiero dirigirme

Después, debo hacer una funcion js que me permita enviarle a la página madre (la que contiene el iframe que contiene la página donde se encuentra el swf que ejecuta enviarvariables, y que contiene dicha función) la variable var1.

Después de 4 horas sin parar de buscar la forma de hacer una función javascript que envie una variable a otra página, yo, sin tener ni puñetera idea de js, escribiría esto:

Código Javascript :

<script language="JavaScript">
   function enviarvariables(var1)
    {
        location.href=../index.html?var1;
    }
</script>


(me lo acabo de inventar entero, a partir de trocitos, no seas muy cruel conmigo)

En la página destino-madre (index.html), en el embed del swf menu, le paso por flashvars la variable var1.

Voy bien, hasta ahora?

Voy a probarlo a ver si pasa algo...

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 11 Jun 2009 10:54 am
Vale no funciona.
index.html no pilla el valor de la variable var1 que en el swf origen es "hola". (esto olvidé añadirlo en el anterior post, pero en el primer fotograma del swf: var var1="hola;). Por lo tanto, o la función no funciona, o algo me falta.

Ya no sé que más probar.

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 11 Jun 2009 11:21 am
A ver vamos a probar otra cosa.

Dos html con un swf cada uno. Un html "pesca" una variable del swf y la envía al otro html, donde mediante flashvars se enviará al otro swf.

Esto se puede hacer? El problema lo tengo en que no se cómo enviar la variable del swf al html y de este al otro html.

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 11 Jun 2009 11:31 am
Primero que todo sitúa el script en el header de la página "home.html" que es la que tiene insertado a "home.swf":

Código Javascript :

<script language="JavaScript">    
    function addNumbers(valor){ 
       alert(valor); 
    } 
</script>


Después dentro de home.swf sitúa este script:

Código ActionScript :

import flash.external.ExternalInterface;

var frame:Number = 0;

this.onMouseDown = function():Void{
   
   frame += 10;
   
   ExternalInterface.call("addNumbers", frame);
   
}


Debes testearlo desde un servidor local o de internet (ejecutando el html localmente no te funcionará). Cuando la función javascript reciba el valor vuelve a postear.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 11 Jun 2009 12:02 pm
Muchas gracias!
Me devuelve el valor de la variable, pero solo lo ha hecho la primera vez... la segunda no ha pasado nada...

El siguiente paso sería enviarla a index.html y que la leyera menu.swf

sería así?

location.href=../index.html?var1;

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 11 Jun 2009 12:03 pm

tina89bcn escribió:

Muchas gracias!
Me devuelve el valor de la variable, pero solo lo ha hecho la primera vez... la segunda no ha pasado nada...

El siguiente paso sería enviarla a index.html y que la leyera menu.swf

sería así?

location.href=../index.html?var1;


Perdón le he dado a enviar antes de tiempo.
Quería decir esto:

location.href=../index.html?valor;

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 11 Jun 2009 12:13 pm
Rectifica bien que constantemente llame a la función de lo contrario hay algún problema, lo más seguro es que cuando salga el alert pierda el foco el flash y tengas que darle una vez más click, pero cuando clickees dos veces te debe volver a llamar la función.

Ahora en index.html tienes que declarar la función que le enviará el valor a flash del menú, crea en el header de index.html esta función javascript:

Código Javascript :

<script language="JavaScript">
function setVariable(valor){      
   alert(valor);
}
</script> 


y en la función que se encuentra en home.html cambia el alert por esto:

Código Javascript :

<script language="JavaScript">     
    function addNumbers(valor){  
       parent.setVariable(valor);
    }  
</script> 


Como ves para llamar a una función javascript en la página parent de un iframe lo que debes hacer es llamarla con "parent".

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 11 Jun 2009 02:14 pm
vale funciona!

Tenías razón, con el segundo click salta el alert.

Una vez en index.html, si envío la variable valor a menu.swf, este no la pilla. he puesto un swf sencillo con un campo de texto dinámico que me muestre el valor de la variable que le paso por flashvars. En este campo de texto me sale la palabra "valor", en lugar de 10.

Lo tengo puesto así:

Código ActionScript :

texto.text=valor;


Creo que tiene que ver con la carga de flash, cuando pulso el botón en home.swf, como el menu de index ya está cargado, no reconoce la variable que le paso por javascript. ¿Puede ser?

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 11 Jun 2009 09:27 pm
Lógico, porque la variable no la pasas por flashVars, se le pasa por medio de una función, flashVars funciona a la hora de cargar el SWF. Bueno ahora debes dentro del flash hacer una función como esta:

Código ActionScript :

import flash.external.ExternalInterface;

//---Declarar el nombre de la función javascript que se comunicará con flash y el nombre de la función de flash
ExternalInterface.addCallback("gotoFrame", this, goto);

//---Función para ir a un frame
function goto(frame):Void{
   
   this.gotoAndStop(Number(frame));
   
}


Después debes hacer algo igual que está en la ayuda de flash (era lo que quería que consultaras). Varía la función que está en index.html para que llame a la función deseada dentro del flash.

Código Javascript :

<script language="javascript">
     function thisMovie(movieName) {
         if (navigator.appName.indexOf("Microsoft") != -1) {
             return window[movieName];
         } else {
             return document[movieName];
         }
     }
   
   function setVariable(valor){
      
      thisMovie("nombre_del_swf").gotoFrame(valor);
      
   }
</script>


Y habrás completado el proceso, llamas desde el flash del iframe a un javascript de home.html que llama a otro javascript de index.html que llama una función en el flash.

Todo esto te sería más fácil si no utilizaras iframes y utilizaras Ajax para la carga de contenidos

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 12 Jun 2009 09:23 am
Ok! ya funciona! ^^

Un último detalle: ¿cómo hago para que ejecute la función desde el principio? En un post anterior comentaba que tenía que darle una segunda vez al botón para que ejecutase la función, a la primera no iba. Me dijiste que debía asegurarme que la función se ejecutaba constantemente, que podía ser que perdiese el foco del flash. El problema será que ahora cuando le doy al botón, primero el flash llama a la función javascript, y luego abre una url en _self. Como a la primera no funciona el envío de la variable, que ya no lo tengo disponible para darle una segunda vez al botón.

He estado buscando pero no he encontrado una solución al problema.

¡Muchas gracias por todo! Ah! seguiré tu consejo y la próxima vez miraré de utilizar Ajax...

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 12 Jun 2009 11:05 am
Ya estáa!

Solucionado. El problema era que tenía dentro del on(release) otra orden: onMouseDown, y dentro de ella, la ejecución de la función javascript. Obviamente cuando hacía click, flash ejecutaba on(release), y dentro de él esperaba a que volviera a hacer click para hacer OnMouseDown. Lo he dejado así:

Código ActionScript :

on (release) {
   import flash.external.ExternalInterface;
   var frame:String;
   frame = "pres";
   ExternalInterface.call("addNumbers", frame);
   getURL("../empresa/empresa.htm", "_self");
}


Ahora ya funciona perfecto.

Muchísimas gracias, elchininet. Si no llega a ser por tí, no sé qué habría hecho, además ya me están apretando en el curro para ver si acabo ya la web... Trabajo en una ingeniería acústica y me tienen haciendo la web de la empresa porque tenía conocimientos de flash y photoshop... En fin, la crisis..

Un abrazo!

Ah! por cierto, con el tema este haré un tutorial por si a alguien le sirve algún día.

Por tina89bcn

10 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 12 Jun 2009 07:33 pm
Me alegro que lo hayas solucionado.
Un tip o tutorial sobre el tema vendría bien. ;)

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.