2016-02-19 18 views
1

在最后一行中,我希望XML函数读取单击按钮的名称并在XML文件中显示相应的标记(标记在XML文件具有相同的按钮名称),或者相反,我将不得不使用函数或者如果语句等于我拥有的按钮数量!这对我来说没有任何意义!如何获取使用(MovieClip)或(Sprite)类创建的按钮的值

stop(); 
import flash.events.MouseEvent; 
import flash.events.Event; 
import flash.net.URLLoader; 
import flash.display.MovieClip; 
import flash.net.URLLoader; 
import flash.net.URLRequest; 
import flash.events.Event; 
var myVar:String = new String(); 
//var myFrame:Array=new Array(26); 
var words:Array =['Amon','Ahmos','Ramsis'];//the words 

for (var j:int=0; j<words.length; j++) 
{ 
    var word:MovieClip = CreatTextButton(words[j]);//loop in myDictionary and name each button with a different name 
    addChild(word); 
    word.x = 130; 
    word.y = 16 + (j * 30);// to change the position of each word 

    word.addEventListener(MouseEvent.CLICK,onWordClick); 

    function CreatTextButton(label:String):MovieClip //creat buttons 
    { 
     var txt:TextField = new TextField(); 
     txt.defaultTextFormat = new TextFormat('Calibri',20,0x000000); 
     txt.text = label; 
     txt.autoSize = TextFieldAutoSize.LEFT; 
     txt.background = txt.border = true; 
     txt.selectable = false; 
     var btn:MovieClip = new MovieClip(); 
     btn.label=label; 
     btn.mouseChildren = false; 
     btn.addChild(txt); 
     btn.buttonMode = true; 
     myVar=label.valueOf(); 
     trace(myVar); 
     return btn; 
    } 
    function onWordClick(event:MouseEvent) 
    { 
     var myLoader:URLLoader= new URLLoader(); 
     myLoader.load(new URLRequest("1.xml")); 
     myLoader.addEventListener(Event.COMPLETE,loadXML); 
     var label:String = event.currentTarget.label; 
     trace(label); 
    } 
    function loadXML(e:Event) 
     { 
      var myxml:XML = new XML(e.target.data); 
      mydata.text += String(myxml.label)+"\n"; 

     } 
} 

我的XML是

<Pharaohs> 

<Ahmos id='_1'> 
    reigned c. 1539–14 bce and founder of the 18th dynasty 
</Ahmos> 

<Amon id='_2'> 
    The chief deity of the Egyptian Empire 
</Amon> 

<Ramsis id='_3'> 
    The third Pharaoh of the 19th dynasty 
</Ramsis> 

</Pharaohs> 

对不起,我是如此缓慢和愚蠢:d

+0

有很多的东西,使你的代码难以遵循。这里有几点建议:1.不要将函数放入循环中,或者将函数放入其他函数中。 2.更准确地命名事物,例如'myDictionary'是一个数组,而不是一个字典,这是令人困惑的。 'getTextButton2'可以被称为'createTextButton'。 'Vocabulary'可以被称为'onWordClick'或'loadVocabularyForWord'什么的。 'myVar'特别没有意义。 3。使用文字而不是'new'关键字,例如:'var words:Array = []'4.从逻辑上说,你的'myVar'不需要在那里。 – Aaron

+0

@Aaron Thanx你的答复,似乎我有很多问题要解决,我做了关于命名函数的工作人员,但我想问一下将函数放在for循环或另一个函数内,我想这是唯一的方法去做我想做的这段代码,有什么建议? –

+0

当然可以在for循环之外编写函数。我将添加一个答案... – Aaron

回答

0

您可以使用event.currentTarget确定单击哪个按钮。而且,由于您使用的是动态MovieClip作为按钮,因此您可以在创建按钮时将该标签直接指定为该按钮的属性:btn.label = label。然后从您的按钮点击处理程序,您可以使用event.currentTarget.label确定单击按钮的按钮文本。

您可以在E4X过滤器表达式中使用此标签字符串值,以便使用匹配的name()值提取XML中的节点。例如,如果你的XML是这样的:

