2009-06-12 3 views
1

J'ai un fichier flash ici, quand le flash joue, ça marche bien, mais dans IE et si le flash était déjà chargé une fois et est maintenant mis en cache, il se fige. Après avoir creusé super profond sur internet, j'ai pu savoir ce qui suit:Comment puis-je faire fonctionner ce code Flash dans IE lorsqu'il est mis en cache?

Il y a un tas de bugs connus dans Flash 9 et 10, l'un de ceux qui sont un problème avec le Event.COMPLETE pas être tiré de la scène principale quand chargement à partir du cache quand il est intégré WMODE = "transparent" Je ne suis pas sûr si c'est votre problème, mais il vaut la peine regardant dans. J'ai entendu parler de quelques solutions de contournement au problème. L'un des étant, ne pas écouter pour progrès ou des événements du tout et juste en utilisant une boucle temporisée comme ENTER_FRAME ou TIMER pour regarder le bytesLoaded/bytesTotal.

Mon WMODE est une fenêtre, mais c'est ce qui me semble le plus logique. Le paramètre loadText n'est jamais défini, ce qui indique qu'il ne saisit pas la fonction swfProgressHandle. Cependant, le problème est que j'ai seulement écrit la moitié de ce flash (tout dans init) en collaboration avec quelqu'un d'autre, mais cette autre personne que je ne peux plus entrer en contact avec. Je suis assez nouveau pour flasher si vraiment ne sais pas comment prendre son code de chargement et le faire seulement courir les événements de minuterie au lieu de progresser et terminer les événements (comme indiqué dans la citation ci-dessus) afin qu'il fonctionne dans IE lorsque mis en cache. Quelqu'un peut-il m'aider à ce sujet? La plupart du code est bon, c'est juste le début où ces progrès et les gestionnaires complets sont pour le chargement des choses qui semblent causer le problème.

