使动态创建的文本字段可在xml中搜索

时间:2013-02-12 17:39:09

标签: xml actionscript-3 flash dynamic textfield

我最近在walkietokyo帮助回答的同一个项目中发布了一个问题。 previous question

所以我的新问题是使用该解决方案来使文本精灵可搜索。 因此,在这种情况下,您可以单击创建的任何动态文本字段,as3会将该特定文本字段的内容与xml中的数据进行匹配,一旦这样做,它将从节点容器中拾取另一个节点对于xml的每个部分(例如

<Searchtext Wordlookup="chris cheeser">
<location>1</location>
<Name>chris cheeser</Name>
</Searchtext>

所以它会注意到我点击的文本字段用chris cheeser填充,然后它会与我的Wordlookup匹配,并识别位置,并将其与我同名的movieclip相匹配)

我目前的as3看起来像这样:

private function XMLLoader(e:Event):void
    {
        xmlData = new XML(e.target.data);
        ParseList(xmlData);

    }

    private function ParseList(nameData:XML):void
    {
     var nameList:XMLList = nameData.Searchtext.Name;
//       var textContainer:Sprite = new Sprite();
     this.addChild(textContainer);

     for each (var nameElement:XML in nameList){
//       var format:TextFormat = new TextFormat();
     format.font = "Arial MT";
     format.size = 22;
     format.color = 0x006699;
     var currTextField:TextField = new TextField();
     currTextField.defaultTextFormat = format;
     currTextField.appendText(nameElement.text() + "\n");
     currTextField.y= 1297 + textContainer.height;
     currTextField.height = 40;
     currTextField.width = 280;
     currTextField.x= 88;
     currTextField.selectable = false;
     textContainer.addChild(currTextField);
     trace(nameElement.text());

       }

    }

    private function onTextClick(e:Event):void 
    {
    var currTextField:TextField = e.target as TextField;

    if (SearchHolder != null){
         TweenMax.to((this["$" + SearchHolder]), 1, {removeTint:true});
        }   
          var resultZ:String = xmlData.Searchtext.(@Wordlookup == currTextField.text.toLowerCase).location.toString()
     SearchHolder = resultZ ? resultZ : "Try again";
        trace(resultZ);
     TweenMax.to(["$" + SearchHolder], 1, {tint:0x00ffcc});
    trace("This name was clicked:", currTextField.text);

    }

注释掉的所有内容都放在函数外部,结果是resultZolder和SearchHolder都被公开标识为字符串,但是我对定义var resultZ的行一直存在问题(我知道这通过几个小时的试图想出来)现在我对resultZ的追踪什么都没有产生,这告诉我它与currTextfield有关,因为我有一个相同的功能设置,输入字段仍然可以工作。 任何帮助将不胜感激,但尝试描述,我还在学习!谢谢!!

1 个答案:

答案 0 :(得分:0)

您似乎错过了toLowerCase()方法的括号。

试试这个:

var resultZ:String = xml.Searchtext.(@Wordlookup == currTextField.text.toLowerCase())[0].location[0].toString();

或者,不是将名称复制为节点和属性,而是可以使用E4X以类似的方式根据子节点内容过滤掉节点,如下所示: / p>

var resultZ:String = xml.Searchtext.(Name == currTextField.text)[0].location[0].toString();

在后一种情况下,您可以省略xml文档中的Wordlookup属性。 (当然,除非它被用于其他目的。)


另请注意,我在搜索和位置参数后添加了[0]。这是因为在E4X中,每个“向下钻取”都会生成XMLList,这是一个节点数组。通过指定[0]之类的访问器,您可以确保只选择第一个结果,以防有多个节点匹配相同的条件。这可能不是理想的结果,但重要的是要记住,因为省略它可以产生令人惊讶的结果。

例如,假设您的xml文档中有两个人都称为“chris cheeser”,它们与位置1和5相关联。未指定您只想选择其中一个,上面的代码相同(但省略[0]访问者)会产生结果“15”。

但是,使用[0]访问器将始终选择与描述匹配的第一个节点,因此如果您可能具有非唯一名称,则可能必须考虑以某种方式使用真正唯一的标识符