我目前正在注册一个ActionScript课程,似乎无法让我的进度条正常工作。我们的任务是创建一个简单的图像加载器应用程序,它将访问外部托管的图像(通过使用PHP代理脚本),然后将图像吐出到用户的屏幕上(使用进度事件和进度条来跟踪图像的下载进度)。
然而,当我运行它时,我到处都会看到这些神秘的黑色图形故障,以及一个无效的进度条。在某些浏览器中,我收到以下错误:“ArgumentError:错误#2109:在场景NaN中找不到帧标签NaN。位于Document / imageLoadProgress()的flash.display.MovieClip / gotoAndStop()。
这是我的代码 - 我不能为我的生活弄清楚什么是错的。我认为它与imageLoadProgress()函数或我的进度条(它只是一个简单的100帧影片剪辑,其中包含补间动画和开头的“stop()”命令)。
public function loadImage()
{
var imageURL:String = imageArray[currentImageIndex];
if(loaderInfo.url.substr(0,4) == "http")
{
trace("we're online");
//use the proxy script
//escape() will replace spaces in file names with %20
imageURL = "./image_proxy.php?filename=" + escape(imageArray[currentImageIndex]);
}
var imageRequest:URLRequest = new URLRequest(imageURL);
this.imageLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.imageIOError);
this.imageLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, this.imageLoadProgress);
this.imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.imageLoadComplete);
this.imageLoader.load(imageRequest);
//end loadImage
}
public function imageIOError(e:Event)
{
trace("ImageIOError called. Error=" + e);
//end imageIOError
}
public function imageLoadProgress(e:ProgressEvent)
{
var percentLoaded:Number = e.bytesLoaded/e.bytesTotal;
percentLoaded = Math.round(percentLoaded * 100);
//this.progress_mc.scaleY = percentLoaded;
if (percentLoaded < 1)
{
this.progressBar.gotoAndStop(1);
}
else
{
this.progressBar.gotoAndStop(percentLoaded);
}
//end imageLoadProgress
}
答案 0 :(得分:2)
你的装载程序脚本对我来说似乎绝对没问题,除了一个小小的缺陷:
错误消息中NaN
(==非数字)对我来说唯一的方法是,如果您的ProgressEvent的bytesTotal
属性等于0 - 因为除以零不会产生有效结果,因为我们都知道。
我不能确定为什么会发生这种情况,不知道你的任何服务器端代码,但我认为如果你的PHP代理脚本没有正确设置Content-Length
HTTP响应头,就会发生这种情况。如果您正在加载实际的图像文件,Web服务器会自动为您设置标题 - 对于您的代理脚本,您似乎必须自己处理它。
无论如何,您可以通过测试NaN
来确保您的加载程序脚本更加防错,并确保您跳转到的帧永远不会超过100:
var frame:int = isNaN (percentLoaded) || percentLoaded < 1 ? 1 :
percentLoaded > 100 ? 100 : percentLoaded;
progressBar.gotoAndStop(frame);
(我选择了速记符号,但这与写两个if
语句和else
)基本相同。