Avatar billede megamonster Nybegynder
05. august 2003 - 10:29 Der er 5 kommentarer og
1 løsning

Objekt-problem i forbindelse med load af XML

Til de snu

Jeg er igang med at lave en Flashmenu, som dynamisk genererer menupunkter og undermenupunkter ud fra en XML-streng sendt fra ASP. Koden er fra en komponent som jeg har tilpasset og alt dette virker upåklageligt. Nu vil jeg gerne sikre mig at XML-strengen bliver loadet korrekt, og hvis den ikke gør dette, vil jeg have muligheden for at hente et andet , statisk XML-dokument, ligeledes fra serveren. Problemet er at jeg på eventen "onLoad" (som koden ser ud nu), kalder en funktion som udskriver menuen:

//get the data
this.menu              = new XML();
this.menu.ignoreWhite  = true;
this.menu.timeline    = this;
this.menu.hostTimeline = this._parent;
this.menu.onLoad      = this.makemenu;
//her kaldes den omtalte funktion

this.menu.load(URL);
   
   
};


//setup for movieclip/component recursion
RXMLmenu.prototype.makemenu = function() {
trace("makemenu...");
    this.timeline.siblings = [];
    this.inObj = new Object();
    this.inObj.fontColor = this.timeline.fontColor;
    this.inObj.fontSubColor = this.timeline.fontSubColor;
    this.inObj.emb_f = this.timeline.emb_f;
    this.inObj.buttonFont = this.timeline.buttonFont;
    this.inObj.buttonFontSize = this.timeline.buttonFontSize;
    this.inObj.buttonSubFont = this.timeline.buttonSubFont;
    this.inObj.buttonSubFontSize = this.timeline.buttonSubFontSize;
    this.inObj.w = this.timeline.w;
    this.inObj.h = this.timeline.h;
    this.inObj.ind = this.timeline.ind;
    this.inObj.spacing = this.timeline.spacing;
    this.inObj.nummer = this.timeline.nummer;
    this.inObj.hostTimeline = this.hostTimeline;
    this.inObj.menuChildCount = 0; // Counts number of childnodes

   
//if to display the document root as a single button
    if (this.timeline.showRootNode) {
        for (i=0; i<this.childNodes.length; i++) {
            this.inObj.node = this.childNodes[i];
            this.inObj.menustatus =  this.childNodes[i].menustatus;           
            this.timeline.attachMovie("Xbutton", "root"+i, i, this.inObj);
            this.timeline["root"+i]._y = i*(this.inObj.h+this.inObj.spacing);
            this.inObj.menuChildCount++;
           
        }
    } else {
        //else start with the children of the root
        for (i=0; i<this.firstChild.childNodes.length; i++)
        {

            this.inObj.node      = this.firstChild.childNodes[i];
            this.inObj.menustatus = this.firstChild.childNodes[i].menustatus;
            this.clip            = this.timeline.attachMovie("Xbutton", "root"+i, i, this.inObj);
            this.clip._y          = i*(this.inObj.h+this.inObj.spacing);
            this.timeline.siblings.push(this.clip);

        }

    }
   
    // If Back != "" && null then visible
    // links to prev page and menu
    if (this.firstChild.attributes.backURL != "" && this.firstChild.attributes.backURL != null ){
        backURL = this.firstChild.attributes.backURL;
        btnBack._visible = true;
        btnBack.onRelease = btnBack.goBack(backURL);

    }

    //define this array else recursion will fail
    this.timeline.childclips = this.timeline.siblings;

   
    // Open sub
    if(mcMenu.activeMenu != ""){
        mcMenu["root" add mcMenu.activeMenu].mc.onRollOver();
    }

   
};

Jeg har prøvet at arbejde udenom at kalde makemenu-funtionen med this.menu.onLoad, bl.a. gennem at selv at definere onData:

this.menu.onData = function (src) {
    if (src == undefined) {
        this.onLoad(false);
    } else {
        this.parseXML(src);
        this.loaded = true;
        this.onLoad = ???this.makemenu???;
    }

}

... men jeg ved ikke hvordan jeg kan referer tilbage til funktionen "makemenu" inde fra onData eventen...? Hvis der er nogen der har et forslag til hvordan dette kan gøres eller løses på en anden måde, er de meget velkommen til at skrive.

På forhånd tak
Avatar billede barklund Nybegynder
05. august 2003 - 10:47 #1
Tror bare det er:

this.menu.onData = function (src) {
    if (src == undefined) {
        this.onLoad(false);
    } else {
        this.parseXML(src);
        this.loaded = true;
        this.timeline.makemenu(true);
    }
}
Avatar billede megamonster Nybegynder
05. august 2003 - 11:38 #2
hmm... umiddelbart bliver makemenu-funktionen kørt nu, som jeg egentlig var det jeg spurgte om. Problemet er bare at "this" i "makemenu"-funktionen nu ikke længere er lig XML-strengen som før, men i stedet movieclippet. Dvs. at indholdet i makemenu ikke længere udskriver noget... hvis jeg tracer (this.menu) udskrives derimod XML-strengen?
Avatar billede barklund Nybegynder
05. august 2003 - 12:03 #3
Oh... Så hacker vi:

this.menu.onData = function (src) {
    if (src == undefined) {
        this.onLoad(false);
    } else {
        this.parseXML(src);
        this.loaded = true;
        this.timeline.makemenu.apply(this);
    }
}
Avatar billede megamonster Nybegynder
05. august 2003 - 12:36 #4
Super... Det virker...! Woohooo! Jeg havde også fundet ud af at man i makemenu-funktionen bare kunne skrive: this = this.menu; - så fungerede det også... bare en lidt dårlig løsning :) Hvordan giver jeg dig helt præcist dine point? Skal du ikke skrive et svar eller noget før jeg kan give dig dem? (jeg er ikke superrutingeret i eksperten endnu)
Avatar billede barklund Nybegynder
05. august 2003 - 12:59 #5
Jo, her er et svar...

Og at sætte this lig noget andet er altid skidt.

Tricket i min løsning er et lidt avanceret hack, men går ud på at execute en funktion i et bestemt scope, således at this-referencer i funktionen svarer til parameteren...
Avatar billede megamonster Nybegynder
05. august 2003 - 13:11 #6
Ja, this-løsningen stinker lidt. Men det andet fungerer også perfekt, så det kan ikke være bedre. Jeg har faktisk et sidste problem med nogle dynamiske teksfelter, ligeledes i forbindelse med menuen... tror du det er noget du kan hjælpe med? ... du skal nok få flere point hehe
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester