【问题标题】:Interaction isn't translating input Text to Strings交互不会将输入文本转换为字符串
【发布时间】:2014-06-04 17:23:10
【问题描述】:

我需要一些帮助。首先,我有一个交互,你填写 5 个文本框来回答 2 个问题。 5 个答案中的每一个都必须作为输入文本填写,然后在单击完成按钮时对照一系列可接受的答案进行检查。此外,字段中存在两种类型差异。因此,前三个答案字段属于数组中可接受的答案范围:类型 A,接下来的两个问题属于类型 B。只要输入正确,就可以按任何顺序填写正确的答案。

我似乎不明白为什么 textFields 没有翻译成字符串。

import flash.text.TextField;
import flash.events.MouseEvent;

stop();


//*--------------------------------------------
//
//                  THINGS YOU CAN CHANGE
//
//*--------------------------------------------

var a_inputType:Array = new Array("Doggie Day Spa", "Deb's Dog Walking Service", "Pet Market", "Pampered Pet", "TLC Grooming");     //All recognized type responses, Type A listed before Type B
var n_typeA:Number = new Number(3);                                                                                                 //Sets the range for Type A


//*--------------------------------------------
//
//                  PAGE SETUP
//
//*--------------------------------------------

var n_typeB:Number = new Number(a_inputType.length - n_typeA +1);       //Finds the range of Type B
var a_testArray:Array = new Array();                                    //Holds push data from submit button

var a_correctArray:Array = new Array();                                 //Creates an array to run a final test against
for(var c = 0; c<=a_inputType.length-1; c++){                           //Loop populates the array
    a_correctArray.push(1);
}

var inputField1:TextField = new TextField();                            //Creates the Text Fields
var inputField2:TextField = new TextField();
var inputField3:TextField = new TextField();
var inputField4:TextField = new TextField();
var inputField5:TextField = new TextField();

var txtString1:String = new String();                                   //Creates the strings for translating the input text
var txtString2:String = new String();
var txtString3:String = new String();
var txtString4:String = new String();
var txtString5:String = new String();

for(var f = 1; f<=a_inputType.length; f++){                             //Assigns them properties, locations, and adds a listener for text
    var fieldBuilder = "inputField"+f;
    var fieldFinder = "txt_pos"+f;
    addChild(this[fieldBuilder]);
    this[fieldBuilder].border = false;
    this[fieldBuilder].width = 290;
    this[fieldBuilder].height = 25;
    this[fieldBuilder].x = this[fieldFinder].x;
    this[fieldBuilder].y = this[fieldFinder].y;
    this[fieldBuilder].type = "input";
    this[fieldBuilder].multiline = true;
    this[fieldBuilder].text = "";
    this[fieldBuilder].addEventListener(TextEvent.TEXT_INPUT, function (){
                             var stringBuilder = "txtString"+f;
                             this[stringBuilder] = this[fieldBuilder].text;
                             });
}


//*--------------------------------------------
//
//                  FUNCTIONS
//
//*--------------------------------------------

function SUBMIT(event:MouseEvent):void{                                 
    for(var t=1; t<=a_inputType.length; t++){                           //Loop establishes checks for each String against an input type
        if(t<=n_typeA){                                                 //if/else divides the textfields into two ranges: typeA and typeB
            checkTypeA(this["txtString"+t], a_inputType);               //sends the array of correct responses and the captured String to checkTypeA
        }else{
            checkTypeB(this["txtString"+t], a_inputType);               //sends the array of correct responses and the captured String to checkTypeB
        }
    }
    var TEMPSELECT = a_testArray.toString();                            //reduces the testArray recieving push data into a String
    var TEMPCORRECT = a_correctArray.toString();                        //reduces the correctArray from scene set-up into a String
    if(TEMPSELECT == TEMPCORRECT){                                      //compares the strings and determines a trace response
        trace("correct");
    }else{
        trace("incorrect");
    }
}

function checkTypeA(value:String, arr:Array){                           //Checks the String against all the array values within the specified range for type A
    for (var a=1; a<=n_typeA; a++){                                     //determines the range
        if (arr[a]==value){                                             //checks the value
            a_testArray.push(1);                                        //if true, generates a push value for a testArray to be checked later
        }
    }
}

function checkTypeB(value:String, arr:Array){                           
    for (var b = n_typeA; b<=n_typeB; b++){
        if (arr[b-1]==value){
            a_testArray.push(1);
        }
    }
}


//*--------------------------------------------
//
//                  BUTTONS
//
//*--------------------------------------------

done_bttn.addEventListener(MouseEvent.CLICK, SUBMIT);                   //Launches the SUBMIT function when "Done" is pressed.

经过进一步调查,我注意到循环在达到 5 时并没有终止。它使用相同的变量名和实例一遍又一遍地反刍 TextFields。因此,addChild 将输入字段一个接一个地转储到 flash 文件中(这使得编辑文本字段变得不可能,因为您总是单击直接位于刚刚编辑的字段之上的新字段)。

循环上的跟踪返回如下:

inputField1
txt_pos1
inputField2
txt_pos2
inputField3
txt_pos3
inputField4
txt_pos4
inputField5
txt_pos5
inputField1
txt_pos1
inputField2
txt_pos2
inputField3
txt_pos3
inputField4
txt_pos4
inputField5
txt_pos5
inputField1
txt_pos1
inputField2
txt_pos2

等等....我怎样才能停止这种循环行为。我已经尝试过 if/else 中断,但它不起作用。

【问题讨论】:

    标签: actionscript-3 text input actionscript


    【解决方案1】:

    当您从本地函数调用 this 关键字时,它的上下文会发生变化。如果您将trace(this) 添加到您的匿名函数中,您可以轻松验证它。它将追踪[object global]。想到了两个解决方案,将this 的引用存储在一个变量中:

    var self:MovieClip = this;
    for(var f = 1; f<=a_inputType.length; f++){      
        //...
        this[fieldBuilder].addEventListener(TextEvent.TEXT_INPUT, function (){
                                 var stringBuilder = "txtString"+f;
                                 self[stringBuilder] = self[fieldBuilder].text;
                                 });
    }
    

    或者声明一个新函数:

    for(var f = 1; f<=a_inputType.length; f++){      
        //...
        this[fieldBuilder].addEventListener(TextEvent.TEXT_INPUT, myFunction);
    }
    
    function myFunction(t:TextEvent){
                             var stringBuilder = "txtString"+f;
                             this[stringBuilder] = (t.target as TextField).text;
    }
    

    【讨论】:

    • 这一变化根本不会改变我得到的回报。 TextField 的跟踪仍然是空白的。
    • 尽管开头有 stop();,但您的影片剪辑是否在持续循环播放?
    • 事实证明这是闪存文件本身的损坏。我复制到一个新文件,现在一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2020-06-24
    • 1970-01-01
    • 2019-09-06
    • 2023-01-28
    • 1970-01-01
    相关资源
    最近更新 更多