Actionscript:for..in 循环的输出在 Flash IDE 和在浏览器中显示之间变化

Actionscript: Output of for..in loop changes between Flash IDE and display in browser

我正在使用 GraphicElements 和 TextElements 在 AS3 中构建显示文本和图形组合的菜单。从 Flash IDE 发布时,菜单按预期显示(示例 1),但在浏览器(现阶段为 FF 和 IE)的 Flash 播放器中显示时,它们的内容以完全不同的顺序显示。 IDE 正在发布到 Flash player 25,但在 11.x 到 27.x

的 Flash player 版本中会出现内容排序错误

代码如下:

private function buildMenu(obj:Object,rev:Boolean):Object {
//trace ('here is the title: '+obj.title);          
var groupVector:Vector.<ContentElement> = new Vector.<ContentElement>(); 

for (var i in obj)
{
    if (obj[i] != null)
    {
        //trace ('as a string: '+String(i));
        switch(String(i))
        {
            case "icon" :
                //trace ('you found an icon: '+obj[i]); 
                var graphicElement:GraphicElement = new GraphicElement(obj[i],obj[i].width,obj[i].height/2,obj.tCol);
                groupVector.unshift(graphicElement);
                break;
            case "title" :
                //trace ('you found a title');
                var textElement:TextElement = new TextElement(obj.title, obj.tCol); 
                groupVector.push(textElement);
                break;
            case "data" :
                //trace ('you found data');
                for (var y in obj[i])
                {
                    var tmpitem = obj[i][y];
                    //trace ('typeof y: '+typeof(tmpitem));
                    if (tmpitem!= null)
                    {
                        if (typeof(tmpitem) == "object")
                        {
                            //trace ('y is a graphic: '+tmpitem+'......'+tmpitem.width);
                            var graphicElement:GraphicElement = new GraphicElement(tmpitem,tmpitem.width,tmpitem.height/2,obj.tCol);
                            groupVector.push(graphicElement);   
                        } else 
                        {
                            //trace ('y is text: '+tmpitem);
                            var textElement:TextElement = new TextElement(tmpitem, obj.dataCol); 
                            groupVector.push(textElement);
                        }                                           
                    }
                }
                break;

            default:
                break;          
        }
    }
}
if (rev) //turns the entry around to list from the right
{
    groupVector.reverse();
}

//working lines
var groupElement = new GroupElement(groupVector); 
var textBlock:TextBlock = new TextBlock();
textBlock.content = groupElement; 
var textLine:TextLine = textBlock.createTextLine(null, 400);
return textLine;
}

Here is the expected output (published within the Flash IDE):

And here is the same published swf displayed in a browser:

有人可以建议我做错了什么以及如何解决吗?

试试这个而不是你的外部 for in 循环。

if (obj.icon)
{
            //trace ('you found an icon: '+obj[i]); 
            var graphicElement:GraphicElement = new GraphicElement(obj[i],obj[i].width,obj[i].height/2,obj.tCol);
            groupVector.unshift(graphicElement);
}

if (obj.title)
{
            //trace ('you found a title');
            var textElement:TextElement = new TextElement(obj.title, obj.tCol); 
            groupVector.push(textElement);
}

if (obj.data)
{
            //trace ('you found data');
            for (var y in obj.data)
            {
                var tmpitem = obj.data[y];
                //trace ('typeof y: '+typeof(tmpitem));
                if (tmpitem!= null)
                {
                    if (typeof(tmpitem) == "object")
                    {
                        //trace ('y is a graphic: '+tmpitem+'......'+tmpitem.width);
                        var graphicElement:GraphicElement = new GraphicElement(tmpitem,tmpitem.width,tmpitem.height/2,obj.tCol);
                        groupVector.push(graphicElement);   
                    } else 
                    {
                        //trace ('y is text: '+tmpitem);
                        var textElement:TextElement = new TextElement(tmpitem, obj.dataCol); 
                        groupVector.push(textElement);
                    }                                           
                }
            }
}

至于您的内部 for in 循环,我们需要更多地了解 obj.data 是什么。是 object 吗?它有多少属性?如果需要以特定顺序读取其属性,则它应该是 Array 而不是 object。如果不是,您仍然可以使用 for each in 代替 for in.

来简化代码
            for each (var tmpitem in obj.data)
            {
                // No need for var tmpitem = obj.data[y];