【问题标题】:Random behaviour of SWF loadingSWF 加载的随机行为
【发布时间】:2015-03-02 16:15:29
【问题描述】:

我在加载 SWF 文件时有一个非常奇怪的行为:它上的按钮在第一次加载时工作,但如果我重新加载页面,它们就不再工作了,即使我清空缓存或强制 SWF通过在 URL 末尾附加一个随机参数来重新加载。这些按钮是从 init 函数中调用的 XML 文件生成的。

这是我如何称呼我的瑞士法郎:

<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">&nbsp;</div>

恢复按钮的唯一方法是在 Firebug 中编辑源代码,随机更改 SWF URL 并将其更改回来,以便再次加载 URL(第一次尝试时它不起作用,我必须这样做几次才起作用)。

我在 SWF 和我从 AS3 调用的 XML 上没有任何缓存,所以我不明白我怎么会有这样的随机行为:

这是 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);
}

【问题讨论】:

  • 您所说的“他们不再工作”是什么意思?它们是否可见?您的动画的其他元素是否正常工作?
  • 按钮可见且动画有效。点击事件似乎只是没有触发。
  • 尝试使用可以找到here的Flash Player调试版本,看看是否有错误。

标签: javascript actionscript-3 flash


【解决方案1】:

想通了。事实上,这很简单,_initMap() 函数是在我的按钮出现在时间轴上之前或之后随机调用的。因此,如果我获取 xml 的速度太快,_initMap() 函数会尝试引用一个不存在的按钮。

用一些有点脏的东西修复了它,但无论如何它可以工作:

private function _initMap(e:Event):void 
{
    if(!btRetour || btRetour == null || !btRetour.hasOwnProperty("buttonMode")) {
        setTimeout(_initMap, 500, e);
        return;
    }
    // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2017-10-13
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多