package 
{ 
    //---Imports--- 
    import flash.display.*; 
    import fl.transitions.Tween; 
    import fl.transitions.TweenEvent; 
    import fl.transitions.easing.*; 
    import flash.events.Event; 
    import flash.events.*; 
    import flash.events.IOErrorEvent; 
    import flash.events.ProgressEvent; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.text.TextField; 
    import flash.utils.Timer; 
    import flash.utils.*; 
    import flash.text.Font; 

    public class FohLoader extends Sprite 
    { 
     //create and start load bar 
     private var loadBar:Sprite = new Sprite(); 
     private var loadText:TextField = new TextField(); 
     private var loadBarBg:Graphics = loadBar.graphics; 

     //load XML data 
     private var xmlLoader:URLLoader = new URLLoader(); 
     private var xmlData:XML = new XML(); 

     private var _queue:Array; //holds data objects of items to be loaded 
     private var _index:int; //the current item in the _queue 
     private var _images:Array; //holds DisplayObjects of the loaded images 

     public function FohLoader() 
     { 
      _queue = new Array(); 
      _images = new Array(); 
      _index = 0; 

      //waits for the stage to be created 
      addEventListener(Event.ADDED_TO_STAGE, stageReadyHandle); 
     } 

     private function stageReadyHandle(e:Event):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, stageReadyHandle); 

      loadBarBg.lineStyle(); 
      loadBarBg.beginFill(0x5a96c5, 1); 
      loadBarBg.drawRect(0, 0, 5, 10); 
      loadBarBg.endFill(); 

      loadBar.x = (stage.stageWidth - 500)/2; 
      loadBar.y = 30; 
      loadBar.width = 5; 
      loadBar.height = 10; 
      this.addChild(loadBar); 

      loadText.x = (stage.stageWidth - 0)/2; 
      loadText.y = 50; 
      this.addChild(loadText); 

      //I have no idea if this crap works 
      //but you would have to do something like this if you want to keep your project to one swf file. 
      this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, swfProgressHandle); 
     } 

     private function swfProgressHandle(e:ProgressEvent):void 
     { 
      //assumes you want the loadbar to be 500px at 100% 
      var getPercent:Number = bytesLoaded/e.bytesTotal; 
      trace(bytes_loaded + " of " + bytes_total + " loaded"); 
      loadBar.width = getPercent * 150; //changed 500 to 150 
      loadText.text = String(Math.round(getPercent * 30) + "%"); //changed 100 to 30 

      if (e.bytesLoaded/e.bytesTotal >= 1) 
      { 
       e.target.removeEventListener(ProgressEvent.PROGRESS, swfProgressHandle); 
       loadXml(); 
      } 
     } 

     private function loadXml() 
     { 
      xmlLoader.addEventListener(Event.COMPLETE, ParseXML); 
      xmlLoader.load(new URLRequest("flash.xml")); 
     } 

     private function ParseXML(e:Event):void 
     { 
      e.target.removeEventListener(Event.COMPLETE, ParseXML); 
      flashInputs = new XML(e.target.data); 

      //declare all XMl variables, terrible way to do it though 
      var imageURLList:XMLList = flashInputs.image_area.image.image_url; 
      var firmCount:XMLList = flashInputs.count_area.total_firms; 
      var quoteMsg:XMLList = flashInputs.quote_area.quote.quote_text; 
      var quoteOwner:XMLList = flashInputs.quote_area.quote.quote_owner; 
      var imageURL:XMLList = flashInputs.image_area.image.image_url; 
      var imageText:XMLList = flashInputs.image_area.image.image_text; 

      var quoteMsg0:XML = quoteMsg[0]; 
      var quoteMsg1:XML = quoteMsg[1]; 
      var quoteMsg2:XML = quoteMsg[2]; 
      var quoteMsg3:XML = quoteMsg[3]; 
      var quoteMsg4:XML = quoteMsg[4]; 
      var quoteMsg5:XML = quoteMsg[5]; 
      var quoteMsg6:XML = quoteMsg[6]; 

      var quoteOwner0:XML = quoteOwner[0]; 
      var quoteOwner1:XML = quoteOwner[1]; 
      var quoteOwner2:XML = quoteOwner[2]; 
      var quoteOwner3:XML = quoteOwner[3]; 
      var quoteOwner4:XML = quoteOwner[4]; 
      var quoteOwner5:XML = quoteOwner[5]; 
      var quoteOwner6:XML = quoteOwner[6]; 

      var imageText0:XML = imageText[0]; 
      var imageText1:XML = imageText[1]; 
      var imageText2:XML = imageText[2]; 
      var imageText3:XML = imageText[3]; 
      var imageText4:XML = imageText[4]; 
      var imageText5:XML = imageText[5]; 
      var imageText6:XML = imageText[6]; 

      var imageURL0:XML = imageURL[0]; 
      var imageURL1:XML = imageURL[1]; 
      var imageURL2:XML = imageURL[2]; 
      var imageURL3:XML = imageURL[3]; 
      var imageURL4:XML = imageURL[4]; 
      var imageURL5:XML = imageURL[5]; 
      var imageURL6:XML = imageURL[6]; 

      //loops through the imageURL array and adds each item to the queue 
      for each(var img:XML in imageURL) 
      { 
       addItem(String(img)); 
      } 

      //loads the first item in the queue 
      loadItem(); 
     } 

     //creates a new loader for the item 
     //adds a data object holding the item path and loader into the queue 
     private function addItem(path:String):void 
     { 
      var loader:Loader = new Loader(); 
      _queue.push({loader:loader, path:path}); 
     } 

     private function loadItem():void 
     { 
      _queue[_index].loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imgCompleteHandle); 
      _queue[_index].loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, IOErrorHandle); 
      _queue[_index].loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, imgProgressHandle); 
      _queue[_index].loader.load(new URLRequest(_queue[_index].path)); 
     } 

     //checks the progress of each image, and increases the width of the load bar 
     private function imgProgressHandle(e:ProgressEvent):void 
     { 
      var perc:Number = e.bytesLoaded/e.bytesTotal; 

      //this line assumes you are loading 6 images, and want the loadbar to end up at 500px 
      //it also assumes the bar has already reached 30% (150px) from loading the swf 
      loadBar.width = 150 + (_index * (350/6)) + ((350/6) * perc); 
      //so the swf's 150 + (how many images have alrady loaded * the width each image needs to affect the bar) + 
      //(same thing * percent of current image loaded) 
      //sounds right, might have to mess with that. 
     } 

     //this just stops flash from outputting an error if the image fails to load 
     private function IOErrorHandle(e:IOErrorEvent):void 
     { 
      e.target.removeEventListener(Event.COMPLETE, imgCompleteHandle); 
      e.target.removeEventListener(IOErrorEvent.IO_ERROR, IOErrorHandle); 
      trace("Error handled, sir."); 
      trace("The problem was that, " + e); 
     } 

     private function imgCompleteHandle(e:Event):void 
     { 
      e.target.removeEventListener(Event.COMPLETE, imgCompleteHandle); 
      e.target.removeEventListener(ProgressEvent.PROGRESS, imgProgressHandle); 
      e.target.removeEventListener(IOErrorEvent.IO_ERROR, IOErrorHandle); 

      //adds the image to the _images array 
      _images.push(e.target.content); 

      //increments the load counter 
      _index++; 

      //checks to see if the queue is finished or not 
      if (_index < _queue.length) 
      { 
       trade("Not done loading, loading another item"); 
       loadItem(); 
      } 
      else 
      { 
       _index = 0; 
       _queue = []; 

       killLoadBar(); 
       init(); 
      } 
     } 

     private function killLoadBar() 
     { 
      this.removeChild(loadBar); 
      this.removeChild(loadText); 
     } 
