如何在缓存时使用此Flash代码在IE中工作?

时间:2009-06-12 21:00:37

标签: actionscript-3

我有一个flash文件,当flash播放时,它工作正常,但在IE中,如果闪存已经加载一次并且现在被缓存,它会冻结。在互联网上深入挖掘后,我能够找到以下内容:

  

有一堆已知的错误   闪光9和10,其中一个是   问题与Event.COMPLETE没有   从主舞台被解雇时   嵌入时从缓存加载   WMODE =“透明”我不确定是否   那是你的问题,但值得   调查。我听说过几个   该问题的解决方法。之一   他们是,不是在倾听   完全进展或完成事件   只是使用类似的定时循环   ENTER_FRAME或TIMER来观看   信息bytesLoaded / BYTESTOTAL。

我的WMODE是窗口,但这对我来说最有意义。 loadText永远不会被设置,告诉我它没有进入swfProgressHandle函数。然而问题是我只与其他人一起写了一半这个flash(init里面的所有内容),但那个我再也无法联系到的那个人了。我是相当新的flash,所以真的不知道如何采取他的加载代码,使其只运行计时器事件而不是进度和完成事件(如上面的引言中所述),以便它可以在缓存时在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);
        }

2 个答案:

答案 0 :(得分:1)

如果您不介意每次加载闪存并且不使用缓存,您只需将缓存断开器附加到swf网址。

任何随意的事情都可以。

以下是使用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>

这应该解决任何IE缓存错误。 如果你仍然得到这个错误,那么它不应该与缓存相关。

答案 1 :(得分:0)

快速浏览一下后,我可以看到可能正在发生什么。

  1. 您正在聆听ADDED_TO_STAGE
  2. 您处理ADDED_TO_STAGE然后开始收听PROGRESS
  3. 然后设置loadText,并在进度“完成”时加载XML。
  4. 这里的问题似乎是“完成”部分和进度处理。首先, loaderInfo对象有一个COMPLETE事件。为什么不用它? (http://livedocs.adobe.com/flex/3/langref/flash/display/LoaderInfo.html

    然后你可以跳过整个bytesLoaded / bytesTotal检查。

    我认为应用程序可能冻结的是loaderInfo缓存了资源并完全跳过“PROGRESS”步骤。那么你永远不会进入LoadXML代码,因此永远不会解析xml。

    您可以在Firefox中安装firebug并检查您是否尝试使用“net”选项卡加载XML文件。 (或使用像filemon这样的工具)。