2011-05-20 13 views
10

Este es el desafío: tengo una película Flash que se integrará en una página utilizando una ID de DOM desconocida que deseo poder identificar/almacenar para la devolución de llamada en una función JS.¿Puede una función de JavaScript detectar qué objeto DOM de Flash lo llamó?

Mi flujo de usuario ideal sería:

  1. usuario hace clic en el botón en Flash.
  2. Flash pausa cualquier animación/video/sonidos/etc.
  3. Flash llama a una función JS inyectada para mostrar una experiencia de superposición de página.
  4. Cuando el usuario cierra la experiencia de superposición, se invoca un método de devolución de llamada en el objeto Flash.
  5. El flash reanuda la reproducción.

El problema es que cuando AS3 utiliza el método ExternalInterface.call ("functionName", args ...), no parece haber un evento DOM activado, y por lo tanto es imposible decir qué objeto llamada función JS, por lo que parece que tener una función "registerMe()" no funciona. Básicamente, la función JS inyectada no tiene forma de determinar qué objeto DOM llamar, porque el ID del objeto Flash es desconocido.

[ACTUALIZACIÓN] Resulta que un archivo SWF puede determinar su propia URL utilizando loaderInfo.url. Estoy pasando esa información al script que inicia la experiencia de superposición para que pueda almacenarse para una futura comparación con todos los objetos DOM application/x-shockwave-flash. Cuando se encuentra una coincidencia, ese es el SWF que realiza la llamada. ¿Alguien ve un defecto en esta lógica? (No soy tan competente con JS como con AS)

+2

A veces tengo pesadillas sobre tratar de hacer que Flash y JS trabajen juntos. – sdleihssirhc

+0

Siempre existe la técnica de la fuerza bruta de encontrar todos los archivos SWF en la página y probar la función de devolución de llamada en cada uno de ellos, pero eso me parece arriesgado e irresponsable, por lo que no está realmente sobre la mesa. –

+0

¿tienes control del swf? –

Respuesta

5

La función de JavaScript que está llamando se está llamando manualmente, no como un evento. Es como si utilizara los métodos call o apply en JS.

Lo que puede apruebe el DOM name/ID of the active flash video como parámetro a la función que está llamando, para que sepa qué elemento DOM para referirse de nuevo a:

ExternalInterface.call('functionName', arg1, arg2, ..., ExternalInterface.objectID); 

Una "Gotcha" con este El método es que debe asegurarse de que los elementos object y/o embed tengan sus atributos [id] y [name] establecidos, porque ExternalInterface.objectID se registrarán de forma incoherente en todos los navegadores.

Si no recuerdo mal, IE lee el [name] y FF/cromo/Opera/Safari leyó el [id], aunque creo que un par de navegadores se repliegue correctamente a la [name]. Tendré que hacer una prueba para confirmar esto.

En cualquier caso, proporcione an identical name and id y debería funcionar bien (podrá seleccionar el elemento en el DOM solo en función de la ID).

2

Dado que asumo que usted tiene el control total sobre todo el proceso de incrustación aquí, parece que podría decirle al SWF su DOM ID como un flashvar ya que está siendo incrustado (ya sea a través de Javascript como SWFObject o como el servidor genera el HTML). Luego, cuando llama a la función Javascript para activar la interfaz, puede enviar su DOM ID como argumento.

No es exactamente ideal, pero definitivamente es factible y fácil en el navegador.

+0

Lamentablemente, no estamos controlando la distribución del SWF ... estará en varias redes publicitarias diferentes y no hay garantías de que los parámetros que establezcamos cuando carguemos el swf sean válidos una vez que estén fuera de la red. –

0

No creo que puedas. La única forma "limpia" que puedo pensar es inyectar el ID del objeto Flash a través de Flashvars. Lo feo sería encontrar todos los objetos Flash y usar loaderInfo.url para comparar e identificar el objeto Flash correcto.

+0

Desafortunadamente, el escenario para la pieza de Flash es que se sirve a través de varias redes publicitarias y, por lo tanto, no tendrá una identificación constante. –

Cuestiones relacionadas