【问题标题】:AS3 getting a textField.text on Click EventAS3 在点击事件上获得 textField.text
【发布时间】:2011-08-13 00:58:30
【问题描述】:

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

我有一个连续的几个电影剪辑的列表,它们是“MiniInfos”,包含一些关于一些“作品”的细节。这些是循环添加到舞台的,每次我都需要添加一个事件监听器(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 的访问。

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

谢谢。

马可·福克斯。

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    我创建了一个小型 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 应用程序的图像:

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • MiniInfo 没有 AS 文件,如果我为它做一个,它会开始工作吗?
      【解决方案3】:

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

      您收到的错误意味着 MainInfo 不存在于同一个 MovieClip 中。 李

      【讨论】:

        【解决方案4】:
        public function OpenWorkDetails(e:MouseEvent):void{        
            trace((e.currentTarget as MiniInfo).IDTrabalhoField.text);
        }
        

        【讨论】:

        • 错误:1119:通过静态类型 MiniInfo 的引用访问可能未定义的属性 IDTrabalhoField。我需要导入一些东西吗?
        • @Marco Fox - 什么是 miniinfo? IDTrabalhoField 是如何在那里声明的?
        • IDTrabalhoField 是一个名为 MiniInfo 的 MovieClip 中的动态文本字段(正确命名为 IDTrabalhoField,我知道它有效,因为我以前使用过它)。这个 miniInfo 在一段时间内通过 addChild 添加到阶段。所有这些都在一个“容器”MovieClip 中。我知道它令人困惑,所以最好绘制它:MainSWF.swf>Container.as>MiniInfo(MovieClip)
        • @Marco Fox - 我的示例仅在 MiniInfo 是具有公共文本字段 IDTrabalhoField 的自定义类时才有效。否则(如果您知道 MiniInfo 内部 IDTrabalhoField 的深度)使用trace(((e.currentTarget as MovieClip).getChildAt(IDTrabalhoField_depth) as TextField).text);
        猜你喜欢
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多