2008-12-30 7 views
8

Mon produit ouvre un navigateur Web et le pointe vers un fichier HTML contenant une application Flash locale. Comment puis-je détecter par programme si ce fichier a été chargé avec succès et sinon quelle exception a été lancée? Existe-t-il un moyen de le faire en utilisant Javascript?Détecter si l'application Flash est correctement chargée en utilisant Javascript?

Vérification externe si le fichier existe sur le disque ne suffit pas parce que je l'ai vu d'autres défaillances se produisent (conditions de course pourraient être impliqués).

Répondre

11

répondre à ma propre question: https://sourceforge.net/forum/message.php?msg_id=5929756

  1. Définition d'une fonction Javascript qui doit être invoquée si chargé Flash.
  2. Appelez cette méthode à partir du début de votre fichier Flash.
  3. Utilisez une minuterie pour détecter si le rappel n'est jamais appelé.
  4. Préférez invoquer des fonctions Javascript de Flash plutôt que d'invoquer des fonctions Flash de Javascript. Dans tous les cas, vous ne pouvez pas appeler une fonction qui n'a pas encore été chargée. Il est beaucoup plus facile de garantir que le navigateur a fini de charger votre fonction Javascript avant de l'appeler depuis Flash, que de garantir que Flash a fini de charger votre fonction Flash avant de l'invoquer depuis Javascript.

Voici un exemple:

  • J'utilise swfobject pour intégrer Flash.
  • J'utilise FlashVars pour indiquer à Flash quelle fonction Javascript appeler. Ceci est utile s'il y a plusieurs objets Flash sur la page.

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

brillant! Cela aiderait beaucoup aujourd'hui: D –

3

En fait, lorsque la page HTML fin du chargement, le contenu Flash ne peut pas être encore complètement chargée. Si le chargement SWF n'est pas terminé, il semblera avoir échoué.

La méthode que je recommande habituellement est d'avoir le fichier SWF appeler une fonction JavaScript par ExternalInterface tout de suite lorsque le constructeur de la classe de document est invoqué. Fondamentalement, supposons que le fichier SWF n'a pas pu être chargé à moins que cette fonction JS ne soit appelée.

+0

Assez juste, mais j'ai besoin d'un moyen plus concret de détecter si une panne s'est produite. Un délai d'attente n'est pas assez fiable. – Gili

+0

Un problème avec cette méthode est que vous ne pouvez pas avoir deux instances du flash sur la même page. Ou au moins vous ne savez pas lequel a déclenché le rappel. – zimbatm

+0

Pour savoir quel SWF a déclenché le rappel, vous pouvez transmettre une chaîne ou un numéro unique en tant qu'identifiant à l'aide de FlashVars. Lorsque le fichier SWF appelle JavaScript, il transmet également l'identificateur dans les arguments. – joshtynjala

4

Dans le cas où vous ne pouvez pas modifier le swf et l'ajout d'un ExternalInterface est pas une option, vous pouvez toujours utiliser Javascript pour obtenir le statut de la swf. Par exemple, vous pouvez appeler document.getElementById (swf_id) .PercentLoaded() depuis Javascript, et attendre qu'il soit 100.

Cela ne vous dira pas quelle exception a été levée si le swf n'a pas pu être chargé, mais au moins vous saurez avec certitude s'il a été chargé. D'autres appels utiles sont trouvés ici: http://www.adobe.com/support/flash/publishexport/scriptingwithflash/scriptingwithflash_03.html

+0

ne pouvez-vous pas simplement lancer un fichier SWF qui joue un autre fichier SWF? Vous contrôlez le wrapper et il lève une exception si le fichier SWF imbriqué en jette un. – Gili

+0

Ce lien renvoie un 404 maintenant. –

Questions connexes