<Pharoahs> 
    <Amon>Some text about Amon</Amon> 
    <Ahmos>All about Ahmos</Ahmos> 
    <Ramsis>This is Ramsis</Ramsis> 
</Pharoahs> 

您可以提取其名称的按钮标签这样相匹配的XML节点:

var label:String = event.currentTarget.label; 
var node:XML = xml.children().(name() == label)[0]; 

注意命名XML节点一样的你的话可能不是一个好主意,因为如何命名通常不适用于字符串的XML节点有很多限制。例如,空格是一个问题,不允许使用某些字符,区分大小写可能会带来挑战等。相反,您可以使用属性(例如,<pharoah name="Amon">或子节点(例如<pharoah><name>Amon</name></pharoah>))作为每个XML节点的关键字。 XML查找也更容易一些:xml.pharoah.(@name == label)xml.pharoah.(name == label)

另请注意,每次单击按钮时都不需要重新加载XML,这可能会更有意义预加载XML ,然后显示的按钮,每次点击只需要查找在XML对象中的数据。


全部放在一起,并与几个小码的改进:

  • 更名各种事情要有意义的多。
  • 将所有函数移出for循环和其他函数。
  • 首先载入XML并且只载入一次,然后渲染列表,并且生成的点击处理程序要简单得多。

结果:

const listOrigin:Point = new Point(130, 16); 
const listItemSpacing:Number = 30; 
const xmlPath:String = "1.xml"; 

var pharoahs:Array = ['Amon', 'Ahmos', 'Ramsis']; 
var pharoahsXML:XML; 

// First load your XML 
loadXML(); 

function loadXML():void { 
    var urlLoader:URLLoader = new URLLoader(); 
    urlLoader.load(new URLRequest(xmlPath)); 
    urlLoader.addEventListener(Event.COMPLETE, loadXMLComplete); 
} 

function loadXMLComplete(e:Event) { 
    pharoahsXML = new XML(e.target.data); 

    // Render your buttons after the XML is loaded 
    renderPharoahsButtons(); 
} 

function renderPharoahsButtons():void { 
    for (var i:int = 0; i < pharoahs.length; i++) { 
     var btn:MovieClip = createTextButton(pharoahs[i]); 
     btn.x = listOrigin.x; 
     btn.y = listOrigin.y + (i * listItemSpacing); 
     addChild(btn); 

     btn.addEventListener(MouseEvent.CLICK, pharoahButtonClick); 
    } 
} 

function createTextButton(label:String):MovieClip { 
    var txt:TextField = new TextField(); 
    txt.defaultTextFormat = new TextFormat('Calibri', 20, 0x000000); 
    txt.text = label; 
    txt.autoSize = TextFieldAutoSize.LEFT; 
    txt.background = txt.border = true; 
    txt.selectable = false; 

    var btn:MovieClip = new MovieClip(); 
    btn.mouseChildren = false; 
    btn.buttonMode = true; 
    btn.addChild(txt); 

    btn.label = label; // Store the button label for reference 

    return btn; 
} 

function pharoahButtonClick(e:MouseEvent):void { 
    // When a button is clicked is the label to extract the XML node 
    var label:String = e.currentTarget.label; 
    var pharoah:XML = pharoahsXML.children().(name() == currentPharoah)[0]; 
    pharoahText.text += pharoah + "\n"; 
} 
+0

该标签变量帮助我实际上得到点击按钮的名称,但它仍然是一个问题,将标签中的这个值传递给XML处理程序,似乎我必须给他XML标签的名称,我不能给他变量(标签)作为这样的替换 'var myxml:XML = new XML(e.target.data); mydata.text + = String(myxml.label)' –

+0

'myxml.label'不是我上面提到的做法。我建议你使用'children()。(name()== label)'来查找名称与标签匹配的XML节点。在你的问题中发布你的XML。 – Aaron

+0

这是我的XML ' \t \t \t \t在位℃。 1539至1514年BCE和18王朝的创始人 \t \t \t <阿蒙ID = '阿蒙'> \t \t埃及帝国 \t \t \t 的主神 \t \t 19王朝 \t \t ' 我的第三个法老尝试使用'children()。(name()== label)'但是仍然没有用 –

相关问题