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];
我正在使用 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];