简体   繁体   中英

Loading XML in Flash AS3

I'm trying to create an application that can show a list of options from an XML. Then when one option is clicked load data from a different XML to show for the option that they picked which is [j].

The code I have here only goes to the last variable after being put through the loop so no matter which option i click it goes to the data from the last option. It only removes the last child of the original buttons as well.

Does anybody have any idea how I could get it to go to the right page?

import flash.events.Event;
import flash.text.TextField;

var xmlLoader:URLLoader = new URLLoader();
var xmlReq:URLRequest = new URLRequest("http://praxis2.cit.ie/~patrickhallihan/DynamicContent/autumn/classxml.php");
xmlLoader.load(xmlReq);

xmlLoader.addEventListener(Event.COMPLETE, getClasses);
function getClasses(e:Event):void
    {
        var xmlobject:XML = new XML(e.target.data);
        var classlist:XMLList = xmlobject.classgroup;
        var classArray:Array = new Array();

        for (var i:int = 0; i<classlist.length(); i++)
            {
                var classname:String = xmlobject.classgroup.classname[i];
                var classtxt:TextField = new TextField();

                classtxt.width = 70;
                classtxt.height = 20;
                classtxt.border = true; 
                classtxt.borderColor = 0x000000;
                classtxt.background = true; 
                classtxt.backgroundColor = 0x888888;
                classtxt.textColor = 0xFFFFFF;
                classtxt.text = "" + classname;
                addChild (classtxt);
                classArray[i] = classtxt;
            }

        for (var j:int = 0; j<classlist.length(); j++)
            {
                classArray[j].y = 40*j;
                classArray[j].x = 125;
                classArray[j].addEventListener(MouseEvent.CLICK, gotoSchedule);

                function gotoSchedule(event:MouseEvent):void
                    {
                        removeChild (classtxt);

                        var xmlLoader1:URLLoader = new URLLoader();
                        var xmlReq1:URLRequest = new URLRequest("http://praxis2.cit.ie/~patrickhallihan/DynamicContent/autumn/getschedule.php?id="+ j);
                        xmlLoader1.load(xmlReq1);

                        xmlLoader1.addEventListener(Event.COMPLETE, getExams);
                        function getExams(e:Event):void
                            {
                                trace (xmlLoader1.data);
                                var examtxt:TextField = new TextField();
                                examtxt.width = 260;
                                examtxt.height = 400;
                                examtxt.y = 30;
                                examtxt.x = 30;
                                examtxt.border = true; 
                                examtxt.borderColor = 0x000000;
                                examtxt.background = true; 
                                examtxt.backgroundColor = 0x888888;
                                examtxt.textColor = 0xFFFFFF;
                                examtxt.text = (xmlLoader1.data);
                                addChild (examtxt);
                            }
                    }
            }
    }

Not sure if this will fix your problem (refactored your code), but it's cleaner not to have some many anonymous function inside of other functions. Plus you totally don't need a second for loop.

import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;

var classArray:Array = new Array();    

var xmlLoader:URLLoader = new URLLoader();
var xmlReq:URLRequest = new URLRequest("http://praxis2.cit.ie/~patrickhallihan/DynamicContent/autumn/classxml.php");

xmlLoader.addEventListener(Event.COMPLETE, getClasses); //add your listeners BEFORE you call load
xmlLoader.load(xmlReq);

function getClasses(e:Event):void
{
    var xmlobject:XML = new XML(e.target.data);
    var classlist:XMLList = xmlobject.classgroup;

    for (var i:int = 0; i<classlist.length(); i++)
    {
        var classname:String = xmlobject.classgroup.classname[i];
        var classtxt:TextField = new TextField();

        classtxt.width = 70;
        classtxt.height = 20;
        classtxt.border = true; 
        classtxt.borderColor = 0x000000;
        classtxt.background = true; 
        classtxt.backgroundColor = 0x888888;
        classtxt.textColor = 0xFFFFFF;
        classtxt.text = "" + classname;
        addChild (classtxt);
        classArray[i] = classtxt;

        classtxt.y = 40 * i;
        classtxt.x = 125
        classtxt.addEventListener(MouseEvent.CLICK, gotoSchedule);
    }
}    

function getIndexFromTextField(tf:TextField):int {
    for (var i:int = 0; i < classArray.length; i++) {
        if (classArray[i] == tf) {
            return i;
        }
    }
    return -1;
}

function gotoSchedule(event:MouseEvent):void
{
    var tf:TextField = event.currentTarget as TextField;
    removeChild(tf);

    xmlLoader = new URLLoader();
    var xmlReq1:URLRequest = new URLRequest("http://praxis2.cit.ie/~patrickhallihan/DynamicContent/autumn/getschedule.php?id=" + getIndexFromTextField(tf));
    xmlLoader.addEventListener(Event.COMPLETE, getExams);
    xmlLoader.load(xmlReq1);
}

function getExams(e:Event):void
{
    trace(xmlLoader.data);
    var examtxt:TextField = new TextField();
    examtxt.width = 260;
    examtxt.height = 400;
    examtxt.y = 30;
    examtxt.x = 30;
    examtxt.border = true; 
    examtxt.borderColor = 0x000000;
    examtxt.background = true; 
    examtxt.backgroundColor = 0x888888;
    examtxt.textColor = 0xFFFFFF;
    examtxt.text = (xmlLoader.data);
    addChild(examtxt);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM