2008-12-30 18 views
8

Mi producto abre un navegador web y lo apunta a un archivo HTML que contiene una aplicación Flash local. ¿Cómo puedo detectar mediante programación si este archivo se cargó correctamente y, en caso de que no, qué excepción se lanzó? ¿Hay alguna manera de hacer esto usando Javascript?¿Detecta si la aplicación Flash se cargó correctamente usando Javascript?

Comprobando externamente si el archivo existe en el disco no es suficiente porque he visto otras fallas ocurridas (pueden existir condiciones de carrera).

Respuesta

11

responder a mi propia pregunta: https://sourceforge.net/forum/message.php?msg_id=5929756

  1. definir una función Javascript que debe ser invocado si flash cargado.
  2. Invoca este método desde la parte superior de tu archivo Flash.
  3. Use un temporizador para detectar si la devolución de llamada nunca se invoca.
  4. Prefiere invocar funciones de Javascript desde Flash en lugar de invocar funciones de Flash desde Javascript. De cualquier forma, no puede invocar una función que aún no se haya cargado. Es mucho más fácil garantizar que el navegador haya terminado de cargar su función de Javascript antes de invocarlo desde Flash, que garantizar que Flash haya terminado de cargar su función de Flash antes de invocarlo desde Javascript.

Aquí se muestra un ejemplo:

  • estoy usando swfobject para incrustar flash.
  • Uso FlashVars para decirle a Flash qué función de Javascript invocar. Esto es útil si hay múltiples objetos Flash en la página.

flash

var params:Object = LoaderInfo(this.root.loaderInfo).parameters; 
if (ExternalInterface.available) 
{ 
    var onLoaded:String = params["onLoaded"]; 
    if (onLoaded != null) 
     ExternalInterface.call(onLoaded, true); 
} 

Javascript

var flashLoaded = false; 
var flashTimer; 

function onFlashLoaded() 
{ 
    flashLoaded = true; 
    clearTimeout(flashTimer); 
} 

function onFlashTimeout() 
{ 
    if (!isFlashLoaded) 
    { 
     // Remove the Flash object in case it is partially loaded 
     $("#videoFeed").empty(); 
     $("#videoFeed").append('<div id="flashObject"></div>'); 
     alert("Failed to load video player"); 
    } 
    clearTimeout(flashTimer); 
} 

function connectToVideo() 
{ 
    var flashvars = {}; 
    flashvars.onLoaded = "onFlashLoaded"; 

    var params = {}; 
    params.menu = false; 

    var attributes = {}; 

    isFlashLoaded = false; 
    flashTimer = setTimeout("onFlashTimeout()", 5000); 

    swfobject.embedSWF("flash/VideoFeed.swf", "flashObject", "800", "600", "11", "expressInstall.swf", flashvars, params, attributes); 
} 
+1

brilliant! Esto ayudaría mucho hoy: D –

3

En realidad, cuando la página HTML finaliza la carga, el contenido Flash puede no ser completamente cargado todavía. Si el archivo SWF no está terminado de cargarse, parecerá que ha fallado.

El método que generalmente recomiendo es hacer que el SWF llame inmediatamente a una función de JavaScript a través de ExternalInterface cuando se invoca el constructor de clase de documento. Básicamente, suponga que el SWF no se ha podido cargar a menos que se llame a la función JS.

+0

Bastante, pero necesito una forma más concreta para detectar si ha ocurrido una falla. Un tiempo de espera no es lo suficientemente confiable. – Gili

+0

Un problema con este método es que no puede tener dos instancias del flash en la misma página. O al menos no sabes cuál ha activado la devolución de llamada. – zimbatm

+0

Para saber qué SWF activó la devolución de llamada, puede pasar una cadena o número único como identificador utilizando FlashVars. Cuando el SWF realiza la llamada a JavaScript, también pasa el identificador en los argumentos. – joshtynjala

1

según documentación de Adobe ExternalInterface: http://livedocs.adobe.com/flex/3/langref/flash/external/ExternalInterface.html algunos navegadores web restringen llamar a una función Javascript través de ExternalInterface en el constructor de la clase de documento si se ha activado un bloqueador de ventanas emergentes.

¿Hay alguna otra solución para detectar cuándo la película swf se ha cargado correctamente?

4

En los casos donde no se puede modificar el swf y agregar una ExternalInterface no es una opción, aún se puede usar Javascript para obtener el estado del swf. Por ejemplo, puede llamar a document.getElementById (swf_id) .PercentLoaded() desde Javascript y esperar a que sea 100.

Eso no le dirá qué excepción se produjo si el swf no se pudo cargar, pero al menos sabrá con certeza si se cargó. Otras llamadas útiles se encuentran aquí: http://www.adobe.com/support/flash/publishexport/scriptingwithflash/scriptingwithflash_03.html

+0

¿no puede simplemente iniciar un archivo SWF que reproduce otro archivo SWF? Usted controla el contenedor y arroja una excepción si el archivo SWF anidado arroja uno. – Gili

+0

Este enlace está devolviendo un 404 ahora. –

Cuestiones relacionadas