0
//Generating menu from XML
var linksXML:XML;
var linksLoader:URLLoader = new URLLoader();
var linksDB:Array = new Array();
linksLoader.load(new URLRequest("menu_links.xml"));
linksLoader.addEventListener(Event.COMPLETE, processXML);
function processXML(evnt:Event):void {
    linksXML = new XML(evnt.target.data);
    for (var i:int = 0; i < linksXML.link.length(); i++){
        var newLink:Array = [linksXML.link[i].@name, linksXML.link[i].@param, linksXML.link[i]];
        linksDB[i] = new Array(newLink);
        trace(linksDB);
    }
}
trace(linksXML.*);

输出是

Second trace: 
null
First trace: 
<menu>
  <link name="first" param="true">first.php</link>
  <link name="second" param="true">second.php</link>
  <link name="third" param="true">third.php</link>
</menu>

因此,在我看来,flash 在退出函数时会丢失变量。请帮忙!我不知道为什么会这样

提前致谢!

4

3 回答 3

1

仅当Event.COMPLETE处理程序完成其任务时,XML 数据才存储在 linksXML 变量中,因为 as3 是异步的。跟踪函数内的 linksXMLprocessXML变量。

编辑:

function processXML(e:Event):void{
        .....
        .....
    futureAction();
}
function futureAction():void{
     trace(linksXML);
}
于 2012-09-14T10:54:42.257 回答
0

帖子的标题暗示了一个范围问题。看起来您已经在函数之外定义了数组;但是,我不确定是否var linksDB:Array = new Array();是正确的方法。尝试var linksDB:Array = [];

这是我很久以前放在一起的一个简单的 XML 加载的东西。内容与您正在做的事情无关,但如果您像我一样,觉得一个工作示例可能会有用:)

var xmlLoad = new URLLoader(xmlLocation);
xmlLoad.addEventListener(Event.COMPLETE, buildSlider);

function buildSlider(e){

    var adList = new XML(e.target.data);
    numPics = adList.ad.length();

    for(var i in adList.ad){
        var pic = new Pic;
        pic.pic = adList.ad[i].pic;
        pic.clicky = adList.ad[i].clicky;
        pic.init();
        pic.x = picWidth * i;       
        contentHolder.addChild(pic);
    }   
    endChecker();

    // autoplay until end of list, or until user clicks
    autoInterval = setInterval(nextButtClick, 4000);
}

XML:

<?xml version="1.0" encoding="UTF-8"?>
<ads>

    <ad>
        <pic>40-Hinton-Gardens.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>

    <ad>
        <pic>644-Haymarket-Lane.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>

    <ad>
        <pic>756-Cambridge-Lane.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>

    <ad>
        <pic>9809-Charolais-Drive.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>


</ads>

希望这会有所帮助:) 祝你好运!

于 2012-09-14T12:39:10.550 回答
0

实际上它确实存在,只是当您在处理程序之外跟踪它时它没有被初始化。想象一下代码有点像这样:

  1. 初始化变量
  2. 加载 xml
  3. 为 xml 加载器设置加载完成处理程序
  4. 跟踪 xml

我省略了 processXML,因为即使您在上面定义了它

trace(linksXML.*);

这并不意味着它在那里被调用,它是一个异步函数,在 URLLoader 完成加载时被调用。您在加载后立即跟踪 xml,因此,在那个时间点,xml 还没有准备好。

如果有帮助,试试这个:

var linksXML:XML;
var linksLoader:URLLoader = new URLLoader();
var linksDB:Array = [];
linksLoader.load(new URLRequest("menu_links.xml"));
linksLoader.addEventListener(Event.COMPLETE, processXML);
function processXML(evnt:Event):void {
    linksXML = new XML(evnt.target.data);
    for (var i:int = 0; i < linksXML.link.length(); i++){
        linksDB[i] = [linksXML.link[i].@name, linksXML.link[i].@param, linksXML.link[i]];
        trace(new Date() + " xml parsed: \n"+linksDB);
    }
}
addEventListener(Event.ENTER_FRAME,checkXML);
function checkXML(event:Event):void{
    trace(new Date(),linksXML);
    if(linksXML != null) removeEventListener(Event.ENTER_FRAME,checkXML);
}

它应该更容易看到 xml 发生了什么。当然,您只需在 processXML 中触发依赖于该 XML 的其他操作,您不需要ENTER_FRAME处理程序,它只是为了说明一点。

简而言之,该变量可以在函数外部访问,只是在调用 processXML之前它没有值。在那之后,它就准备好了。如果有帮助,也可以随意使用调试器。

于 2012-09-14T11:12:23.757 回答