AS3在Click事件上获取textField.text

时间:2011-04-26 12:59:57

标签: flash actionscript-3

所以,我的Flash应用程序出现了更多问题。

我有几张戏剧性的电影剪辑列表,即“MiniInfos”,其中包含一些“作品”的细节。这些是在一个循环中添加到舞台上的,每次我需要添加一个eventlistener(MouseEvent.CLICK)以便能够单击它以显示更多细节。问题是,为了知道接下来应该出现哪些细节,我需要访问一个包含ID的TextField,以便能够将它传递给下一个Movieclip(让我们称之为“BigInfo”)。

所以,我知道这听起来令人困惑,但是我总是试着总结一下。

有几个MiniInfos添加到TextFields的舞台上,如“ID:1,ID:2,ID:3”等。

我希望能够点击一个,另一个动画片段(BigInfo)被添加到舞台上,并提供有关它的更多详细信息。要知道我应该在PHP上提供哪些信息,我需要知道我点击的MiniInfo的ID。

我的意识形态(没有用)是:

//on the cycle
MiniInfo.addEventListener(MouseEvent.CLICK, OpenWorkDetails);

//further down the code
public function OpenWorkDetails(e:MouseEvent):void
        {
        trace(MiniInfo.IDTrabalhoField.text);
        //If I figure this number out, I will change it to addChild
        }

所以,我得到一个错误1120:访问未定义的属性MiniInfo。

我意识到这段代码不是最好的,所以如果你们有一个不同的解决方案,请随意分享。我还在学习闪光灯。

谢谢。

Marco Fox。

4 个答案:

答案 0 :(得分:2)

我创建了一个小型Flash应用程序来演示您可以采用的不同方法:

<强> FLASH

Main.as(文档类):

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLRequestMethod;
    import flash.net.URLVariables;

    [SWF(width="275", height="175")]
    public class Main extends Sprite 
    {
        private var _phpPath:String = "http://localhost/stackoverflow/minibiginfos/getBigInfo.php";
        private var _bigInfo:BigInfo;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {   
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var xml:XML = <miniInfos>
                              <miniInfo id="1" text="Mini Info 1" />
                              <miniInfo id="2" text="Mini Info 2" />
                              <miniInfo id="3" text="Mini Info 3" />
                          </miniInfos>;

            for (var i:uint = 0; i < xml.children().length(); i++)
            {
                var miniInfo:MiniInfo = new MiniInfo(xml.miniInfo[i].@id, 
                                                     xml.miniInfo[i].@text);

                miniInfo.x = 25;
                miniInfo.y = 25 + ((miniInfo.height + 25) * i);
                addChild(miniInfo);

                miniInfo.addEventListener(MouseEvent.CLICK, onMiniInfoClick);

            }// end for

        }// end function

        private function onMiniInfoClick(e:MouseEvent):void
        {
            loadBigInfo(MiniInfo(e.currentTarget).id);

        }// end function

        private function loadBigInfo(id:int):void
        {
            if (!_bigInfo)
            {
                _bigInfo = new BigInfo();
                _bigInfo.x = 150;
                _bigInfo.y = 25;
                addChild(_bigInfo);

            }// end if

            var urlVariables:URLVariables = new URLVariables();
            urlVariables.miniInfoID = id;

            var urlRequest:URLRequest = new URLRequest(_phpPath);
            urlRequest.method = URLRequestMethod.POST;
            urlRequest.data = urlVariables;

            var urlLoader:URLLoader = new URLLoader(urlRequest);
            urlLoader.addEventListener(Event.COMPLETE, onURLLoaderComplete);
            urlLoader.load(urlRequest);

        }// end function

        private function onURLLoaderComplete(e:Event):void
        {
            var urlLoader:URLLoader = URLLoader(e.currentTarget);

            var urlVariables:URLVariables = new URLVariables(urlLoader.data);

            _bigInfo.text = urlVariables.text;


        }// end function

    }// end class

}// end package

import flash.display.Sprite;
import flash.text.TextField;

internal class MiniInfo extends Sprite
{
    private var _id:int;
    private var _text:String
    private var _width:Number = 100;
    private var _height:Number = 25;

    override public function get width():Number { return _width } 
    override public function get height():Number { return _height }
    public function get id():int { return _id } 
    public function get text():String { return _text } 

    public function MiniInfo(id:int, text:String):void
    {
        _id = id;
        _text = text;

        graphics.beginFill(0xE1E1E1);
        graphics.drawRect(0, 0, _width, _height);
        graphics.endFill();

        var textField:TextField = new TextField();
        textField.x = textField.y = 5;
        textField.text = text;
        textField.mouseEnabled = false;
        addChild(textField);

    }// end function

}// end class

internal class BigInfo extends Sprite
{
    private var _width:Number = 100;
    private var _height:Number = 125;
    private var _textField:TextField;

    public function get text():String { return _textField.text } 
    public function set text(text:String):void { _textField.text = text; } 

    public function BigInfo()
    {
        graphics.beginFill(0xE1E1E1);
        graphics.drawRect(0, 0, _width, _height);
        graphics.endFill();

        _textField = new TextField();
        _textField.width = 90;
        _textField.wordWrap = true;
        _textField.x = _textField.y = 5;
        _textField.mouseEnabled = false;
        addChild(_textField);

    }// end function

}// end class

<强> PHP

getBigInfo.php:

<?php

    if(!empty($_POST))
    {
        $bigInfos = array
                    (
                        array
                        (
                            'miniInfoID' => 1,
                            'text' => "This is the big info for mini info 1"
                        ),
                        array
                        (
                            'miniInfoID' => 2,
                            'text' => "This is the big info for mini info 2"
                        ),
                        array
                        (
                            'miniInfoID' => 3,
                            'text' => "This is the big info for mini info 3"
                        )
                    );

        $text;

        for($i = 0; $i < sizeof($bigInfos); $i++)
        {
            foreach($bigInfos as $item)
            {
                if($item['miniInfoID'] == (int)$_POST['miniInfoID'])
                {
                    $text = $item['text'];
                    break;
                }

            }// end foreach

            break;

        }// end for

        print "text=$text";

    }// end if

?>

以下是运行Flash应用程序的图像:

minibiginfos flash application

答案 1 :(得分:1)

public function OpenWorkDetails(e:MouseEvent):void{        
    trace((e.currentTarget as MiniInfo).IDTrabalhoField.text);
}

答案 2 :(得分:0)

你确定MainFInfo,你的MainINfo.addEventListener和OpenWOrkDetails都在同一个MovieClip中吗?

您获得的错误意味着MainInfo不存在于同一个MovieClip中。 利

答案 3 :(得分:0)

您的问题可能是MiniInfo未在范围内声明。如果它是一个类实例,那么它可以工作,但是如果在函数内部声明了MiniInfo,那么一旦退出该函数它就会被“遗忘”。这就是为什么你必须做www0z0k所做的事情,并使用事件的currentTarget属性。