【问题标题】:Flash AS3 stack overflowFlash AS3 堆栈溢出
【发布时间】:2016-04-10 03:33:48
【问题描述】:

我有此代码用于我遵循的登录教程。

package {

    /*
    always extend a class using movieclip instead of sprite when using flash.
    */

    import flash.display.MovieClip;
    import flash.events.*;
    import flash.net.*;
    import flash.text.*;


    /*
    create our class
    */



public class login extends MovieClip {

;


public function login ():void {

            var login_form:login = new login(); 
            addChild(login_form);
            var username:TextField = new TextField();
            addChild(username);
            var password:TextField = new TextField();
            addChild(password);
            var login_button:MovieClip = new MovieClip();
            addChild(login_button);

             /*
            buttonMode gives the submit button a rollover
            */

            login_button.buttonMode = true;

            /*
            what this says is that when our button is pressed, the checkLogin function will run
            */

            login_button.addEventListener(MouseEvent.MOUSE_DOWN, checkLogin);

            /*
            set the initial textfield values
            */

            username.text = "";
            password.text = "";

        }

public function checkLogin (e:MouseEvent):void {

            var username:TextField = new TextField();
            addChild(username);
            var password:TextField = new TextField();
            addChild(password);

    /*
    check fields before sending request to php
    */

    if (username.text == "" || password.text == "") {

        /*
        if username or password fields are empty set error messages
        */

        if (username.text == "") {

        username.text = "Enter your username";

        } 

        if (password.text == "") {

        password.text = "Enter your password";

        }

    } else {

        /*
        init function to process login
        */

        processLogin();

    }

}

public function processLogin ():void {

            var username:TextField = new TextField();
            addChild(username);
            var password:TextField = new TextField();
            addChild(password);

    /*
    variables that we send to the php file
    */

    var phpVars:URLVariables = new URLVariables();

    /*
    we create a URLRequest  variable. This gets the php file path.
    */

    var phpFileRequest:URLRequest = new URLRequest("php/controlpanel.php");

    /*
    this allows us to use the post function in php
    */

    phpFileRequest.method = URLRequestMethod.POST;

    /*
    attach the php variables to the URLRequest
    */

    phpFileRequest.data = phpVars;

    /*
    create a new loader to load and send our urlrequest
    */

    var phpLoader:URLLoader = new URLLoader();
    phpLoader.dataFormat = URLLoaderDataFormat.VARIABLES;   
    phpLoader.addEventListener(Event.COMPLETE, showResult);

    /*
    now lets create the variables to send to the php file
    */

    phpVars.systemCall = "checkLogin";
    phpVars.username = username.text;
    phpVars.password = password.text;

    /*
    this will start the communication between flash and php
    */

    phpLoader.load(phpFileRequest);

}

     public function showResult (event:Event):void {


                    var result_text:TextField = new TextField();
            addChild(result_text);


    /*

    this autosizes the text field

    ***** You will need to import flash's text classes. You can do this by adding: 

    import flash.text.*;

    ...to your list of import statements 

    */

    result_text.autoSize = TextFieldAutoSize.LEFT;

    /*
    this gets the output and displays it in the result text field
    */

    result_text.text = "" + event.target.data.systemResult;

}

}
}

我不确定将按钮动画剪辑和文本字段的所有这些实例放在哪里,但是当我运行我的程序时,我收到了这个错误。

Error: Error #1023: Stack overflow occurred.
    at flash.display::DisplayObject()
    at flash.display::InteractiveObject()
    at flash.text::TextField()
    at flash.display::Sprite/constructChildren()
    at flash.display::Sprite()
    at flash.display::MovieClip()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()
    at login()

我尝试搜索我能理解但无济于事的答案。任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    您收到Stack overflow 错误,因为您正在创建一个无限循环,在其构造函数中使用var login_form:login = new login(); 实例化您的login 类,因此该类的每​​个实例都会创建另一个实例。

    你应该只在你想插入它的时候/在哪里实例化你的类,例如,在主时间线或文档类中,...,或者只是将它直接放到舞台上。

    但是在实例化login 类之前,您应该正确地创建它。为此,您可以在 IDE 中手动添加您的对象(按钮、MovieClips、TextFields,...),方法是将它们放到您的 MovieClip 的舞台上,或者通过代码使用例如:

    var username:TextField = new TextField();
    addChild(username);
    
    var password:TextField = new TextField();
    addChild(password);
    
    // LoginButton here is the AS linkage of a MovieClip/Button in the library  
    var login_button:LoginButton = new LoginButton();
    addChild(login_button);
    

    这个操作通常只做一次,然后你可以像这样使用你的对象:

     var user_name:String = username.text;
    
     if(password.text != ''){ /* ... */ }
    
     login_button.x = 30;
    

    作为初学者,可以开始Learning ActionScript 3 here

    希望能有所帮助。

    【讨论】:

      【解决方案2】:

      您似乎正在创建 login 类的实例并将其添加到自身,这导致登录构造函数中的无限递归。

      var login_form:login = new login();

      您应该从另一个对象初始化登录类并将其添加到舞台上一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        • 2019-05-18
        • 1970-01-01
        • 2012-04-15
        • 2012-12-20
        相关资源
        最近更新 更多