SWF 加载的随机行为
Random behaviour of SWF loading
我在加载 SWF 文件时有一个非常奇怪的行为:它的按钮在第一次加载时工作,但如果我重新加载页面,它们就不再工作了,即使我清空缓存或通过在 URL 末尾附加一个随机参数来强制重新加载 SWF。这些按钮是从在 init 函数中调用的 XML 文件生成的。
我是这样称呼我的 swf 的:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script
<script type="text/javascript">
// <![CDATA[
window.onload=function(){
var _time = (new Date()).getTime();
var params = {wmode: "transparent", src: "http://www.mywebsite.com/sites/default/files/medias/map/monde.swf?" + _time};
var flashvars = {site: "/fr"};
swfobject.embedSWF("http://www.mywebsite.com/sites/default/files/medias/map/monde.swf?" + _time, "flashContent", 920, 450, "10", false, flashvars, params);
};
// ]]>
</script>
<div id="flashContent"> </div>
恢复按钮的唯一方法是编辑 Firebug 中的源代码,将 SWF URL 更改为随机内容,然后将其改回原样,以便再次加载 URL (第一次尝试不成功,我必须尝试几次才能成功)。
我在 SWF 和 XML 上没有任何缓存,我从 AS3 调用,所以我不明白我怎么会有这样的随机行为:
这里是 AS3 脚本的相关部分:
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
var site:String = "";
if (this.loaderInfo.parameters.site != undefined)
site = this.loaderInfo.parameters.site;
_uLoader = new URLLoader();
_uLoader.addEventListener(Event.COMPLETE, _initMap);
var httpHeader : URLRequestHeader = new URLRequestHeader("pragma", "no-cache");
var httpRequest : URLRequest = new URLRequest(site+"/ajax/mywebsite_tools/list_master");
httpRequest.requestHeaders.push(httpHeader);
httpRequest.method = URLRequestMethod.GET;
httpRequest.data = new URLVariables("time="+Number(new Date().getTime()));
_uLoader.load(httpRequest);
_supportContinent = new MovieClip();
this.addChild(_supportContinent);
}
private function _initMap(e:Event):void
{
var cs:mywebsiteSingleton = mywebsiteSingleton.getInstance();
var xml:XML = new XML(_uLoader.data);
cs.xml = xml;
btRetour.buttonMode = true;
btRetour.mouseChildren = false;
btRetour.txt.text = xml.retour.text();
btRetour.gotoAndStop('OUT');
addEventListener(mywebsiteEvent.CONTINENT_CLICK, _contientClick);
btRetour.addEventListener(MouseEvent.CLICK, _retourMonde);
btRetour.addEventListener(MouseEvent.ROLL_OVER, _over);
btRetour.addEventListener(MouseEvent.ROLL_OUT, _out);
}
想通了。事实上,这是相当微不足道的, _initMap()
函数是在我的按钮出现在时间轴上之前或之后随机调用的。所以如果我得到 xml 太快,_initMap()
函数会尝试引用一个不存在的按钮。
用一些有点脏的东西修复了它,但无论如何它都有效:
private function _initMap(e:Event):void
{
if(!btRetour || btRetour == null || !btRetour.hasOwnProperty("buttonMode")) {
setTimeout(_initMap, 500, e);
return;
}
// ...
}
我在加载 SWF 文件时有一个非常奇怪的行为:它的按钮在第一次加载时工作,但如果我重新加载页面,它们就不再工作了,即使我清空缓存或通过在 URL 末尾附加一个随机参数来强制重新加载 SWF。这些按钮是从在 init 函数中调用的 XML 文件生成的。
我是这样称呼我的 swf 的:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script
<script type="text/javascript">
// <![CDATA[
window.onload=function(){
var _time = (new Date()).getTime();
var params = {wmode: "transparent", src: "http://www.mywebsite.com/sites/default/files/medias/map/monde.swf?" + _time};
var flashvars = {site: "/fr"};
swfobject.embedSWF("http://www.mywebsite.com/sites/default/files/medias/map/monde.swf?" + _time, "flashContent", 920, 450, "10", false, flashvars, params);
};
// ]]>
</script>
<div id="flashContent"> </div>
恢复按钮的唯一方法是编辑 Firebug 中的源代码,将 SWF URL 更改为随机内容,然后将其改回原样,以便再次加载 URL (第一次尝试不成功,我必须尝试几次才能成功)。
我在 SWF 和 XML 上没有任何缓存,我从 AS3 调用,所以我不明白我怎么会有这样的随机行为:
这里是 AS3 脚本的相关部分:
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
var site:String = "";
if (this.loaderInfo.parameters.site != undefined)
site = this.loaderInfo.parameters.site;
_uLoader = new URLLoader();
_uLoader.addEventListener(Event.COMPLETE, _initMap);
var httpHeader : URLRequestHeader = new URLRequestHeader("pragma", "no-cache");
var httpRequest : URLRequest = new URLRequest(site+"/ajax/mywebsite_tools/list_master");
httpRequest.requestHeaders.push(httpHeader);
httpRequest.method = URLRequestMethod.GET;
httpRequest.data = new URLVariables("time="+Number(new Date().getTime()));
_uLoader.load(httpRequest);
_supportContinent = new MovieClip();
this.addChild(_supportContinent);
}
private function _initMap(e:Event):void
{
var cs:mywebsiteSingleton = mywebsiteSingleton.getInstance();
var xml:XML = new XML(_uLoader.data);
cs.xml = xml;
btRetour.buttonMode = true;
btRetour.mouseChildren = false;
btRetour.txt.text = xml.retour.text();
btRetour.gotoAndStop('OUT');
addEventListener(mywebsiteEvent.CONTINENT_CLICK, _contientClick);
btRetour.addEventListener(MouseEvent.CLICK, _retourMonde);
btRetour.addEventListener(MouseEvent.ROLL_OVER, _over);
btRetour.addEventListener(MouseEvent.ROLL_OUT, _out);
}
想通了。事实上,这是相当微不足道的, _initMap()
函数是在我的按钮出现在时间轴上之前或之后随机调用的。所以如果我得到 xml 太快,_initMap()
函数会尝试引用一个不存在的按钮。
用一些有点脏的东西修复了它,但无论如何它都有效:
private function _initMap(e:Event):void
{
if(!btRetour || btRetour == null || !btRetour.hasOwnProperty("buttonMode")) {
setTimeout(_initMap, 500, e);
return;
}
// ...
}