Enviar variable a flash con javascript
Hola a todos.
A ver si a alguien se le ocurre o ha hecho algo parecido porque despues de darle varias vueltas no he conseguido llegar a gran cosa.
Tengo un menu en flash dentro de una página en html y quiero que mientras el ratón esté dentro del flash este se comporte de una manera (despliegue menús etc) pero cuando se salga del flash éste lo detecte de alguna manera y pliegue todos los menús.
He preparado el flash para que reaccione ante una variable focus de forma que al pasar focus a 0 se plieguen todos los menús pensando en actualizarla de algún modo con javascript cuando el ratón salga del flash.
Para lograr que el onMouseOut del <object> me genere el evento lo meto en un <code><a id="menuSwf" onMouseOut="cambiaFoco(0)" onMouseOver="cambiaFoco(1)"></code>
en cambiaFoco(foco) hago cosas como:
<code>document.getElementById("menuSwf").childnodes[0].childnodes[0].value="menu.swf?focus="+foco;</code>
o
<code>document.getElementById("menuSwf").childnodes[0].childnodes[2].flashVars="focus="+foco;</code>
(y lo propio para el embed)
partiendo de un objeto swf tipico como este:
<code><object ...>
<param name="movie" value="menu.swf">
<param name="quality" value="high">
<param name="flashVars" value="focus=0">
<embed src="menu.swf" ....></embed>
</object></code>
Igual me he equivocado aqui porque lo estoy escribiendo de memoria pero el caso es que errores de javascript no me da. Sin embargo no consigo el efecto esperado, parece ser que el flash no actualiza la variable. A alguien se le ocurre algún error en mi planteamiento o alguna otra forma de hacerlo?
gracias.
omar
Hola,
el problema q veo a tu codigo es q la linea
<code>document.getElementById("menuSwf").childnodes[0].childnodes[0].value="menu.swf?focus="+foco;</code>
no es la apropiada para mandar el valor de una variable de forma dinamica, ya que el parametro q le pasas despues del "?" es el valor de carga del swf.
Mirate http://www.macromedia.com/support/flash/ts/documents/java_script_comm.htm, donde se explican las principales formas de comunicacion entre flash y javascript.
Klein
Hazlo así:
Pensando que el flash tiene un id:
<code>document.getElementById("ideDelFlash").SetVariable("focus",foco);</code>
Si quieres hacer referencia al flash con tu ejemplo, deberías hacerlo así:
<code>document.getElementById("menuSwf").childnodes[0].childnodes[0].SetVariable("focus",foco);</code>
juandelgado
De todas formas, aunque cambie el valor de la variable en la película Flash, tendrá que estar "observando" que ése valor ha cambiado para ejecutar una función no?
En este post de After-hours, yo puse un ejemplo de cómo llamar a una función de una película Flash y pasarle parámetros desde JavaScript.
Aprovecho que sale el tema, porque en el OFFF, después de la charla de Alesys + GrupoW y a raíz de la seguridad en juegos Flash, hablé un momentito con Marc Palau sobre cómo hacer esto. Creo recordar que él lo hacía de otra forma a través de call.
Marc, ¿puedes explicarnos cómo?, me interesa.
Bye!
XrV
joajoajaojaoajo (Estoy impactado) lo hablé contigo? (q fuette)...
veamos :)
<introduccion>
Flash 4 era MUY GUARRO, hacer algo con el era sumamente complicado (y para un pardillo de la epoca como yo aún más), entonces había un comando en javascript llamado TCallFrame (CALL en flash) (os pongo un ejemplo en flash así rapidito)
<code>
Frame 1:
stop();
function pedo(){
call(2);
}
pedo();
Frame 2:
trace("kaka");
</code>
entonces de este modo teníamos funciones en flash 4
</finintroducción>
ahora vamos a por el javascript:
Puedes tener un clip lleno de frames y en cada frame un actionscript a modo de función (es MUY GUARRO, lo se... pero es antiguo y funciona :P)
entonces tendríamos lo siguiente:
<script type="text/javascript">
function callFlash(id,frame){
document.getElementById(id).TCallFrame ("/",frame);
}
</script>
//Nota, cuando llamas de javascript a flash usando esto (http://www.macromedia.com/support/flash/publishexport/
scriptingwithflash/scriptingwithflash_03.html) el frame 1 es el frame 0 ... etc...
pues con lo que tienes tu y lo que te puesto yo, montamos el siguiente ejemplo (no tengo toda la mañana para estar aqui explicando esto :P)
http://www.palaueb.com/dmstk/
En otro post sus explico como petar los rankings de juegos :)
ah, si.... importante .... XD no rula en mozilla y no tengo tiempo para mirar porque :( (algún voluntario?)
juandelgado
XrV
joajoajaojaoajo (Estoy impactado) lo hablé contigo? (q fuette)...
Bueno, conmigo lo hablaste, no sé si con alguien más : ) ¿Fuerte por?
XrV
ah, si.... importante .... XD no rula en mozilla y no tengo tiempo para mirar porque :( (algún voluntario?)
El método que yo propongo sí que funciona en Mozilla, aunque la verdad es que no he hecho un testing decente. ¿Algún usuario de MacPollo o con navegadores antiguos lo puede probar? Bueno, yo ahora mismo no tengo un ejemplo on-line, pero trataré de colgar alguno.
Bye!
XrV
no si, no lo hablé con nadie más, solo que no sabia que tb andaras por aquí :).
mik
Gracias a todos!! :-o
Lo he hecho al final con el setVariable y funciona a las mil maravillas. Aunque los metodos con asFunction o TCallFrame me evitarían tener que estar monitorizando la variable en todo momento desde flash, no?. si tengo tiempo lo cambio.
Sois unos cracks. Marc, gracias por el ejemplo...casi me cae la lagrimilla cuando he visto que te has currado la movida y la has subido para descargar...ya ves... uno que es de llanto facilon. :cry:
juandelgado
Bueno, yo creo que utilizar watch no consume tantos recursos como si fuese un onEnterFrame. Tampoco estoy seguro, ¿alguien lo puede confirmar?
Además, ¿con asFunction y TCallFrame se pueden pasar parámetros a la función? La verdad es que nunca los he utilizado.
Bueno, me alegra que te rule.
Bye!
Klein
Yo utilizo watch y no he tenido problemas. ¿Alguien que haya tenido problemas con watch?
TheOm3ga
Bueno creo que lo de que no rule en firefox debe ser porq no soporta la funcion esa TCallFrame, porque el onmouseover y tal lo ejecuta bien, así que no se.
Por cierto, Zárate, ¿sabés que c**o le pasa a FlashLa que llevo casi una semana sin poder entrar? Fijo que va a ser de la mierda de ONO....
juandelgado
Efectivamente Omega, yo entro bien ahora mismo y no he tenido problemas esta semana.
Bye!