0

我最近在同一个项目上发布了一个问题,walkietokyo 很有帮助地回答了这个问题。上一个问题

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

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

所以它会注意到我单击的文本字段充满了 chris cheeseer,然后它将与我的 Wordlookup 匹配,并识别位置,并将其与我的同名电影剪辑匹配)

我当前的 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);

    }

所有被注释掉的东西都放在函数之外,resultZ 和 SearchHolder 都被公开标识为字符串,但是我一直对定义 var resultZ 的行有问题(我通过几个小时的摆弄试图弄清楚这一点) 现在我对 resultZ 的跟踪没有产生任何结果,这告诉我它与 currTextfield 有关,因为我有一个相同的函数设置了一个仍然有效的输入字段。任何帮助将不胜感激,但尽量描述,我还在学习!谢谢!!

4

1 回答 1

0

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

尝试这个:

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

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

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

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


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

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

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

于 2013-02-12T22:48:38.960 回答