+0

Quelle est exactement votre question? Il y a plusieurs façons d'habiller le chat "êtes-vous encore prêt"? Essayez d'autres options et voyez quelle eau a été utilisée. on dirait que vous avez un couple dans ce post, vous pouvez essayer. –

Répondre

0

Après avoir pris un coup d'œil à cela, je peux voir ce que pourrait se produire.

  1. Vous écoutez ADDED_TO_STAGE.
  2. Vous gérez ADDED_TO_STAGE, puis commencez à écouter PROGRESS.
  3. Vous devez ensuite définir loadText et charger le fichier XML si la progression est terminée.

Le problème ici semble être la partie "fait" et la gestion de la progression. Tout d'abord, l'objet loaderInfo a un événement COMPLETE. Pourquoi ne pas l'utiliser? (http://livedocs.adobe.com/flex/3/langref/flash/display/LoaderInfo.html)

Ensuite, vous pouvez ignorer l'ensemble de la vérification bytesLoaded/bytesTotal. Où je pense que l'application peut geler est quand le loaderInfo a mis en cache des ressources et saute l'étape "PROGRESS" complètement. Alors vous n'obtiendrez jamais dans le code de LoadXML, et par conséquent, n'analysez jamais le xml.

Vous pouvez installer firebug dans Firefox et vérifier si vous essayez même de charger le fichier XML en utilisant l'onglet "net". (ou utilisez un outil comme filemon).

1

Si le chargement du flash ne vous dérange pas à chaque fois et que vous n'utilisez pas le cache, vous pouvez simplement ajouter un séparateur de cache à l'URL du swf.

Une chose aléatoire fera l'affaire.

Voici un exemple en utilisant swfobject (http://code.google.com/p/swfobject/)

<script type="text/javascript"> 

var flashvars = {}; 
var params = {}; 
var attributes = {}; 

swfobject.embedSWF("myContent.swf?rand="+Math.random(), "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes); 

</script> 

Cela devrait fonctionner autour des bugs cache IE. Si vous obtenez toujours l'erreur avec ceci, cela ne devrait pas être lié au cache.

Questions connexes