PDA

Volledige versie bekijken : nodeName controle


davyvh
%Europe/Berlin %443 %2009, 11:38
Hey

Ik probeer in een class een controle op een XML nodeName te doen afkomstig van een XMLList.

Eender welk XML path met ".nodeName" er achter traced een lege string.
Wat doe ik fout?
(Het tracen van het gewone path lukt vanzelfsprekend wel...)

trace(itemList[i].nodeName);

Alvast bedankt
Davy

Sjoedzj
%Europe/Berlin %448 %2009, 11:46
Heb je misschien een voorbeeld van hoe je xml eruit ziet en iets meer code?

davyvh
%Europe/Berlin %458 %2009, 12:00
Ophalen van de XML en doorsturen naar de constructor van de class:
var xml:XML=XML(event.target.data);
itemList=xml.elements("submenu");
// call XML class new VerticalXMLMenu(xml items:XMLList, target:MovieClip, menuItem);
var menu:VerticalXMLMenu = new VerticalXMLMenu(itemList, this, MenuItem, Item);
En dan hier ineens de heel class:
In de 1e regel binnen de For lus met als variabele "j" probeer ik een controle te doen op nodeName (funcie create()). Dat lukt me niet en daar zoek ik dus de fout.

package Menu {
import flash.display.*;
import flash.events.*;
import flash.net.*;

public class VerticalXMLMenu extends MovieClip
{
private var itemList:XMLList;
private var menuItem;
private var item;
private var theroot:MovieClip;

private var itemHeight:Number;
private var subItemHeight:Number;
private var subSpacing:Number = 0;

private var action;

public function VerticalXMLMenu(p_itemList:XMLList, p_root:MovieClip, p_menuItem, p_item)
{
itemList = p_itemList;
theroot = p_root;
menuItem = p_menuItem;
item = p_item;
//initialize heigt from items
var myItem = new menuItem;
itemHeight = myItem.height;
var mySubItem = new item;
subItemHeight = mySubItem.height;
}

public function setHeight(p_height:Number)
{
itemHeight = p_height;
}

public function setSubSpacing(p_subSpacing:Number)
{
subSpacing = p_subSpacing;
}

public function setSubItemHeight(p_height:Number)
{
subItemHeight = p_height;
}

public function getAction()
{
return action;
}

public function create()
{
var ypos:Number = this.y;
for(var i:Number = 0; i<itemList.length(); i++)
{
//menu header
var myItem = new menuItem;
var Item = theroot.addChild(myItem);
myItem.x = this.x;
myItem.y = ypos;
ypos += itemHeight;

if(itemList[i].@title != undefined)
{
myItem.txt.text = itemList[i].@title;
}else
{
myItem.txt.text = "";
}

if(itemList[i].@link != undefined)
{
myItem.buttonMode = true;
myItem.link = itemList[i].@link;
myItem.addEventListener(MouseEvent.CLICK, clickLink);
}else if(itemList[i].@action != undefined)
{
myItem.buttonMode = true;
myItem.action = itemList[i].@action;
myItem.addEventListener(MouseEvent.CLICK, clickAction);
}

//submenu's
for(var j:Number = 0; j<itemList[i].children().length(); j++)
{
if(itemList[i].elements()[j].nodeName == "htmlContent")
{
trace("yeah");
}
var mySubItem = new item;
var SubItem = theroot.addChild(mySubItem);
mySubItem.x = this.x + subSpacing;
mySubItem.y = ypos;
ypos += subItemHeight;
mySubItem.txt.text = itemList[i].elements()[j];
}
}
}

private function clickLink(event:Event)
{
trace(event.target.link);
var url:URLRequest = new URLRequest(event.target.link);
navigateToURL(url, "_self");
}

private function clickAction(event:Event)
{
trace(event.target.action);
}
}
}

Simpele XML:
<?xml version="1.0" encoding="UTF-8"?>

<menu>
<submenu title="Welkom" link="http://www.davyvh.be">
<text>txt welkom</text>
<link>asd</link>
</submenu>

<submenu title="Contact" action="gotoAndStop(1)">
<text>txt contact</text>
<link></link>
</submenu>

<submenu>
<htmlContent><strong>dit is html text</strong></htmlContent>
</submenu>
</menu>

Sjoedzj
%Europe/Berlin %490 %2009, 12:46
Ik zie in de as3 API ook geen property nodeName in XML class. Probeer het eens met:

itemList[i].elements()[j].localName() == "htmlContent"

davyvh
%Europe/Berlin %535 %2009, 13:51
Heey, geweldig!
Bedankt, ik ben nog niet zo goed thuis in de AS3.0 syntax...

In de XML zie je dat ik probeer via het attribute "action" een AS actie mee te geven.
Weet iemand hier een manier voor om dit uit te voeren? Want volgens mij is het niet mogelijk om vanuit een classe de timeline van je FLA aan te spreken...

Groeten
Davy

Sjoedzj
%Europe/Berlin %580 %2009, 14:56
Met die tweede vraag kan ik je niet helpen maar de AS3 API is hier te vinden:
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/

Kun je van alle classes gewoon opzoeken welke attributen en methoden ze hebben.

succes!

TheDutch
%Europe/Berlin %296 %2009, 08:06
Zie hier: http://livedocs.adobe.com/flex/201/langref/XML.html#localName()

jaspermuts
%Europe/Berlin %593 %2009, 15:15
Heey, geweldig!
In de XML zie je dat ik probeer via het attribute "action" een AS actie mee te geven.
Weet iemand hier een manier voor om dit uit te voeren? Want volgens mij is het niet mogelijk om vanuit een classe de timeline van je FLA aan te spreken...

Je kunt wel een String als een functie aanspreken, maar de argumenten ervoor zou je los moeten doen:
<submenu title="Contact" action="gotoAndStop" params="1">
//ergens in een class...
var func:String = myItemList.submenu[i].@action;
var params:int = myItemList.submenu[i].@params as int;
this[func](params) // this["functienaam"] is hetzelfde als this.functienaam

Als je meerdere argumenten wil meegeven, dan adviseer ik je deze waardes allemaal gescheiden door komma's in params te zetten, en ze in de betreffende functie te splitsen op de komma's. Ik heb geen idee of er een manier is om in 1x meerdere argumenten mee te kunnen geven aan een functie.