//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会丢失变量。请帮忙!我不知道为什么会发生这种情况
提前致谢!
答案 0 :(得分:1)
仅当Event.COMPLETE
处理程序完成其任务时,XML数据才存储在linksXML变量中,因为as3是异步的。跟踪processXML
函数中的linksXML var。
修改强>
function processXML(e:Event):void{
.....
.....
futureAction();
}
function futureAction():void{
trace(linksXML);
}
答案 1 :(得分:0)
实际上它确实存在,当你在处理程序之外跟踪它时,它不会被初始化。想象一下代码有点像这样:
我省略了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被调用。在那之后,它已经准备好了。如果它有帮助,请随意使用调试器。
答案 2 :(得分: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>
希望这有点帮助:)祝你好运!