2009-06-12 8 views
1

私はここにフラッシュファイルを持っています。フラッシュが再生されても正常に動作しますが、IEではフラッシュがすでにロードされていて、キャッシュされているとフリーズします。インターネット上でスーパー深く掘り後、私は次のことを知ることができました:キャッシュされている場合、このFlashコードをIEで動作させるにはどうすればよいですか?

既知のバグの束が フラッシュ9と10、Event.COMPLETEない と 問題であること、それらの一つであります。メインステージから発射されたとき 埋め込み時にキャッシュから読み込む WMODE = "transparent" が問題なのかどうかわかりませんが、それは です。私はいくつかの問題については の回避策を聞いたことがあります。 のうちの1つは、 進捗状況または完全なイベントをリッスンしていません。 ENTER_FRAMEまたはTIMERのようなタイムループを使用して だけを受信して​​、 bytesLoaded/bytesTotalを監視しています。

私のWMODEはウィンドウですが、これは私にとって最も理にかなっています。 loadTextは決してswfProgressHandle関数を入力してくれないということを知らせません。しかし問題は、私は他人と一緒にこのフラッシュの半分(init内のすべて)を書いただけですが、私はもはや接触できない他の人物です。私は非常にフラッシュに新しいので、実際に彼の読み込みコードを取る方法を知っていないと、それがキャッシュされたときにIEで動作するように(上記の引用符で述べたように)進行と完全なイベントの代わりにタイマイベントを実行します。誰かが私にこれを助けることができますか?コードの大半は問題ありません。問題の原因と思われるものを読み込むための進歩と完全なハンドラが始まったばかりです。このざっと見てとった後

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

あなたの質問は正確ですか?あなたはまだ準備が整っていますか?猫はいくつかの他のオプションを試してみて、どれが水を老化させているのかを見る方法はいくつかあります。それはあなたが試みることができるそのポストのカップルを持っているように聞こえる。 –

答えて

0

、私は起こっかもしれないものを見ることができます。

  1. あなたはADDED_TO_STAGEを聞きます。
  2. ADDED_TO_STAGEを処理してから、PROGRESSの受信を開始します。
  3. loadTextを設定し、進行状況が「完了」の場合はXMLをロードします。

ここでの問題は、「完了」部分と進捗処理のようです。まず、 loaderInfoオブジェクトにはCOMPLETEイベントがあります。なぜそれを使用しない? (http://livedocs.adobe.com/flex/3/langref/flash/display/LoaderInfo.html

次に、bytesLoaded/bytesTotalチェック全体をスキップできます。

アプリケーションがフリーズしている可能性があるのは、loaderInfoがリソースをキャッシュして「進捗」のステップをスキップしていることです。それで、あなたは決してLoadXMLコードに入りません。したがって、XMLを解析することは決してありません。

FirefoxにFirebugをインストールして、「ネット」タブを使用してXMLファイルをロードしようとしているかどうかを確認できます。 (または、filemonのようなツールを使用してください)。

1

フラッシュが毎回読み込まれず、キャッシュを使用していない場合は、キャッシュブレーカをswf URLに追加するだけで済みます。

ランダムなことをします。ここで

これは任意のIEのキャッシュのバグを回避する必要があります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> 

を使用した例です。 これでもエラーが発生した場合は、キャッシュ関連ではありません。

関連する問題