URLLoader 404 Error 与 complete事件

2010年3月31日 6 条评论

最开始发现是在AS2里用MovieClipLoader加载图片,那次地址写错了,但是依然有onLoadComplete事件触发。
请看下面的代码:

var mc:MovieClip = _root.createEmptyMovieClip("mc", 1);
var loader:MovieClipLoader = new MovieClipLoader();
var listener:Object = {};
loader.addListener(listener);

// 加载一个错误的图片地址,但只要有数据返回就会触发complete事件
loader.loadClip("http://www.litefeel.com/errorJpg.jpg", mc);

listener.onLoadComplete = function(target:MovieClip):Void
{
    trace("this is loadComplete!");
}

OK,上面明明是一个错误的图片地址,竟然会触发onLoadComplete事件。
然后用浏览器打开这个错误的地址看了下,是一个404Error页面。又换了好多个地址,不同域名的,可是依然会触发onLoadComplete事件。
所以猜想可能是只要有数据返回就会触发onLoadComplete事件吧(onLoadInit也是一样)。
测试LoadVars后更加断定我的猜想,请看代码:

var loader:LoadVars = new LoadVars();
loader.onLoad = function (success:Boolean):Void
{
    trace("success = " + success);
    trace(loader);
}
// 请更改为非跨域的不存在的地址
loader.load("http://www.litefeel.com/fdsafdsa");

我想这可能是AS2的一个bug吧,不知道AS3里解决了没有。
测试后发现Loader不存在这样的问题了,但是URLLoader,URLStream依然会触发Event.COMPLETE事件。
或许这不是bug,可能Adobe设计的时候就是complete为数据接收完毕,不论是404页面还是原本的地址。
那么我怎么才能知道是我原本想请求的数据还是一个404呢。
可能在HTTPStatusEvent.HTTP_STATUS 这个事件里会给让我区分吧。
测试发现明明由一个不存在地址跳转到404页面,但flashplayer收到的httpStatusCode竟然是200,就是说flashplayer认为这不是错误的请求,是正常的。
请看这个demo:
输入一个随便输入一个网址,如果有跨域请更换地址,再看httpStatusCode和返回的data。
在Event.COMPLETE事件里获取到data数据的。

这是一个urlloader对404错误的测试demo,如果你看不到这个flash,请到文章页面查看!

结果表明:Event.COMPLETE事件在完整数据返回后触发,而不管是404页面还是其他。
存在的问题:没有办法区别是否404页面。
再看官方帮助上对HTTPStatusEvent.HTTP_STATUS的解释。

Dispatched if a call to URLLoader.load() attempts to access data over HTTP. For content running in Flash Player, this event is only dispatched if the current Flash Player environment is able to detect and return the status code for the request. (Some browser environments may not be able to provide this information.) Note that the httpStatus event (if any) is sent before (and in addition to) any complete or error event.

OK,某些浏览器可能不能获取httpStatusCode,但是这个却返回了httpStatusCode:200。

感谢 12345 的回复.原来我之前博客的404页面是直接跳转,但是没有将状态码变成404,返回的依然是正常的状态码200,所以flashplayer认为这是一个正常的页面,而不是404,现在将状态码改成404了,这样flashplayer就返回IOError了,现在一切正常了

本例demo下载☞

标签: , , , ,
回到顶部