[AS2组件]把使用组件的SWF加载到其他SWF中的问题
[问题描述]:a.swf文件中使用ComboBox组件做了下拉框,单独打开a.swf,下拉框正常,b.swf是个外框文件,现在要用b.swf把a.swf加载到b.swf里的一个MC里,结果a.swf中的下拉框不正常了,下拉框里的项是正常的,就是点击后打不开列表,经测试,ComboBox的open事件也触发了,但是就是不显示列表。
[探索]:查遍Flash帮助、Flash组件帮助也没找到答案。无奈,只好打开ComboBox.as文件,看代码,700多行代码可不好看。在打开组件源文件,把ComboBox的组件源MC拖到新文件t1.fla里,然后在ComboBox.as里查找open事件,会看到它调用的是displayDropdown函数,然后再找到这个函数定义的地方,一句句读,看到一句
AS Code
var dd = __dropdown;
,从字面意思猜,它就应该是那个下拉弹出框,所以在它后面添加一句
AS Code
trace("dd " + dd);
,重新导出t1.fla,看到了trace出的语句dd _level0.depthChild0,然后新建t2.fla,新建空元件load,把load拖到舞台上,使用load作为容器加载t1.swf,结果trace出来是dd null,显然问题就出在这里。
继续查找__dropdown,在函数getDropdown()里会看到一句
AS Code
__dropdown = PopUpManager.createPopUp(this, List, false, o, true);
,因此需要查找PopUpManager类。
打开PopUpManager.as文件,查找它的createPopUp方法,看到该方法里有一句
AS Code
var useFocusManager = (r.focusManager != undefined);
在它后面加上
AS Code
trace('useFocusManager '+ useFocusManager);
然后分别导出t1.fla,t2.fla,查看trace结果,发现,t1里输出的是true,t2里输出的是false.就此可以猜想是因为t2没有使用过focusManager类才造成这个结果。这样问题就好解决了
[解决方法]:最简单的方法是直接把一个ComboBox组件拖到t2.fla的库里导出就发现一切正常了。原因上面已经说了。

6月 15th, 2008 at 9:35 下午
嗯,我也遇到同样的情况,也是这样来解决,不过还发现一个问题,我上传后使用IE浏览时,会在类似B.swf中的舞台上自动出现一个combo框,刷新就自动消失了。更郁闷。。。。有何解决方法吗?
6月 16th, 2008 at 8:19 上午
试试focusManager.setFocus(null);